blob: 80b6b4e85af6553477fd7c5565e828f24bfe4199 [file] [log] [blame]
module axi_mem_if_DP_multi_bank
#(
parameter AXI4_ADDRESS_WIDTH = 32,
parameter AXI4_RDATA_WIDTH = 64,
parameter AXI4_WDATA_WIDTH = 64,
parameter AXI4_ID_WIDTH = 16,
parameter AXI4_USER_WIDTH = 10,
parameter AXI_NUMBYTES = AXI4_WDATA_WIDTH/8,
parameter MEM_ADDR_WIDTH = 13,
parameter BUFF_DEPTH_SLAVE = 4,
parameter NB_L2_BANKS = 4
)
(
ACLK,
ARESETn,
test_en_i,
LP_AWID_i,
LP_AWADDR_i,
LP_AWLEN_i,
LP_AWSIZE_i,
LP_AWBURST_i,
LP_AWLOCK_i,
LP_AWCACHE_i,
LP_AWPROT_i,
LP_AWREGION_i,
LP_AWUSER_i,
LP_AWQOS_i,
LP_AWVALID_i,
LP_AWREADY_o,
LP_WDATA_i,
LP_WSTRB_i,
LP_WLAST_i,
LP_WUSER_i,
LP_WVALID_i,
LP_WREADY_o,
LP_BID_o,
LP_BRESP_o,
LP_BVALID_o,
LP_BUSER_o,
LP_BREADY_i,
LP_ARID_i,
LP_ARADDR_i,
LP_ARLEN_i,
LP_ARSIZE_i,
LP_ARBURST_i,
LP_ARLOCK_i,
LP_ARCACHE_i,
LP_ARPROT_i,
LP_ARREGION_i,
LP_ARUSER_i,
LP_ARQOS_i,
LP_ARVALID_i,
LP_ARREADY_o,
LP_RID_o,
LP_RDATA_o,
LP_RRESP_o,
LP_RLAST_o,
LP_RUSER_o,
LP_RVALID_o,
LP_RREADY_i,
HP_cen_i,
HP_wen_i,
HP_addr_i,
HP_wdata_i,
HP_be_i,
HP_Q_o,
CEN,
WEN,
A,
D,
BE,
Q
);
//parameter AXI4_ADDRESS_WIDTH = 32;
//parameter AXI4_RDATA_WIDTH = 64;
//parameter AXI4_WDATA_WIDTH = 64;
//parameter AXI4_ID_WIDTH = 16;
//parameter AXI4_USER_WIDTH = 10;
//parameter AXI_NUMBYTES = AXI4_WDATA_WIDTH / 8;
//parameter MEM_ADDR_WIDTH = 13;
//parameter BUFF_DEPTH_SLAVE = 4;
//parameter NB_L2_BANKS = 4;
input wire ACLK;
input wire ARESETn;
input wire test_en_i;
input wire [AXI4_ID_WIDTH - 1:0] LP_AWID_i;
input wire [AXI4_ADDRESS_WIDTH - 1:0] LP_AWADDR_i;
input wire [7:0] LP_AWLEN_i;
input wire [2:0] LP_AWSIZE_i;
input wire [1:0] LP_AWBURST_i;
input wire LP_AWLOCK_i;
input wire [3:0] LP_AWCACHE_i;
input wire [2:0] LP_AWPROT_i;
input wire [3:0] LP_AWREGION_i;
input wire [AXI4_USER_WIDTH - 1:0] LP_AWUSER_i;
input wire [3:0] LP_AWQOS_i;
input wire LP_AWVALID_i;
output wire LP_AWREADY_o;
input wire [(AXI_NUMBYTES * 8) - 1:0] LP_WDATA_i;
input wire [AXI_NUMBYTES - 1:0] LP_WSTRB_i;
input wire LP_WLAST_i;
input wire [AXI4_USER_WIDTH - 1:0] LP_WUSER_i;
input wire LP_WVALID_i;
output wire LP_WREADY_o;
output wire [AXI4_ID_WIDTH - 1:0] LP_BID_o;
output wire [1:0] LP_BRESP_o;
output wire LP_BVALID_o;
output wire [AXI4_USER_WIDTH - 1:0] LP_BUSER_o;
input wire LP_BREADY_i;
input wire [AXI4_ID_WIDTH - 1:0] LP_ARID_i;
input wire [AXI4_ADDRESS_WIDTH - 1:0] LP_ARADDR_i;
input wire [7:0] LP_ARLEN_i;
input wire [2:0] LP_ARSIZE_i;
input wire [1:0] LP_ARBURST_i;
input wire LP_ARLOCK_i;
input wire [3:0] LP_ARCACHE_i;
input wire [2:0] LP_ARPROT_i;
input wire [3:0] LP_ARREGION_i;
input wire [AXI4_USER_WIDTH - 1:0] LP_ARUSER_i;
input wire [3:0] LP_ARQOS_i;
input wire LP_ARVALID_i;
output wire LP_ARREADY_o;
output wire [AXI4_ID_WIDTH - 1:0] LP_RID_o;
output wire [AXI4_RDATA_WIDTH - 1:0] LP_RDATA_o;
output wire [1:0] LP_RRESP_o;
output wire LP_RLAST_o;
output wire [AXI4_USER_WIDTH - 1:0] LP_RUSER_o;
output wire LP_RVALID_o;
input wire LP_RREADY_i;
input wire HP_cen_i;
input wire HP_wen_i;
input wire [(MEM_ADDR_WIDTH + $clog2(NB_L2_BANKS)) - 1:0] HP_addr_i;
input wire [AXI4_WDATA_WIDTH - 1:0] HP_wdata_i;
input wire [AXI_NUMBYTES - 1:0] HP_be_i;
output wire [AXI4_RDATA_WIDTH - 1:0] HP_Q_o;
output wire [NB_L2_BANKS - 1:0] CEN;
output wire [NB_L2_BANKS - 1:0] WEN;
output wire [(NB_L2_BANKS * MEM_ADDR_WIDTH) - 1:0] A;
output wire [(NB_L2_BANKS * AXI4_WDATA_WIDTH) - 1:0] D;
output wire [(NB_L2_BANKS * AXI_NUMBYTES) - 1:0] BE;
input wire [(NB_L2_BANKS * AXI4_RDATA_WIDTH) - 1:0] Q;
localparam OFFSET_BIT = $clog2(AXI4_WDATA_WIDTH) - 3;
wire [AXI4_ID_WIDTH - 1:0] LP_AWID;
wire [AXI4_ADDRESS_WIDTH - 1:0] LP_AWADDR;
wire [7:0] LP_AWLEN;
wire [2:0] LP_AWSIZE;
wire [1:0] LP_AWBURST;
wire LP_AWLOCK;
wire [3:0] LP_AWCACHE;
wire [2:0] LP_AWPROT;
wire [3:0] LP_AWREGION;
wire [AXI4_USER_WIDTH - 1:0] LP_AWUSER;
wire [3:0] LP_AWQOS;
wire LP_AWVALID;
wire LP_AWREADY;
wire [(AXI_NUMBYTES * 8) - 1:0] LP_WDATA;
wire [AXI_NUMBYTES - 1:0] LP_WSTRB;
wire LP_WLAST;
wire [AXI4_USER_WIDTH - 1:0] LP_WUSER;
wire LP_WVALID;
wire LP_WREADY;
wire [AXI4_ID_WIDTH - 1:0] LP_BID;
wire [1:0] LP_BRESP;
wire LP_BVALID;
wire [AXI4_USER_WIDTH - 1:0] LP_BUSER;
wire LP_BREADY;
wire [AXI4_ID_WIDTH - 1:0] LP_ARID;
wire [AXI4_ADDRESS_WIDTH - 1:0] LP_ARADDR;
wire [7:0] LP_ARLEN;
wire [2:0] LP_ARSIZE;
wire [1:0] LP_ARBURST;
wire LP_ARLOCK;
wire [3:0] LP_ARCACHE;
wire [2:0] LP_ARPROT;
wire [3:0] LP_ARREGION;
wire [AXI4_USER_WIDTH - 1:0] LP_ARUSER;
wire [3:0] LP_ARQOS;
wire LP_ARVALID;
wire LP_ARREADY;
wire [AXI4_ID_WIDTH - 1:0] LP_RID;
wire [AXI4_RDATA_WIDTH - 1:0] LP_RDATA;
wire [1:0] LP_RRESP;
wire LP_RLAST;
wire [AXI4_USER_WIDTH - 1:0] LP_RUSER;
wire LP_RVALID;
wire LP_RREADY;
wire valid_R_LP;
wire valid_W_LP;
wire grant_R_LP;
wire grant_W_LP;
wire RR_FLAG_LP;
wire LP_W_cen;
wire LP_R_cen;
wire LP_W_wen;
wire LP_R_wen;
wire [(MEM_ADDR_WIDTH + $clog2(NB_L2_BANKS)) - 1:0] LP_W_addr;
wire [(MEM_ADDR_WIDTH + $clog2(NB_L2_BANKS)) - 1:0] LP_R_addr;
wire [AXI4_WDATA_WIDTH - 1:0] LP_W_wdata;
wire [AXI4_WDATA_WIDTH - 1:0] LP_R_wdata;
wire [AXI_NUMBYTES - 1:0] LP_W_be;
wire [AXI_NUMBYTES - 1:0] LP_R_be;
wire [AXI4_WDATA_WIDTH - 1:0] LP_W_rdata;
wire [AXI4_WDATA_WIDTH - 1:0] LP_R_rdata;
wire [2:0] req_int;
wire [(3 * ((MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS))) - 1:0] add_int;
wire [2:0] wen_int;
wire [(3 * AXI4_WDATA_WIDTH) - 1:0] wdata_int;
wire [(3 * (AXI4_WDATA_WIDTH / 8)) - 1:0] be_int;
wire [2:0] gnt_int;
wire [(3 * AXI4_WDATA_WIDTH) - 1:0] r_rdata_int;
wire [2:0] r_valid_int;
wire [(NB_L2_BANKS * AXI4_WDATA_WIDTH) - 1:0] mem_wdata;
wire [(NB_L2_BANKS * MEM_ADDR_WIDTH) - 1:0] mem_add;
wire [NB_L2_BANKS - 1:0] mem_req;
wire [NB_L2_BANKS - 1:0] mem_wen;
wire [(NB_L2_BANKS * (AXI4_WDATA_WIDTH / 8)) - 1:0] mem_be;
wire [(NB_L2_BANKS * AXI4_WDATA_WIDTH) - 1:0] mem_rdata;
axi_aw_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.ADDR_WIDTH(AXI4_ADDRESS_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_aw_buffer_LP(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(LP_AWVALID_i),
.slave_addr_i(LP_AWADDR_i),
.slave_prot_i(LP_AWPROT_i),
.slave_region_i(LP_AWREGION_i),
.slave_len_i(LP_AWLEN_i),
.slave_size_i(LP_AWSIZE_i),
.slave_burst_i(LP_AWBURST_i),
.slave_lock_i(LP_AWLOCK_i),
.slave_cache_i(LP_AWCACHE_i),
.slave_qos_i(LP_AWQOS_i),
.slave_id_i(LP_AWID_i),
.slave_user_i(LP_AWUSER_i),
.slave_ready_o(LP_AWREADY_o),
.master_valid_o(LP_AWVALID),
.master_addr_o(LP_AWADDR),
.master_prot_o(LP_AWPROT),
.master_region_o(LP_AWREGION),
.master_len_o(LP_AWLEN),
.master_size_o(LP_AWSIZE),
.master_burst_o(LP_AWBURST),
.master_lock_o(LP_AWLOCK),
.master_cache_o(LP_AWCACHE),
.master_qos_o(LP_AWQOS),
.master_id_o(LP_AWID),
.master_user_o(LP_AWUSER),
.master_ready_i(LP_AWREADY)
);
axi_ar_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.ADDR_WIDTH(AXI4_ADDRESS_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_ar_buffer_LP(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(LP_ARVALID_i),
.slave_addr_i(LP_ARADDR_i),
.slave_prot_i(LP_ARPROT_i),
.slave_region_i(LP_ARREGION_i),
.slave_len_i(LP_ARLEN_i),
.slave_size_i(LP_ARSIZE_i),
.slave_burst_i(LP_ARBURST_i),
.slave_lock_i(LP_ARLOCK_i),
.slave_cache_i(LP_ARCACHE_i),
.slave_qos_i(LP_ARQOS_i),
.slave_id_i(LP_ARID_i),
.slave_user_i(LP_ARUSER_i),
.slave_ready_o(LP_ARREADY_o),
.master_valid_o(LP_ARVALID),
.master_addr_o(LP_ARADDR),
.master_prot_o(LP_ARPROT),
.master_region_o(LP_ARREGION),
.master_len_o(LP_ARLEN),
.master_size_o(LP_ARSIZE),
.master_burst_o(LP_ARBURST),
.master_lock_o(LP_ARLOCK),
.master_cache_o(LP_ARCACHE),
.master_qos_o(LP_ARQOS),
.master_id_o(LP_ARID),
.master_user_o(LP_ARUSER),
.master_ready_i(LP_ARREADY)
);
axi_w_buffer #(
.DATA_WIDTH(AXI4_WDATA_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_w_buffer_LP(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(LP_WVALID_i),
.slave_data_i(LP_WDATA_i),
.slave_strb_i(LP_WSTRB_i),
.slave_user_i(LP_WUSER_i),
.slave_last_i(LP_WLAST_i),
.slave_ready_o(LP_WREADY_o),
.master_valid_o(LP_WVALID),
.master_data_o(LP_WDATA),
.master_strb_o(LP_WSTRB),
.master_user_o(LP_WUSER),
.master_last_o(LP_WLAST),
.master_ready_i(LP_WREADY)
);
axi_r_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.DATA_WIDTH(AXI4_RDATA_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_r_buffer_LP(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(LP_RVALID),
.slave_data_i(LP_RDATA),
.slave_resp_i(LP_RRESP),
.slave_user_i(LP_RUSER),
.slave_id_i(LP_RID),
.slave_last_i(LP_RLAST),
.slave_ready_o(LP_RREADY),
.master_valid_o(LP_RVALID_o),
.master_data_o(LP_RDATA_o),
.master_resp_o(LP_RRESP_o),
.master_user_o(LP_RUSER_o),
.master_id_o(LP_RID_o),
.master_last_o(LP_RLAST_o),
.master_ready_i(LP_RREADY_i)
);
axi_b_buffer #(
.ID_WIDTH(AXI4_ID_WIDTH),
.USER_WIDTH(AXI4_USER_WIDTH),
.BUFFER_DEPTH(BUFF_DEPTH_SLAVE)
) Slave_b_buffer_LP(
.clk_i(ACLK),
.rst_ni(ARESETn),
.test_en_i(test_en_i),
.slave_valid_i(LP_BVALID),
.slave_resp_i(LP_BRESP),
.slave_id_i(LP_BID),
.slave_user_i(LP_BUSER),
.slave_ready_o(LP_BREADY),
.master_valid_o(LP_BVALID_o),
.master_resp_o(LP_BRESP_o),
.master_id_o(LP_BID_o),
.master_user_o(LP_BUSER_o),
.master_ready_i(LP_BREADY_i)
);
axi_write_only_ctrl #(
.AXI4_ADDRESS_WIDTH(AXI4_ADDRESS_WIDTH),
.AXI4_RDATA_WIDTH(AXI4_RDATA_WIDTH),
.AXI4_WDATA_WIDTH(AXI4_WDATA_WIDTH),
.AXI4_ID_WIDTH(AXI4_ID_WIDTH),
.AXI4_USER_WIDTH(AXI4_USER_WIDTH),
.AXI_NUMBYTES(AXI_NUMBYTES),
.MEM_ADDR_WIDTH(MEM_ADDR_WIDTH + $clog2(NB_L2_BANKS))
) W_CTRL_LP(
.clk(ACLK),
.rst_n(ARESETn),
.AWID_i(LP_AWID),
.AWADDR_i(LP_AWADDR),
.AWLEN_i(LP_AWLEN),
.AWSIZE_i(LP_AWSIZE),
.AWBURST_i(LP_AWBURST),
.AWLOCK_i(LP_AWLOCK),
.AWCACHE_i(LP_AWCACHE),
.AWPROT_i(LP_AWPROT),
.AWREGION_i(LP_AWREGION),
.AWUSER_i(LP_AWUSER),
.AWQOS_i(LP_AWQOS),
.AWVALID_i(LP_AWVALID),
.AWREADY_o(LP_AWREADY),
.WDATA_i(LP_WDATA),
.WSTRB_i(LP_WSTRB),
.WLAST_i(LP_WLAST),
.WUSER_i(LP_WUSER),
.WVALID_i(LP_WVALID),
.WREADY_o(LP_WREADY),
.BID_o(LP_BID),
.BRESP_o(LP_BRESP),
.BVALID_o(LP_BVALID),
.BUSER_o(LP_BUSER),
.BREADY_i(LP_BREADY),
.MEM_CEN_o(LP_W_cen),
.MEM_WEN_o(LP_W_wen),
.MEM_A_o(LP_W_addr),
.MEM_D_o(LP_W_wdata),
.MEM_BE_o(LP_W_be),
.MEM_Q_i(1'sb0),
.grant_i(grant_W_LP),
.valid_o(valid_W_LP)
);
axi_read_only_ctrl #(
.AXI4_ADDRESS_WIDTH(AXI4_ADDRESS_WIDTH),
.AXI4_RDATA_WIDTH(AXI4_RDATA_WIDTH),
.AXI4_WDATA_WIDTH(AXI4_WDATA_WIDTH),
.AXI4_ID_WIDTH(AXI4_ID_WIDTH),
.AXI4_USER_WIDTH(AXI4_USER_WIDTH),
.AXI_NUMBYTES(AXI_NUMBYTES),
.MEM_ADDR_WIDTH(MEM_ADDR_WIDTH + $clog2(NB_L2_BANKS))
) R_CTRL_LP(
.clk(ACLK),
.rst_n(ARESETn),
.ARID_i(LP_ARID),
.ARADDR_i(LP_ARADDR),
.ARLEN_i(LP_ARLEN),
.ARSIZE_i(LP_ARSIZE),
.ARBURST_i(LP_ARBURST),
.ARLOCK_i(LP_ARLOCK),
.ARCACHE_i(LP_ARCACHE),
.ARPROT_i(LP_ARPROT),
.ARREGION_i(LP_ARREGION),
.ARUSER_i(LP_ARUSER),
.ARQOS_i(LP_ARQOS),
.ARVALID_i(LP_ARVALID),
.ARREADY_o(LP_ARREADY),
.RID_o(LP_RID),
.RDATA_o(LP_RDATA),
.RRESP_o(LP_RRESP),
.RLAST_o(LP_RLAST),
.RUSER_o(LP_RUSER),
.RVALID_o(LP_RVALID),
.RREADY_i(LP_RREADY),
.MEM_CEN_o(LP_R_cen),
.MEM_WEN_o(LP_R_wen),
.MEM_A_o(LP_R_addr),
.MEM_D_o(),
.MEM_BE_o(),
.MEM_Q_i(LP_R_rdata),
.grant_i(grant_R_LP),
.valid_o(valid_R_LP)
);
assign req_int = {~HP_cen_i, valid_R_LP, valid_W_LP};
assign {grant_R_LP, grant_W_LP} = gnt_int[1:0];
assign add_int[0+:(MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS)] = {LP_W_addr, 3'b000};
assign add_int[(MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS)+:(MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS)] = {LP_R_addr, 3'b000};
assign add_int[2 * ((MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS))+:(MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS)] = {HP_addr_i, 3'b000};
assign wen_int = {HP_wen_i, 1'b1, 1'b0};
assign wdata_int = {HP_wdata_i, {AXI4_WDATA_WIDTH {1'b0}}, LP_W_wdata};
assign be_int = {HP_be_i, {AXI4_WDATA_WIDTH / 8 {1'b0}}, LP_W_be};
assign {HP_Q_o, LP_R_rdata, LP_W_rdata} = r_rdata_int;
XBAR_TCDM_FC #(
.N_CH0(2),
.N_CH1(1),
.N_SLAVE(NB_L2_BANKS),
.ADDR_WIDTH((MEM_ADDR_WIDTH + 3) + $clog2(NB_L2_BANKS)),
.DATA_WIDTH(AXI4_WDATA_WIDTH),
.ADDR_MEM_WIDTH(MEM_ADDR_WIDTH),
.CH0_CH1_POLICY("FIX_PRIO"),
.PRIO_CH(1)
) L2_MB_INTERCO(
.data_req_i(req_int),
.data_add_i(add_int),
.data_wen_i(wen_int),
.data_wdata_i(wdata_int),
.data_be_i(be_int),
.data_gnt_o(gnt_int),
.data_r_valid_o(r_valid_int),
.data_r_rdata_o(r_rdata_int),
.data_req_o(mem_req),
.data_add_o(mem_add),
.data_wen_o(mem_wen),
.data_wdata_o(mem_wdata),
.data_be_o(mem_be),
.data_r_rdata_i(mem_rdata),
.clk(ACLK),
.rst_n(ARESETn)
);
assign CEN = ~mem_req;
assign WEN = mem_wen;
assign A = mem_add;
assign D = mem_wdata;
assign BE = mem_be;
assign mem_rdata = Q;
endmodule