`include "e203_defines.v"
module e203_appi (
input wire clk,
input wire rst_n,
input wire appi_icb_cmd_valid,
output wire appi_icb_cmd_ready,
input wire[`E203_ADDR_SIZE-1:0]appi_icb_cmd_addr,
input wire appi_icb_cmd_read,
input wire[`E203_XLEN-1:0]appi_icb_cmd_wdata,
input wire[`E203_XLEN/8-1:0]appi_icb_cmd_wmask,//可选信号
output reg appi_icb_rsp_valid,
input wire appi_icb_rsp_ready,
output wire appi_icb_rsp_err,
output reg [`E203_XLEN-1:0]appi_icb_rsp_rdata
////
);
//registers
reg [31:0] REG0;//a=0x00
reg [31:0] REG1;//04
reg [31:0] REG2;//08
wire [7:0] offset;
assign offset=appi_icb_cmd_addr[7:0];
//总线交互
//握手
wire cfg_icb_cmd_hsked=appi_icb_cmd_valid & appi_icb_cmd_ready;
//appi_icb_cmd_ready
assign appi_icb_cmd_ready=(appi_icb_cmd_valid & ~appi_icb_cmd_read) | (appi_icb_cmd_valid & appi_icb_cmd_read & ~appi_icb_rsp_valid);
//appi_icb_rsp_err
assign appi_icb_rsp_err=1'b0;
//appi_icb_rsp_valid
always @(posedge clk or negedge rst_n)
if (~rst_n)
appi_icb_rsp_valid<=1'b0;
else begin
if (cfg_icb_cmd_hsked)
appi_icb_rsp_valid<=1'b1;
else if ((appi_icb_rsp_valid)&&(appi_icb_rsp_ready))
appi_icb_rsp_valid<=1'b0;
else
appi_icb_rsp_valid<=appi_icb_rsp_valid;
end
//r
always @(posedge clk or negedge rst_n)
if (~rst_n)
appi_icb_rsp_rdata<=32'b0;
else begin
if (appi_icb_rsp_valid)
appi_icb_rsp_rdata<=appi_icb_rsp_rdata;
else
if ((cfg_icb_cmd_hsked)&&(appi_icb_cmd_read))
case (offset)
8'h00: appi_icb_rsp_rdata<=REG0;
8'h04: appi_icb_rsp_rdata<=REG1;
8'h08: appi_icb_rsp_rdata<=REG2;
default: appi_icb_rsp_rdata<=32'b0;
endcase
else
appi_icb_rsp_rdata<=32'b0;
end
//w
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
REG0<=0;
REG1<=0;
REG2<=0;
end
else begin
if((cfg_icb_cmd_hsked)&&(~appi_icb_cmd_read)) begin
case (offset)
8'h00:REG0<=appi_icb_cmd_wdata;
8'h04:REG1<=appi_icb_cmd_wdata;
8'h08:REG2<=appi_icb_cmd_wdata;
default :;
endcase
end
else begin
//????
end
end
endmodule