blob: a623ee56727a43dfa11094addc1d310e9e5de717 [file] [log] [blame]
module axi_mem_if_DP_hybr
#(
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
)
(
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;
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 - 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 reg CEN;
output reg WEN;
output reg [MEM_ADDR_WIDTH - 1:0] A;
output reg [AXI4_WDATA_WIDTH - 1:0] D;
output reg [AXI_NUMBYTES - 1:0] BE;
input wire [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;
reg grant_R_LP;
reg grant_W_LP;
reg RR_FLAG_LP;
reg main_grant_LP;
wire LP_W_cen;
wire LP_R_cen;
reg LP_cen;
wire LP_W_wen;
wire LP_R_wen;
reg LP_wen;
wire [MEM_ADDR_WIDTH - 1:0] LP_W_addr;
wire [MEM_ADDR_WIDTH - 1:0] LP_R_addr;
reg [MEM_ADDR_WIDTH - 1:0] LP_addr;
wire [AXI4_WDATA_WIDTH - 1:0] LP_W_wdata;
wire [AXI4_WDATA_WIDTH - 1:0] LP_R_wdata;
wire [AXI4_WDATA_WIDTH - 1:0] LP_wdata;
wire [AXI_NUMBYTES - 1:0] LP_W_be;
wire [AXI_NUMBYTES - 1:0] LP_R_be;
wire [AXI_NUMBYTES - 1:0] LP_be;
wire [AXI_NUMBYTES - 1:0] LP_W_rdata;
wire [AXI_NUMBYTES - 1:0] LP_R_rdata;
wire [AXI_NUMBYTES - 1:0] LP_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)
) 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 & HP_cen_i),
.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)
) 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(Q),
.grant_i(grant_R_LP & HP_cen_i),
.valid_o(valid_R_LP)
);
assign LP_wdata = LP_W_wdata;
assign LP_be = LP_W_be;
always @(*) begin : _MUX_MEM_
if (HP_cen_i == 1'b0) begin
CEN = HP_cen_i;
WEN = HP_wen_i;
A = HP_addr_i;
D = HP_wdata_i;
BE = HP_be_i;
end
else begin
if (grant_R_LP) begin
LP_cen = LP_R_cen;
LP_wen = 1'b1;
LP_addr = LP_R_addr;
end
else begin
LP_cen = LP_W_cen;
LP_wen = ~grant_W_LP;
LP_addr = LP_W_addr;
end
CEN = LP_cen;
WEN = LP_wen;
A = LP_addr;
D = LP_W_wdata;
BE = LP_W_be;
end
end
always @(posedge ACLK or negedge ARESETn)
if (~ARESETn)
RR_FLAG_LP <= 0;
else
RR_FLAG_LP <= ~RR_FLAG_LP;
always @(*) begin
grant_R_LP = 1'b0;
grant_W_LP = 1'b0;
case (RR_FLAG_LP)
1'b0:
if (valid_W_LP)
grant_W_LP = 1'b1;
else
grant_R_LP = 1'b1;
1'b1:
if (valid_R_LP)
grant_R_LP = 1'b1;
else
grant_W_LP = 1'b1;
endcase
end
always @(*) begin
main_grant_LP = 1'b0;
if (HP_cen_i == 1'b1)
main_grant_LP = 1'b1;
end
assign HP_Q_o = Q;
endmodule