Added axi to tlul translater for ISPYocto
Change-Id: I9e9ac139f0e13e821c198cf482eaf86c0e2c9e84
diff --git a/axi2sramcrs/rtl/axi2axilite/axi2axilite.v b/axi2sramcrs/rtl/axi2axilite/axi2axilite.v
new file mode 100644
index 0000000..68e4946
--- /dev/null
+++ b/axi2sramcrs/rtl/axi2axilite/axi2axilite.v
@@ -0,0 +1,556 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi2axilite
+ #(
+ //id width
+ parameter ARID_WIDTH=4,
+ parameter AWID_WIDTH=4,
+ //addr width
+ parameter ADDR_WIDTH=32,
+ //user width
+ parameter USER_WIDTH=4 )
+
+ (
+ input aclk,
+ input aresetn,
+ //===========================================
+ //==slave port
+ //===========================================
+
+ input [AWID_WIDTH-1:0] awid_s,
+ input [ADDR_WIDTH-1:0] awaddr_s,
+ input [7:0] awlen_s,
+ input [2:0] awsize_s,
+ input [1:0] awburst_s,
+ input [1:0] awlock_s,
+ input [3:0] awcache_s,
+ input [2:0] awprot_s,
+ input awvalid_s,
+ output reg awready_s,
+ input [USER_WIDTH-1:0] awuser_s,
+ input [3:0] awregion_s,
+
+ input [AWID_WIDTH-1:0] wid_s,
+ input [255:0] wdata_s,
+ input [31:0] wstrb_s,
+ input wlast_s,
+ input wvalid_s,
+ output wready_s,
+ input [USER_WIDTH-1:0] wuser_s,
+
+
+ output reg [AWID_WIDTH-1:0] bid_s,
+ output reg [1:0] bresp_s,
+ output reg bvalid_s,
+ input bready_s,
+ output reg [USER_WIDTH-1:0] buser_s,
+
+
+ input [ARID_WIDTH-1:0] arid_s,
+ input [ADDR_WIDTH-1:0] araddr_s,
+ input [7:0] arlen_s,
+ input [2:0] arsize_s,
+ input [1:0] arburst_s,
+ input [1:0] arlock_s,
+ input [3:0] arcache_s,
+ input [2:0] arprot_s,
+ input arvalid_s,
+ output reg arready_s,
+ input [USER_WIDTH-1:0] aruser_s,
+ input [3:0] arregion_s,
+
+
+ output reg [ARID_WIDTH-1:0] rid_s,
+ output [31:0] rdata_s,
+ output [1:0] rresp_s,
+ output reg rlast_s,
+ output rvalid_s,
+ input rready_s,
+ output reg [USER_WIDTH-1:0] ruser_s,
+
+
+ input [3:0] awqos_s,
+ input [3:0] arqos_s,
+
+ //===========================================
+ //==master port
+ //===========================================
+ output reg awvalid_m,
+ input awready_m,
+ output reg [ADDR_WIDTH-1:0] awaddr_m,
+ output reg [2:0] awprot_m,
+ output reg [USER_WIDTH-1:0] awuser_m,
+
+ output wvalid_m,
+ input wready_m,
+ output [255:0] wdata_m,
+ output [31:0] wstrb_m,
+
+ input bvalid_m,
+ output bready_m,
+ input [1:0] bresp_m,
+
+ output reg arvalid_m,
+ input arready_m,
+ output reg [ADDR_WIDTH-1:0] araddr_m,
+ output reg [2:0] arprot_m,
+ output reg [USER_WIDTH-1:0] aruser_m,
+
+ input rvalid_m,
+ output rready_m,
+ input [31:0] rdata_m,
+ input [1:0] rresp_m
+ );
+
+localparam R_SLICE_TYPE_S=2'h0;
+localparam W_SLICE_TYPE_S=2'h0;
+localparam R_DATA_WIDTH_S=(32+2);
+localparam W_DATA_WIDTH_S=(256+32);
+
+//===========================================
+//==wire and reg declaration
+//===========================================
+
+wire [W_DATA_WIDTH_S-1:0] src_data_w_sm , dst_data_w_sm;
+wire [R_DATA_WIDTH_S-1:0] src_data_r_ms , dst_data_r_ms;
+wire wready_s_l,rvalid_s_l;
+wire [1:0] rresp_s_l;
+wire [31:0] rdata_s_l;
+wire illegal_w,illegal_r;
+reg illegal_wr,illegal_rr;
+reg [7:0] awlen_s_r,arlen_s_r,awaddr_cnt,araddr_cnt,bresp_cnt,rdata_cnt;
+reg [1:0] awburst_s_r,arburst_s_r;
+reg now_in_wr;
+reg [1:0] bresp_m_r;
+
+//===========================================
+// --------------------------------------------------------------------
+// invalid cmd from SI will be block:
+// 1. data_width != 256
+//non-bufferable not merge
+//assign illegal_w = ((awsize_s != 3'b101)&&awvalid_s&&awready_s)?1'b1:1'b0;
+assign illegal_w = 1'b0;
+assign illegal_r = ((arsize_s != 3'b101)&&arvalid_s&&arready_s)?1'b1:1'b0;
+
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ illegal_wr <= 1'b0;
+ else if(wlast_s&&wvalid_s&&wready_s)
+ illegal_wr <= 1'b0;
+ else if(illegal_w)
+ illegal_wr <= 1'b1;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ illegal_rr <= 1'b0;
+ else if(rlast_s&&rvalid_s&&rready_s)
+ illegal_rr <= 1'b0;
+ else if(illegal_r)
+ illegal_rr <= 1'b1;
+ end
+
+assign wready_s = illegal_wr || (wready_s_l&&now_in_wr) ; //always wready_s when illegal
+assign rvalid_s = illegal_rr || rvalid_s_l ; //always vvalid_s when illegal
+assign rresp_s = illegal_rr ? 2'b10 : rresp_s_l ; //ERROR when illegal wr
+assign rdata_s = illegal_rr ? 32'h0 : rdata_s_l ; //read data all-0 when illegal rd
+
+
+//===========================================
+// aw channel
+//===========================================
+
+//axi-port
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awready_s <= 1'b1;
+ else if(bvalid_s&&bready_s)
+ awready_s <= 1'b1;
+ else if(awvalid_s&&awready_s)
+ awready_s <= 1'b0;
+ end
+
+//axilite-port
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awvalid_m <= 1'b0;
+ else if(awvalid_s&&awready_s&&(~illegal_w))
+ awvalid_m <= 1'b1;
+ else if(awvalid_m&&awready_m&&((awaddr_cnt==awlen_s_r)))
+ awvalid_m <= 1'b0;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awaddr_m <= {ADDR_WIDTH{1'b0}};
+ else if(awvalid_s&&awready_s&&(~illegal_w))
+ awaddr_m <= {awaddr_s[ADDR_WIDTH-1:5],5'b00};//address not change in 32B
+ else if(awvalid_m&&awready_m&&(awaddr_cnt!=awlen_s_r))
+ begin
+ if(awburst_s_r==2'b01)//INCR: Updated
+ awaddr_m <= awaddr_m + {{(ADDR_WIDTH-4){1'b0}},4'd8};
+ else if(awburst_s_r == 2'b10)//WRAP: dont touched
+ begin
+ if(awlen_s_r[7])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:10],(awaddr_m[9:0] + 10'h4)};
+ else if(awlen_s_r[6])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:9],(awaddr_m[8:0] + 9'h4)};
+ else if(awlen_s_r[5])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:8],(awaddr_m[7:0] + 8'h4)};
+ else if(awlen_s_r[4])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:7],(awaddr_m[6:0] + 7'h4)};
+ else if(awlen_s_r[3])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:6],(awaddr_m[5:0] + 6'h4)};
+ else if(awlen_s_r[2])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:5],(awaddr_m[4:0] + 5'h4)};
+ else if(awlen_s_r[1])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:4],(awaddr_m[3:0] + 4'h4)};
+ else if(awlen_s_r[0])
+ awaddr_m <= {awaddr_m[ADDR_WIDTH-1:3],(awaddr_m[2:0] + 3'h4)};
+ end
+ end
+ end
+
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ begin
+ awprot_m <= 3'h0;
+ awuser_m <= {USER_WIDTH{1'b0}};
+ end
+ else if(awvalid_s&&awready_s)
+ begin
+ awprot_m <= awprot_s;
+ awuser_m <= awuser_s;
+ end
+ end
+
+//local signal
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awaddr_cnt <= 8'h0;
+ else if(awvalid_s&&awready_s)
+ awaddr_cnt <= 8'h0;
+ else if(awvalid_m&&awready_m&&(awaddr_cnt!=awlen_s_r))
+ awaddr_cnt <= awaddr_cnt + 8'h1;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ begin
+ awlen_s_r <= 8'h0;
+ awburst_s_r <= 2'h0;
+ end
+ else if(awvalid_s&&awready_s)
+ begin
+ awlen_s_r <= awlen_s;
+ awburst_s_r <= awburst_s;
+ end
+ end
+
+
+
+//===========================================
+// wdata channel
+//===========================================
+
+assign src_data_w_sm={
+wstrb_s,
+wdata_s
+};
+assign {
+wstrb_m,
+wdata_m
+}=dst_data_w_sm;
+axi_slice #(
+ .HNDSHK_MODE(W_SLICE_TYPE_S),
+ .PAYLD_WIDTH(W_DATA_WIDTH_S))
+ u_axi_w_sm(
+ // Outputs
+ .dst_data (dst_data_w_sm), // Templated
+ .src_ready (wready_s_l), // Templated
+ .dst_valid (wvalid_m), // Templated
+ // Inputs
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .src_data (src_data_w_sm), // Templated
+ .src_valid (wvalid_s&&(~illegal_wr)&&now_in_wr), // Templated
+ .dst_ready (wready_m)); // Templated
+
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ now_in_wr <= 1'b0;
+ else if(wlast_s&&wvalid_s&&wready_s)
+ now_in_wr <= 1'b0;
+ else if(awvalid_s&&awready_s)
+ now_in_wr <= 1'b1;
+ end
+
+//===========================================
+//b channel
+//===========================================
+
+//axi-port
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bresp_s <= 2'h0;
+ else if(bvalid_s&&bready_s)
+ bresp_s <= 2'h0;
+ else if((bresp_cnt == awlen_s_r)&&illegal_wr&&wvalid_s&&wready_s)
+ bresp_s <= 2'b10;
+ else if((bresp_cnt == awlen_s_r)&&bvalid_m&&bready_m)
+ begin
+ if(bresp_m_r != 2'h0)
+ bresp_s <= bresp_m_r;
+ else
+ bresp_s <= bresp_m;
+ end
+ end
+
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bresp_m_r <= 2'h0;
+ else if(bvalid_s&&bready_s)
+ bresp_m_r <= 2'h0;
+ else if((bresp_m_r == 2'h0)&&(bresp_m != 2'h0)&&bvalid_m&&bready_m)//store 1st ERROR
+ bresp_m_r <= bresp_m;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bvalid_s <= 1'b0;
+ else if(bvalid_s&&bready_s)
+ bvalid_s <= 1'b0;
+ else if(wlast_s&&wvalid_s&&wready_s&&illegal_wr)//illegal bresp
+ bvalid_s <= 1'b1;
+ else if((bresp_cnt == awlen_s_r)&&bvalid_m&&bready_m)
+ bvalid_s <= 1'b1;
+ end
+
+always @(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bid_s <= {ARID_WIDTH{1'b0}};
+ else if(awvalid_s&&awready_s)
+ bid_s <= awid_s;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ buser_s <= {USER_WIDTH{1'b0}};
+ else if(awvalid_s&&awready_s)
+ buser_s <= awuser_s;
+ end
+
+//axilite-port
+assign bready_m = 1'b1;
+
+//local signals
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bresp_cnt <= 8'h0;
+ else if(bvalid_s&&bready_s)
+ bresp_cnt <= 8'h0;
+ else if(illegal_wr&&wvalid_s&&wready_s)
+ bresp_cnt <= bresp_cnt + 8'h1;
+ else if(bvalid_m&&bready_m)
+ bresp_cnt <= bresp_cnt + 8'h1;
+ end
+
+//===========================================
+// ar channel
+//===========================================
+
+//axi-port
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ arready_s <= 1'b1;
+ else if(rvalid_s&&rready_s&&rlast_s)
+ arready_s <= 1'b1;
+ else if(arvalid_s&&arready_s)
+ arready_s <= 1'b0;
+ end
+
+//axilite-port
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ arvalid_m <= 1'b0;
+ else if(arvalid_s&&arready_s&&(~illegal_r))
+ arvalid_m <= 1'b1;
+ else if(arvalid_m&&arready_m&&((araddr_cnt==arlen_s_r)))
+ arvalid_m <= 1'b0;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ araddr_m <= {ADDR_WIDTH{1'b0}};
+ else if(arvalid_s&&arready_s&&(~illegal_r))
+ araddr_m <= {araddr_s[ADDR_WIDTH-1:2],2'b00}; //if unalign
+ else if(arvalid_m&&arready_m&&(araddr_cnt!=arlen_s_r))
+ begin
+ if(arburst_s_r==2'b01)//INCR
+ araddr_m <= araddr_m + {{(ADDR_WIDTH-3){1'b0}},3'h4};
+ else if(arburst_s_r == 2'b10)//WRAP
+ begin
+ if(arlen_s_r[7])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:10],(araddr_m[9:0] + 10'h4)};
+ else if(arlen_s_r[6])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:9],(araddr_m[8:0] + 9'h4)};
+ else if(arlen_s_r[5])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:8],(araddr_m[7:0] + 8'h4)};
+ else if(arlen_s_r[4])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:7],(araddr_m[6:0] + 7'h4)};
+ else if(arlen_s_r[3])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:6],(araddr_m[5:0] + 6'h4)};
+ else if(arlen_s_r[2])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:5],(araddr_m[4:0] + 5'h4)};
+ else if(arlen_s_r[1])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:4],(araddr_m[3:0] + 4'h4)};
+ else if(arlen_s_r[0])
+ araddr_m <= {araddr_m[ADDR_WIDTH-1:3],(araddr_m[2:0] + 3'h4)};
+ end
+ end
+ end
+
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ begin
+ arprot_m <= 3'h0;
+ aruser_m <= {USER_WIDTH{1'b0}};
+ end
+ else if(arvalid_s&&arready_s&&(~illegal_r))
+ begin
+ arprot_m <= arprot_s;
+ aruser_m <= aruser_s;
+ end
+ end
+
+//local signals
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ begin
+ araddr_cnt <= 8'h0;
+ arlen_s_r <= 8'h0;
+ arburst_s_r <= 2'h0;
+ end
+ else if(arvalid_s&&arready_s)
+ begin
+ araddr_cnt <= 8'h0;
+ arlen_s_r <= arlen_s;
+ arburst_s_r <= arburst_s;
+ end
+ else if(arvalid_m&&arready_m&&(araddr_cnt!=arlen_s_r))
+ araddr_cnt <= araddr_cnt + 8'h1;
+ end
+
+
+//===========================================
+// rdata channel
+//===========================================
+
+assign src_data_r_ms={
+rresp_m,
+rdata_m
+};
+assign {
+rresp_s_l,
+rdata_s_l
+}=dst_data_r_ms;
+axi_slice #(
+ .HNDSHK_MODE(R_SLICE_TYPE_S),
+ .PAYLD_WIDTH(R_DATA_WIDTH_S))
+ u_axi_r_ms(
+ // Outputs
+ .dst_data (dst_data_r_ms), // Templated
+ .src_ready (rready_m), // Templated
+ .dst_valid (rvalid_s_l), // Templated
+ // Inputs
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .src_data (src_data_r_ms), // Templated
+ .src_valid (rvalid_m), // Templated
+ .dst_ready (rready_s)); // Templated
+
+//axi-port
+always @(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ begin
+ rid_s <= {ARID_WIDTH{1'b0}};
+ ruser_s <= {USER_WIDTH{1'b0}};
+ end
+ else if(arvalid_s&&arready_s)
+ begin
+ rid_s <= arid_s;
+ ruser_s <= aruser_s;
+ end
+ end
+
+
+//local signals
+always @(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ rdata_cnt <= 8'h0;
+ else if(rlast_s)
+ rdata_cnt <= 8'h0;
+ else if(rvalid_s&&rready_s)
+ rdata_cnt <= rdata_cnt + 8'h1;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ rlast_s <= 1'b0;
+ else if(rlast_s&&rvalid_s&&rready_s)
+ rlast_s <= 1'b0;
+ else if((arlen_s == 8'h0)&&arvalid_s&&arready_s)
+ rlast_s <= 1'b1;
+ else if((rdata_cnt == (arlen_s_r - 8'h1))&&rvalid_s&&rready_s)
+ rlast_s <= 1'b1;
+ end
+
+endmodule
diff --git a/axi2sramcrs/rtl/axi2sramcrs.v b/axi2sramcrs/rtl/axi2sramcrs.v
new file mode 100644
index 0000000..216c01a
--- /dev/null
+++ b/axi2sramcrs/rtl/axi2sramcrs.v
@@ -0,0 +1,347 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi2sramcrs #(
+ parameter ARID_WIDTH=4,
+ parameter AWID_WIDTH=4,
+ parameter ADDR_WIDTH=32,
+ parameter US_DATA_WIDTH=64,
+ parameter DS_DATA_WIDTH=256,
+ parameter USER_WIDTH=16,
+ parameter IS_AXI3=1'h1,
+ parameter AXLEN_WIDTH=(IS_AXI3==1'h1) ? 4 : 8,
+ parameter RD_ISS=128,
+ parameter WR_ISS=128,
+ parameter DS_WSTRB_WIDTH=DS_DATA_WIDTH/8,
+ parameter US_WSTRB_WIDTH=US_DATA_WIDTH/8)
+(
+ input aclk,
+ input aresetn,
+
+ input [AWID_WIDTH-1:0] awid_s,
+ input [ADDR_WIDTH-1:0] awaddr_s,
+ input [AXLEN_WIDTH-1:0] awlen_s,
+ input [2:0] awsize_s,
+ input [1:0] awburst_s,
+ input [1:0] awlock_s,
+ input [3:0] awcache_s,
+ input [2:0] awprot_s,
+ input awvalid_s,
+ output awready_s,
+ input [USER_WIDTH-1:0] awuser_s,
+ input [3:0] awregion_s,
+ input [US_DATA_WIDTH-1:0] wdata_s,
+ input [US_WSTRB_WIDTH-1:0] wstrb_s,
+ input wlast_s,
+ input wvalid_s,
+ output wready_s,
+ input [AWID_WIDTH-1:0] wid_s,
+ input [USER_WIDTH-1:0] wuser_s,
+ output [AWID_WIDTH-1:0] bid_s,
+ output [1:0] bresp_s,
+ output bvalid_s,
+ input bready_s,
+ output [USER_WIDTH-1:0] buser_s,
+ input [3:0] awqos_s,
+
+ output sram_cvalid,
+ input sram_cready,
+ output sram_cwrite,
+ output [31:0] sram_caddr,
+ output [7:0] sram_cid,
+ output [255:0] sram_wdata,
+ output [31:0] sram_wmask
+);
+
+localparam DS_AXI3=IS_AXI3;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH;
+localparam W_IDB_WIDTH=AWID_WIDTH+USER_WIDTH+DS_DATA_WIDTH+DS_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+DS_DATA_WIDTH+2+1;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+
+
+//Interface between upsizer and axi2axilite
+wire [AWID_WIDTH-1:0] awid_m;
+wire [ADDR_WIDTH-1:0] awaddr_m;
+wire [AXLEN_WIDTH-1:0] awlen_m;
+wire [2:0] awsize_m;
+wire [1:0] awburst_m;
+wire [1:0] awlock_m;
+wire [3:0] awcache_m;
+wire [2:0] awprot_m;
+wire awvalid_m;
+wire awready_m;
+wire [USER_WIDTH-1:0] awuser_m;
+wire [3:0] awregion_m;
+wire [DS_DATA_WIDTH-1:0] wdata_m;
+wire [DS_WSTRB_WIDTH-1:0] wstrb_m;
+wire wlast_m;
+wire wvalid_m;
+wire wready_m;
+wire [AWID_WIDTH-1:0] wid_m;
+wire [USER_WIDTH-1:0] wuser_m;
+wire [AWID_WIDTH-1:0] bid_m;
+wire [1:0] bresp_m;
+wire bvalid_m;
+wire bready_m;
+wire [USER_WIDTH-1:0] buser_m;
+wire [ARID_WIDTH-1:0] arid_m;
+wire [ADDR_WIDTH-1:0] araddr_m;
+wire [AXLEN_WIDTH-1:0] arlen_m;
+wire [2:0] arsize_m;
+wire [1:0] arburst_m;
+wire [1:0] arlock_m;
+wire [3:0] arcache_m;
+wire [2:0] arprot_m;
+wire arvalid_m;
+wire arready_m;
+wire [USER_WIDTH-1:0] aruser_m;
+wire [3:0] arregion_m;
+wire [ARID_WIDTH-1:0] rid_m;
+wire [DS_DATA_WIDTH-1:0] rdata_m;
+wire [1:0] rresp_m;
+wire rlast_m;
+wire rvalid_m;
+wire rready_m;
+wire [USER_WIDTH-1:0] ruser_m;
+wire [3:0] awqos_m;
+wire [3:0] arqos_m;
+//Interface between axi2axilite and axilite2sram
+wire awvalid_lite_m;
+wire awready_lite_m;
+wire [ADDR_WIDTH-1:0] awaddr_lite_m;
+wire [2:0] awprot_lite_m;
+wire [USER_WIDTH-1:0] awuser_lite_m;
+wire wvalid_lite_m;
+wire wready_lite_m;
+wire [255:0] wdata_lite_m;
+wire [31:0] wstrb_lite_m;
+wire bvalid_lite_m;
+wire bready_lite_m;
+wire [1:0] bresp_lite_m;
+
+axi_upsizer u_upsizer(/*AUTOINST*/
+ // Outputs
+ .awid_m (awid_m[AWID_WIDTH-1:0]),
+ .awaddr_m (awaddr_m[ADDR_WIDTH-1:0]),
+ .awlen_m (awlen_m[AXLEN_WIDTH-1:0]),
+ .awsize_m (awsize_m[2:0]),
+ .awburst_m (awburst_m[1:0]),
+ .awlock_m (awlock_m[1:0]),
+ .awcache_m (awcache_m[3:0]),
+ .awprot_m (awprot_m[2:0]),
+ .awvalid_m (awvalid_m),
+ .awuser_m (awuser_m[USER_WIDTH-1:0]),
+ .awregion_m (awregion_m[3:0]),
+ .wdata_m (wdata_m[DS_DATA_WIDTH-1:0]),
+ .wstrb_m (wstrb_m[DS_WSTRB_WIDTH-1:0]),
+ .wlast_m (wlast_m),
+ .wvalid_m (wvalid_m),
+ .wid_m (wid_m[AWID_WIDTH-1:0]),
+ .wuser_m (wuser_m[USER_WIDTH-1:0]),
+ .bready_m (bready_m),
+ .arid_m (arid_m[ARID_WIDTH-1:0]),
+ .araddr_m (araddr_m[ADDR_WIDTH-1:0]),
+ .arlen_m (arlen_m[AXLEN_WIDTH-1:0]),
+ .arsize_m (arsize_m[2:0]),
+ .arburst_m (arburst_m[1:0]),
+ .arlock_m (arlock_m[1:0]),
+ .arcache_m (arcache_m[3:0]),
+ .arprot_m (arprot_m[2:0]),
+ .arvalid_m (arvalid_m),
+ .aruser_m (aruser_m[USER_WIDTH-1:0]),
+ .arregion_m (arregion_m[3:0]),
+ .rready_m (rready_m),
+ .awqos_m (awqos_m[3:0]),
+ .arqos_m (arqos_m[3:0]),
+ .awready_s (awready_s),
+ .wready_s (wready_s),
+ .bid_s (bid_s[AWID_WIDTH-1:0]),
+ .bresp_s (bresp_s[1:0]),
+ .bvalid_s (bvalid_s),
+ .buser_s (buser_s[USER_WIDTH-1:0]),
+ .arready_s (),
+ .rid_s (),
+ .rdata_s (),
+ .rresp_s (),
+ .rlast_s (),
+ .rvalid_s (),
+ .ruser_s (),
+ // Inputs
+ .aclk (aclk),
+ .aresetn (aresetn),
+ .awready_m (awready_m),
+ .wready_m (wready_m),
+ .bid_m (bid_m[AWID_WIDTH-1:0]),
+ .bresp_m (bresp_m[1:0]),
+ .bvalid_m (bvalid_m),
+ .buser_m (buser_m[USER_WIDTH-1:0]),
+ .arready_m (arready_m),
+ .rid_m (rid_m[ARID_WIDTH-1:0]),
+ .rdata_m (rdata_m[DS_DATA_WIDTH-1:0]),
+ .rresp_m (rresp_m[1:0]),
+ .rlast_m (rlast_m),
+ .rvalid_m (rvalid_m),
+ .ruser_m (ruser_m[USER_WIDTH-1:0]),
+ .awid_s (awid_s[AWID_WIDTH-1:0]),
+ .awaddr_s (awaddr_s[ADDR_WIDTH-1:0]),
+ .awlen_s (awlen_s[AXLEN_WIDTH-1:0]),
+ .awsize_s (awsize_s[2:0]),
+ .awburst_s (awburst_s[1:0]),
+ .awlock_s (awlock_s[1:0]),
+ .awcache_s (awcache_s[3:0]),
+ .awprot_s (awprot_s[2:0]),
+ .awvalid_s (awvalid_s),
+ .awuser_s (awuser_s[USER_WIDTH-1:0]),
+ .awregion_s (awregion_s[3:0]),
+ .wdata_s (wdata_s[US_DATA_WIDTH-1:0]),
+ .wstrb_s (wstrb_s[US_WSTRB_WIDTH-1:0]),
+ .wlast_s (wlast_s),
+ .wvalid_s (wvalid_s),
+ .wid_s (wid_s[AWID_WIDTH-1:0]),
+ .wuser_s (wuser_s[USER_WIDTH-1:0]),
+ .bready_s (bready_s),
+ .arid_s (4'b0),
+ .araddr_s (32'b0),
+ .arlen_s (4'b0),
+ .arsize_s (3'b0),
+ .arburst_s (2'b0),
+ .arlock_s (2'b0),
+ .arcache_s (4'b0),
+ .arprot_s (3'b0),
+ .arvalid_s (1'b0),
+ .aruser_s (16'b0),
+ .arregion_s (4'b0),
+ .rready_s (1'b0),
+ .awqos_s (awqos_m[3:0]),
+ .arqos_s (4'b0));
+
+
+axi2axilite u_axi2axilite(/*AUTOINST*/
+ // Outputs
+ .awready_s (awready_m),
+ .wready_s (wready_m),
+ .bid_s (bid_m[AWID_WIDTH-1:0]),
+ .bresp_s (bresp_m[1:0]),
+ .bvalid_s (bvalid_m),
+ .buser_s (buser_m[USER_WIDTH-1:0]),
+ .arready_s (arready_m),
+ .rid_s (rid_m[ARID_WIDTH-1:0]),
+ .rdata_s (rdata_m[31:0]),
+ .rresp_s (rresp_m[1:0]),
+ .rlast_s (rlast_m),
+ .rvalid_s (rvalid_m),
+ .ruser_s (ruser_m[USER_WIDTH-1:0]),
+ .awvalid_m (awvalid_lite_m),
+ .awaddr_m (awaddr_lite_m[ADDR_WIDTH-1:0]),
+ .awprot_m (awprot_lite_m[2:0]),
+ .awuser_m (awuser_lite_m[USER_WIDTH-1:0]),
+ .wvalid_m (wvalid_lite_m),
+ .wdata_m (wdata_lite_m[255:0]),
+ .wstrb_m (wstrb_lite_m[31:0]),
+ .bready_m (bready_lite_m),
+ .arvalid_m (),//Floating
+ .araddr_m (),//Floating
+ .arprot_m (),//Floating
+ .aruser_m (),//Floating
+ .rready_m (),//Floating
+ // Inputs
+ .aclk (aclk),
+ .aresetn (aresetn),
+ .awid_s (awid_m[AWID_WIDTH-1:0]),
+ .awaddr_s (awaddr_m[ADDR_WIDTH-1:0]),
+ .awlen_s ({4'b0,awlen_m[3:0]}),
+ .awsize_s (awsize_m[2:0]),
+ .awburst_s (awburst_m[1:0]),
+ .awlock_s (awlock_m[1:0]),
+ .awcache_s (awcache_m[3:0]),
+ .awprot_s (awprot_m[2:0]),
+ .awvalid_s (awvalid_m),
+ .awuser_s (awuser_m[USER_WIDTH-1:0]),
+ .awregion_s (awregion_m[3:0]),
+ .wid_s (wid_m[AWID_WIDTH-1:0]),
+ .wdata_s (wdata_m[255:0]),
+ .wstrb_s (wstrb_m[31:0]),
+ .wlast_s (wlast_m),
+ .wvalid_s (wvalid_m),
+ .wuser_s (wuser_m[USER_WIDTH-1:0]),
+ .bready_s (bready_m),
+ .arid_s (arid_m[ARID_WIDTH-1:0]),
+ .araddr_s (araddr_m[ADDR_WIDTH-1:0]),
+ .arlen_s ({4'b0,arlen_m[3:0]}),
+ .arsize_s (arsize_m[2:0]),
+ .arburst_s (arburst_m[1:0]),
+ .arlock_s (arlock_m[1:0]),
+ .arcache_s (arcache_m[3:0]),
+ .arprot_s (arprot_m[2:0]),
+ .arvalid_s (arvalid_m),
+ .aruser_s (aruser_m[USER_WIDTH-1:0]),
+ .arregion_s (arregion_m[3:0]),
+ .rready_s (rready_m),
+ .awqos_s (awqos_m[3:0]),
+ .arqos_s (arqos_m[3:0]),
+ .awready_m (awready_lite_m),
+ .wready_m (wready_lite_m),
+ .bvalid_m (bvalid_lite_m),
+ .bresp_m (bresp_lite_m[1:0]),
+ .arready_m (1'b0),//Tie
+ .rvalid_m (1'b0),//Tie
+ .rdata_m (32'b0),//Tie
+ .rresp_m (2'b0));//Tie
+
+axilite2sram u_axilite2sram(/*AUTOINST*/
+ // Outputs
+ .awready_s (awready_lite_m),
+ .wready_s (wready_lite_m),
+ .bvalid_s (bvalid_lite_m),
+ .bresp_s (bresp_lite_m[1:0]),
+ .sram_cvalid (sram_cvalid),
+ .sram_cwrite (sram_cwrite),
+ .sram_caddr (sram_caddr[31:0]),
+ .sram_cid (sram_cid[7:0]),
+ .sram_wdata (sram_wdata[255:0]),
+ .sram_wmask (sram_wmask[31:0]),
+ // Inputs
+ .aclk (aclk),
+ .aresetn (aresetn),
+ .awvalid_s (awvalid_lite_m),
+ .awaddr_s (awaddr_lite_m[ADDR_WIDTH-1:0]),
+ .awprot_s (awprot_lite_m[2:0]),
+ .awuser_s (awuser_lite_m[USER_WIDTH-1:0]),
+ .wvalid_s (wvalid_lite_m),
+ .wdata_s (wdata_lite_m[255:0]),
+ .wstrb_s (wstrb_lite_m[31:0]),
+ .bready_s (bready_lite_m),
+ .sram_cready (sram_cready));
+
+
+
+endmodule
diff --git a/axi2sramcrs/rtl/axilite2sram.v b/axi2sramcrs/rtl/axilite2sram.v
new file mode 100644
index 0000000..1c95d24
--- /dev/null
+++ b/axi2sramcrs/rtl/axilite2sram.v
@@ -0,0 +1,113 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axilite2sram
+ #(
+ //id width
+ parameter ARID_WIDTH=4,
+ parameter AWID_WIDTH=4,
+ //addr width
+ parameter ADDR_WIDTH=32,
+ //user width
+ parameter USER_WIDTH=4 )
+
+(
+ input aclk,
+ input aresetn,
+ //===========================================
+ //==slave port write only
+ //===========================================
+ input awvalid_s,
+ output awready_s,
+ input [ADDR_WIDTH-1:0] awaddr_s,
+ input [2:0] awprot_s,//N.A
+ input [USER_WIDTH-1:0] awuser_s,//N.A
+
+ input wvalid_s,
+ output wready_s,
+ input [255:0] wdata_s,
+ input [31:0] wstrb_s,
+
+ output reg bvalid_s,
+ input bready_s,
+ output [1:0] bresp_s,
+
+ output sram_cvalid,
+ input sram_cready,
+ output sram_cwrite,
+ output [31:0] sram_caddr,
+ output [7:0] sram_cid,
+ output [255:0] sram_wdata,
+ output [31:0] sram_wmask
+);
+
+
+reg awvalid_latch;
+reg [31:0] awaddr_latch;
+
+assign wready_s = awvalid_latch & sram_cready;
+//assign awready_s = awvalid_latch1'b1;
+assign awready_s = ~awvalid_latch;//no more ostd
+assign bresp_s = 2'b0;
+
+assign sram_wdata = wdata_s;
+assign sram_wmask = wstrb_s;
+assign sram_cid = 8'b0;
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awvalid_latch <= 1'b0;
+ else if(awvalid_s&&awready_s)
+ awvalid_latch <= 1'b1;
+// else if(bvalid_s&&bready_s)
+// awvalid_latch <= 1'b0;
+ else if(wvalid_s&&wready_s)
+ awvalid_latch <= 1'b0;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ awaddr_latch <= 32'b0;
+ else if(awvalid_s&&awready_s)
+ awaddr_latch <= awaddr_s;
+ end
+
+always@(posedge aclk or negedge aresetn)
+ begin
+ if(~aresetn)
+ bvalid_s <= 1'b0;
+ else if(bvalid_s&bready_s)
+ bvalid_s <= 1'b0;
+ else if(wvalid_s&&wready_s)
+ bvalid_s <= 1'b1;
+ end
+
+
+assign sram_cvalid = awvalid_latch && wvalid_s;
+//assign sram_cvalid = wvalid_s;
+assign sram_cwrite = awvalid_latch && wvalid_s;
+//assign sram_cwrite = wvalid_s;
+assign sram_caddr = awaddr_latch;
+
+
+endmodule
diff --git a/axi2sramcrs/rtl/share/Axi.v b/axi2sramcrs/rtl/share/Axi.v
new file mode 100644
index 0000000..45cf494
--- /dev/null
+++ b/axi2sramcrs/rtl/share/Axi.v
@@ -0,0 +1,55 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`define AXI_ALEN_1 4'b0000
+`define AXI_ALEN_2 4'b0001
+`define AXI_ALEN_3 4'b0010
+`define AXI_ALEN_4 4'b0011
+`define AXI_ALEN_5 4'b0100
+`define AXI_ALEN_6 4'b0101
+`define AXI_ALEN_7 4'b0110
+`define AXI_ALEN_8 4'b0111
+`define AXI_ALEN_9 4'b1000
+`define AXI_ALEN_10 4'b1001
+`define AXI_ALEN_11 4'b1010
+`define AXI_ALEN_12 4'b1011
+`define AXI_ALEN_13 4'b1100
+`define AXI_ALEN_14 4'b1101
+`define AXI_ALEN_15 4'b1110
+`define AXI_ALEN_16 4'b1111
+`define AXI_ASIZE_8 3'b000
+`define AXI_ASIZE_16 3'b001
+`define AXI_ASIZE_32 3'b010
+`define AXI_ASIZE_64 3'b011
+`define AXI_ASIZE_128 3'b100
+`define AXI_ASIZE_256 3'b101
+`define AXI_ASIZE_512 3'b110
+`define AXI_ASIZE_1024 3'b111
+`define AXI_ABURST_FIXED 2'b00
+`define AXI_ABURST_INCR 2'b01
+`define AXI_ABURST_WRAP 2'b10
+`define AXI_ALOCK_NOLOCK 2'b00
+`define AXI_ALOCK_EXCL 2'b01
+`define AXI_ALOCK_LOCKED 2'b10
+`define AXI_RESP_OKAY 2'b00
+`define AXI_RESP_EXOKAY 2'b01
+`define AXI_RESP_SLVERR 2'b10
+`define AXI_RESP_DECERR 2'b11
diff --git a/axi2sramcrs/rtl/share/Axi_undefs.v b/axi2sramcrs/rtl/share/Axi_undefs.v
new file mode 100644
index 0000000..0854a76
--- /dev/null
+++ b/axi2sramcrs/rtl/share/Axi_undefs.v
@@ -0,0 +1,55 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`undef AXI_ALEN_1
+`undef AXI_ALEN_2
+`undef AXI_ALEN_3
+`undef AXI_ALEN_4
+`undef AXI_ALEN_5
+`undef AXI_ALEN_6
+`undef AXI_ALEN_7
+`undef AXI_ALEN_8
+`undef AXI_ALEN_9
+`undef AXI_ALEN_10
+`undef AXI_ALEN_11
+`undef AXI_ALEN_12
+`undef AXI_ALEN_13
+`undef AXI_ALEN_14
+`undef AXI_ALEN_15
+`undef AXI_ALEN_16
+`undef AXI_ASIZE_8
+`undef AXI_ASIZE_16
+`undef AXI_ASIZE_32
+`undef AXI_ASIZE_64
+`undef AXI_ASIZE_128
+`undef AXI_ASIZE_256
+`undef AXI_ASIZE_512
+`undef AXI_ASIZE_1024
+`undef AXI_ABURST_FIXED
+`undef AXI_ABURST_INCR
+`undef AXI_ABURST_WRAP
+`undef AXI_ALOCK_NOLOCK
+`undef AXI_ALOCK_EXCL
+`undef AXI_ALOCK_LOCKED
+`undef AXI_RESP_OKAY
+`undef AXI_RESP_EXOKAY
+`undef AXI_RESP_SLVERR
+`undef AXI_RESP_DECERR
diff --git a/axi2sramcrs/rtl/share/axi_slice/axi_ful_regd_slice.v b/axi2sramcrs/rtl/share/axi_slice/axi_ful_regd_slice.v
new file mode 100644
index 0000000..08097bc
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/axi_ful_regd_slice.v
@@ -0,0 +1,144 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi_ful_regd_slice
+ (
+ aresetn,
+ aclk,
+ valid_src,
+ ready_dst,
+ payload_src,
+ valid_dst,
+ ready_src,
+ payload_dst
+ );
+ parameter PAYLD_WIDTH = 2;
+ parameter PAYLD_MAX = (PAYLD_WIDTH - 1);
+ parameter NUM_SEL_LINES = (PAYLD_WIDTH + 7) / 8;
+ parameter REM_SEL_LINE = (((PAYLD_WIDTH - 1) % 8) + 1);
+ input aresetn;
+ input aclk;
+ input valid_src;
+ input ready_dst;
+ input [PAYLD_MAX:0] payload_src;
+ output valid_dst;
+ output ready_src;
+ output [PAYLD_MAX:0] payload_dst;
+ wire aresetn;
+ wire aclk;
+ wire valid_src;
+ wire ready_dst;
+ wire [PAYLD_MAX:0] payload_src;
+ wire valid_dst;
+ wire ready_src;
+ reg [PAYLD_MAX:0] payload_dst;
+ wire enable_a;
+ wire enable_b;
+ wire load_sel_en;
+ wire nxt_valid_a;
+ wire nxt_valid_b;
+ reg [PAYLD_MAX:0] payload_reg_a;
+ reg [PAYLD_MAX:0] payload_reg_b;
+ reg valid_a;
+ reg valid_b;
+ wire iready_src;
+ wire ivalid_dst;
+ reg load_b;
+ reg [NUM_SEL_LINES:0] sel_b;
+ wire sel_b_en;
+ assign valid_dst = ivalid_dst;
+ assign ready_src = iready_src;
+ always @(sel_b or payload_reg_a or payload_reg_b)
+ begin : p_payload_mux
+ integer i;
+ integer j;
+ integer base;
+ base = 0;
+ for (i=1; i<NUM_SEL_LINES; i=i+1)
+ begin
+ for (j=base; j<(base+8); j=j+1)
+ payload_dst[j] = (sel_b[i] ? payload_reg_b[j] : payload_reg_a[j]);
+ base = (8 * i);
+ end
+ for (j=base; j<(base+REM_SEL_LINE); j=j+1)
+ payload_dst[j] = (sel_b[NUM_SEL_LINES] ? payload_reg_b[j] : payload_reg_a[j]);
+ end
+ assign enable_a = ~load_b & valid_src & iready_src;
+ assign enable_b = load_b & valid_src & iready_src;
+ assign load_sel_en = valid_src & iready_src;
+ assign nxt_valid_a = (enable_a ? 1'b1
+ :((~sel_b[0] & ivalid_dst & ready_dst) ? 1'b0
+ : valid_a));
+ assign nxt_valid_b = (enable_b ? 1'b1
+ :((sel_b[0] & ivalid_dst & ready_dst) ? 1'b0
+ : valid_b));
+ //end
+ always @(posedge aclk or negedge aresetn)
+ begin : p_payload_reg_a
+ if (~aresetn)
+ payload_reg_a <= {PAYLD_WIDTH{1'b0}};
+ else if (enable_a)
+ payload_reg_a <= payload_src;
+ end
+ //end
+ always @(posedge aclk or negedge aresetn)
+ begin : p_payload_reg_b
+ if (~aresetn)
+ payload_reg_b <= {PAYLD_WIDTH{1'b0}};
+ else if (enable_b)
+ payload_reg_b <= payload_src;
+ end
+ always @(posedge aclk or negedge aresetn)
+ begin : p_valid_a
+ if (~aresetn)
+ valid_a <= 1'b0;
+ else
+ valid_a <= nxt_valid_a;
+ end
+ always @(posedge aclk or negedge aresetn)
+ begin : p_valid_b
+ if (~aresetn)
+ valid_b <= 1'b0;
+ else
+ valid_b <= nxt_valid_b;
+ end
+ assign iready_src = ~valid_a | ~valid_b;
+ assign ivalid_dst = valid_a | valid_b;
+ always @(posedge aclk or negedge aresetn)
+ begin : p_load_b
+ if (~aresetn)
+ load_b <= 1'b0;
+ else
+ if (load_sel_en)
+ load_b <= ~load_b;
+ end
+ assign sel_b_en = ((~sel_b[0] & nxt_valid_b & (~valid_a | ready_dst)) |
+ ( sel_b[0] & nxt_valid_a & (~valid_b | ready_dst)));
+
+ always @(posedge aclk or negedge aresetn)
+ begin : p_sel_b
+ if (~aresetn)
+ sel_b <= {NUM_SEL_LINES+1{1'b0}};
+ else
+ if (sel_b_en)
+ sel_b <= ~sel_b;
+ end
+endmodule
diff --git a/axi2sramcrs/rtl/share/axi_slice/axi_fwd_regd_slice.v b/axi2sramcrs/rtl/share/axi_slice/axi_fwd_regd_slice.v
new file mode 100644
index 0000000..a4ee8d8
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/axi_fwd_regd_slice.v
@@ -0,0 +1,75 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi_fwd_regd_slice
+ (
+ aresetn,
+ aclk,
+ valid_src,
+ ready_dst,
+ payload_src,
+ ready_src,
+ valid_dst,
+ payload_dst
+ );
+ parameter PAYLD_WIDTH = 2;
+ parameter PAYLD_MAX = (PAYLD_WIDTH - 1);
+ input aresetn;
+ input aclk;
+ input valid_src;
+ input ready_dst;
+ input [PAYLD_MAX:0] payload_src;
+ output valid_dst;
+ output ready_src;
+ output [PAYLD_MAX:0] payload_dst;
+ wire aresetn;
+ wire aclk;
+ wire valid_src;
+ wire ready_dst;
+ wire [PAYLD_MAX:0] payload_src;
+ wire valid_dst;
+ wire ready_src;
+ reg [PAYLD_MAX:0] payload_dst;
+ wire payload_en;
+ wire valid_dst_en;
+ reg ivalid_dst;
+ assign valid_dst = ivalid_dst;
+ assign ready_src = ready_dst | ~ivalid_dst;
+ //end
+ always @(posedge aclk or negedge aresetn)
+ begin : p_payload_dst
+ if (~aresetn)
+ payload_dst <= {PAYLD_WIDTH{1'b0}};
+ else if (payload_en)
+ payload_dst <= payload_src;
+ end
+ assign payload_en = ((valid_src & ~ivalid_dst) |
+ (valid_src & ivalid_dst & ready_dst));
+ assign valid_dst_en = (valid_src | ready_dst);
+ always @(posedge aclk or negedge aresetn)
+ begin : p_ivalid_dst
+ if (~aresetn)
+ ivalid_dst <= 1'b0;
+ else if (valid_dst_en)
+ ivalid_dst <= valid_src;
+ end
+
+endmodule
diff --git a/axi2sramcrs/rtl/share/axi_slice/axi_rev_regd_slice.v b/axi2sramcrs/rtl/share/axi_slice/axi_rev_regd_slice.v
new file mode 100644
index 0000000..5d83b7e
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/axi_rev_regd_slice.v
@@ -0,0 +1,84 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi_rev_regd_slice
+ (
+ aresetn,
+ aclk,
+ valid_src,
+ ready_dst,
+ payload_src,
+ valid_dst,
+ ready_src,
+ payload_dst
+ );
+ parameter PAYLD_WIDTH = 1;
+ parameter PAYLD_MAX = PAYLD_WIDTH - 1;
+ parameter NUM_SEL_LINES = (PAYLD_WIDTH + 7) / 8;
+ parameter REM_SEL_LINE = (((PAYLD_WIDTH - 1) % 8) + 1);
+ input aclk;
+ input aresetn;
+ input [PAYLD_MAX:0] payload_src;
+ output [PAYLD_MAX:0] payload_dst;
+ input valid_src;
+ output ready_src;
+ output valid_dst;
+ input ready_dst;
+ reg [PAYLD_MAX:0] payload_dst;
+ reg [PAYLD_MAX:0] payload_reg;
+ wire buffer_en;
+ wire buffer_full_en;
+ reg [NUM_SEL_LINES:0] buffer_full;
+ assign buffer_en = (valid_src & ~buffer_full[0] & ~ready_dst);
+ always @(negedge aresetn or posedge aclk)
+ begin : p_buffer_seq
+ if (~aresetn)
+ payload_reg <= {PAYLD_WIDTH{1'b0}};
+ else if (buffer_en)
+ payload_reg <= payload_src;
+ end
+ assign buffer_full_en = (buffer_en | ready_dst);
+ always @(negedge aresetn or posedge aclk)
+ begin : p_buffer_full_seq
+ if (~aresetn)
+ buffer_full <= {NUM_SEL_LINES+1{1'b0}};
+ else if (buffer_full_en)
+ buffer_full <= {NUM_SEL_LINES+1{buffer_en}};
+ end
+ assign ready_src = ~buffer_full[0];
+ assign valid_dst = (valid_src | buffer_full[0]);
+ always @(buffer_full or payload_reg or payload_src)
+ begin : p_payload_mux
+ integer i;
+ integer j;
+ integer base;
+ base = 0;
+ for (i=1; i<NUM_SEL_LINES; i=i+1)
+ begin
+ for (j=base; j<(base+8); j=j+1)
+ payload_dst[j] = (buffer_full[i] ? payload_reg[j] : payload_src[j]);
+ base = (8 * i);
+ end
+ for (j=base; j<(base+REM_SEL_LINE); j=j+1)
+ payload_dst[j] = (buffer_full[NUM_SEL_LINES] ? payload_reg[j]
+ : payload_src[j]);
+ end
+endmodule
diff --git a/axi2sramcrs/rtl/share/axi_slice/axi_slice.v b/axi2sramcrs/rtl/share/axi_slice/axi_slice.v
new file mode 100644
index 0000000..6cc3875
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/axi_slice.v
@@ -0,0 +1,111 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`include "defs_axi_slice.v"
+module axi_slice
+ (
+ aresetn,
+ aclk,
+ src_data,
+ src_valid,
+ src_ready,
+ dst_data,
+ dst_valid,
+ dst_ready
+ );
+ parameter HNDSHK_MODE = `RS_REV_REG;
+ parameter PAYLD_WIDTH = 12;
+ parameter PAYLD_MAX = (PAYLD_WIDTH - 1);
+ parameter INT_HNDSHK_MODE = HNDSHK_MODE;
+
+ input aresetn;
+ input aclk;
+ input [PAYLD_MAX:0] src_data;
+ output [PAYLD_MAX:0] dst_data;
+ input src_valid;
+ output src_ready;
+ output dst_valid;
+ input dst_ready;
+ wire [PAYLD_MAX:0] payld_src;
+ wire [PAYLD_MAX:0] payld_regd;
+ wire [PAYLD_MAX:0] payld_fwd_regd;
+ wire [PAYLD_MAX:0] payld_rev_regd;
+ wire valid_regd;
+ wire valid_fwd_regd;
+ wire valid_rev_regd;
+ wire ready_regd;
+ wire ready_fwd_regd;
+ wire ready_rev_regd;
+ assign src_ready = ((INT_HNDSHK_MODE == `RS_REGD) ? ready_regd
+ :((INT_HNDSHK_MODE == `RS_FWD_REG) ? ready_fwd_regd
+ :((INT_HNDSHK_MODE == `RS_REV_REG) ? ready_rev_regd
+ : dst_ready)));
+ assign dst_data = ((INT_HNDSHK_MODE == `RS_REGD) ? payld_regd
+ :((INT_HNDSHK_MODE == `RS_FWD_REG) ? payld_fwd_regd
+ :((INT_HNDSHK_MODE == `RS_REV_REG) ? payld_rev_regd
+ : src_data)));
+ assign dst_valid = ((INT_HNDSHK_MODE == `RS_REGD) ? valid_regd
+ :((INT_HNDSHK_MODE == `RS_FWD_REG) ? valid_fwd_regd
+ :((INT_HNDSHK_MODE == `RS_REV_REG) ? valid_rev_regd
+ : src_valid)));
+ assign payld_src = src_data;
+ axi_ful_regd_slice #(
+ .PAYLD_WIDTH (PAYLD_WIDTH)
+ ) u_ful_regd_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .valid_src (src_valid),
+ .ready_dst (dst_ready),
+ .payload_src (payld_src),
+ .ready_src (ready_regd),
+ .valid_dst (valid_regd),
+ .payload_dst (payld_regd)
+ );
+ axi_fwd_regd_slice #(
+ .PAYLD_WIDTH(PAYLD_WIDTH)
+ ) u_fwd_regd_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .valid_src (src_valid),
+ .ready_dst (dst_ready),
+ .payload_src (payld_src),
+ .ready_src (ready_fwd_regd),
+ .valid_dst (valid_fwd_regd),
+ .payload_dst (payld_fwd_regd)
+ );
+ axi_rev_regd_slice #(
+ .PAYLD_WIDTH(PAYLD_WIDTH)
+ ) u_rev_regd_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .valid_src (src_valid),
+ .ready_dst (dst_ready),
+ .payload_src (payld_src),
+ .ready_src (ready_rev_regd),
+ .valid_dst (valid_rev_regd),
+ .payload_dst (payld_rev_regd)
+ );
+
+endmodule
+`include "undefs_axi_slice.v"
diff --git a/axi2sramcrs/rtl/share/axi_slice/defs_axi_slice.v b/axi2sramcrs/rtl/share/axi_slice/defs_axi_slice.v
new file mode 100644
index 0000000..8772649
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/defs_axi_slice.v
@@ -0,0 +1,25 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`define RS_REGD 0
+`define RS_FWD_REG 1
+`define RS_REV_REG 2
+`define RS_STATIC_BYPASS 3
diff --git a/axi2sramcrs/rtl/share/axi_slice/undefs_axi_slice.v b/axi2sramcrs/rtl/share/axi_slice/undefs_axi_slice.v
new file mode 100644
index 0000000..e597cde
--- /dev/null
+++ b/axi2sramcrs/rtl/share/axi_slice/undefs_axi_slice.v
@@ -0,0 +1,25 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`undef RS_REGD
+`undef RS_FWD_REG
+`undef RS_REV_REG
+`undef RS_STATIC_BYPASS
diff --git a/axi2sramcrs/rtl/upsizer/axi_upsizer.v b/axi2sramcrs/rtl/upsizer/axi_upsizer.v
new file mode 100644
index 0000000..8bbaac0
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/axi_upsizer.v
@@ -0,0 +1,339 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module axi_upsizer(
+ awid_m, awaddr_m, awlen_m, awsize_m, awburst_m, awlock_m,
+ awcache_m, awprot_m, awvalid_m, awuser_m, awregion_m, wdata_m,
+ wstrb_m, wlast_m, wvalid_m, wid_m, wuser_m, bready_m, arid_m,
+ araddr_m, arlen_m, arsize_m, arburst_m, arlock_m, arcache_m,
+ arprot_m, arvalid_m, aruser_m, arregion_m, rready_m, awqos_m,
+ arqos_m, awready_s, wready_s, bid_s, bresp_s, bvalid_s, buser_s,
+ arready_s, rid_s, rdata_s, rresp_s, rlast_s, rvalid_s, ruser_s,
+ aclk, aresetn, awready_m, wready_m, bid_m, bresp_m, bvalid_m,
+ buser_m, arready_m, rid_m, rdata_m, rresp_m, rlast_m, rvalid_m,
+ ruser_m, awid_s, awaddr_s, awlen_s, awsize_s, awburst_s, awlock_s,
+ awcache_s, awprot_s, awvalid_s, awuser_s, awregion_s, wdata_s,
+ wstrb_s, wlast_s, wvalid_s, wid_s, wuser_s, bready_s, arid_s,
+ araddr_s, arlen_s, arsize_s, arburst_s, arlock_s, arcache_s,
+ arprot_s, arvalid_s, aruser_s, arregion_s, rready_s, awqos_s,
+ arqos_s
+ );
+parameter ARID_WIDTH=16;
+parameter AWID_WIDTH=16;
+parameter ADDR_WIDTH=61;
+parameter US_DATA_WIDTH=64;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=16;
+parameter IS_AXI3=1'h1;
+parameter RD_ISS=128;
+parameter WR_ISS=128;
+parameter DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+parameter US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam AXLEN_WIDTH=(IS_AXI3==1'h1) ? 4 : 8;
+localparam DS_AXI3=IS_AXI3;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH;
+localparam W_IDB_WIDTH=AWID_WIDTH+USER_WIDTH+DS_DATA_WIDTH+DS_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+DS_DATA_WIDTH+2+1;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+input aclk;
+input aresetn;
+ output [AWID_WIDTH-1:0] awid_m;
+ output [ADDR_WIDTH-1:0] awaddr_m;
+ output [AXLEN_WIDTH-1:0] awlen_m;
+ output [2:0] awsize_m;
+ output [1:0] awburst_m;
+ output [1:0] awlock_m;
+ output [3:0] awcache_m;
+ output [2:0] awprot_m;
+ output awvalid_m;
+ input awready_m;
+ output [USER_WIDTH-1:0] awuser_m;
+ output [3:0] awregion_m;
+ output [DS_DATA_WIDTH-1:0] wdata_m;
+ output [DS_WSTRB_WIDTH-1:0] wstrb_m;
+ output wlast_m;
+ output wvalid_m;
+ input wready_m;
+ output [AWID_WIDTH-1:0] wid_m;
+ output [USER_WIDTH-1:0] wuser_m;
+ input [AWID_WIDTH-1:0] bid_m;
+ input [1:0] bresp_m;
+ input bvalid_m;
+ output bready_m;
+ input [USER_WIDTH-1:0] buser_m;
+ output [ARID_WIDTH-1:0] arid_m;
+ output [ADDR_WIDTH-1:0] araddr_m;
+ output [AXLEN_WIDTH-1:0] arlen_m;
+ output [2:0] arsize_m;
+ output [1:0] arburst_m;
+ output [1:0] arlock_m;
+ output [3:0] arcache_m;
+ output [2:0] arprot_m;
+ output arvalid_m;
+ input arready_m;
+ output [USER_WIDTH-1:0] aruser_m;
+ output [3:0] arregion_m;
+ input [ARID_WIDTH-1:0] rid_m;
+ input [DS_DATA_WIDTH-1:0] rdata_m;
+ input [1:0] rresp_m;
+ input rlast_m;
+ input rvalid_m;
+ output rready_m;
+ input [USER_WIDTH-1:0] ruser_m;
+ output [3:0] awqos_m;
+ output [3:0] arqos_m;
+ input [AWID_WIDTH-1:0] awid_s;
+ input [ADDR_WIDTH-1:0] awaddr_s;
+ input [AXLEN_WIDTH-1:0] awlen_s;
+ input [2:0] awsize_s;
+ input [1:0] awburst_s;
+ input [1:0] awlock_s;
+ input [3:0] awcache_s;
+ input [2:0] awprot_s;
+ input awvalid_s;
+ output awready_s;
+ input [USER_WIDTH-1:0] awuser_s;
+ input [3:0] awregion_s;
+ input [US_DATA_WIDTH-1:0] wdata_s;
+ input [US_WSTRB_WIDTH-1:0] wstrb_s;
+ input wlast_s;
+ input wvalid_s;
+ output wready_s;
+ input [AWID_WIDTH-1:0] wid_s;
+ input [USER_WIDTH-1:0] wuser_s;
+ output [AWID_WIDTH-1:0] bid_s;
+ output [1:0] bresp_s;
+ output bvalid_s;
+ input bready_s;
+ output [USER_WIDTH-1:0] buser_s;
+ input [ARID_WIDTH-1:0] arid_s;
+ input [ADDR_WIDTH-1:0] araddr_s;
+ input [AXLEN_WIDTH-1:0] arlen_s;
+ input [2:0] arsize_s;
+ input [1:0] arburst_s;
+ input [1:0] arlock_s;
+ input [3:0] arcache_s;
+ input [2:0] arprot_s;
+ input arvalid_s;
+ output arready_s;
+ input [USER_WIDTH-1:0] aruser_s;
+ input [3:0] arregion_s;
+ output [ARID_WIDTH-1:0] rid_s;
+ output [US_DATA_WIDTH-1:0] rdata_s;
+ output [1:0] rresp_s;
+ output rlast_s;
+ output rvalid_s;
+ input rready_s;
+ output [USER_WIDTH-1:0] ruser_s;
+ input [3:0] awqos_s;
+ input [3:0] arqos_s;
+wire [AR_IDB_WIDTH-1:0] ar_data;
+wire ar_ready;
+wire ar_valid;
+wire [AW_IDB_WIDTH-1:0] aw_data;
+wire aw_ready;
+wire aw_valid;
+wire [B_IDB_WIDTH-1:0] b_data;
+wire b_ready;
+wire b_valid;
+wire [R_IDB_WIDTH-1:0] r_data;
+wire r_ready;
+wire r_valid;
+wire [W_IDB_WIDTH-1:0] w_data;
+wire w_ready;
+wire w_valid;
+wire [7:0] arlen_s_ext;
+wire [7:0] awlen_s_ext;
+wire [7:0] arlen_m_ext;
+wire [7:0] awlen_m_ext;
+generate
+ if(AXLEN_WIDTH==8) begin
+ assign arlen_s_ext=arlen_s;
+ assign awlen_s_ext=awlen_s;
+ assign arlen_m=arlen_m_ext;
+ assign awlen_m=awlen_m_ext;
+ end
+ else begin
+ assign arlen_s_ext={4'h0,arlen_s};
+ assign awlen_s_ext={4'h0,awlen_s};
+ assign arlen_m=arlen_m_ext[3:0];
+ assign awlen_m=awlen_m_ext[3:0];
+ end
+endgenerate
+upsize_slave_domain #(
+ .ARID_WIDTH (ARID_WIDTH),
+ .AWID_WIDTH (AWID_WIDTH),
+ .ADDR_WIDTH (ADDR_WIDTH),
+ .US_DATA_WIDTH (US_DATA_WIDTH),
+ .DS_DATA_WIDTH (DS_DATA_WIDTH),
+ .USER_WIDTH (USER_WIDTH),
+ .RD_ISS (RD_ISS),
+ .WR_ISS (WR_ISS),
+ .DS_AXI3 (DS_AXI3))
+ u_slave_domain(
+ .arqv_s (arqos_s),
+ .awqv_s (awqos_s),
+ .awlen_s (awlen_s_ext),
+ .arlen_s (arlen_s_ext),
+ .awvalid_vect_s(1'h0),
+ .arvalid_vect_s(1'h0),
+ .awready_s (awready_s),
+ .wready_s (wready_s),
+ .bid_s (bid_s[AWID_WIDTH-1:0]),
+ .bresp_s (bresp_s[1:0]),
+ .bvalid_s (bvalid_s),
+ .buser_s (buser_s[USER_WIDTH-1:0]),
+ .arready_s (arready_s),
+ .rid_s (rid_s[ARID_WIDTH-1:0]),
+ .rdata_s (rdata_s[US_DATA_WIDTH-1:0]),
+ .rresp_s (rresp_s[1:0]),
+ .rlast_s (rlast_s),
+ .rvalid_s (rvalid_s),
+ .ruser_s (ruser_s[USER_WIDTH-1:0]),
+ .aw_data (aw_data[AW_IDB_WIDTH-1:0]),
+ .aw_valid (aw_valid),
+ .b_ready (b_ready),
+ .ar_data (ar_data[AR_IDB_WIDTH-1:0]),
+ .ar_valid (ar_valid),
+ .r_ready (r_ready),
+ .w_data (w_data[W_IDB_WIDTH-1:0]),
+ .w_valid (w_valid),
+ .awid_s (awid_s[AWID_WIDTH-1:0]),
+ .awaddr_s (awaddr_s[ADDR_WIDTH-1:0]),
+ .awsize_s (awsize_s[2:0]),
+ .awburst_s (awburst_s[1:0]),
+ .awlock_s (awlock_s[1:0]),
+ .awcache_s (awcache_s[3:0]),
+ .awprot_s (awprot_s[2:0]),
+ .awvalid_s (awvalid_s),
+ .awuser_s (awuser_s[USER_WIDTH-1:0]),
+ .awregion_s (awregion_s[3:0]),
+ .wdata_s (wdata_s[US_DATA_WIDTH-1:0]),
+ .wstrb_s (wstrb_s[US_WSTRB_WIDTH-1:0]),
+ .wlast_s (wlast_s),
+ .wvalid_s (wvalid_s),
+ .wid_s (wid_s[AWID_WIDTH-1:0]),
+ .wuser_s (wuser_s[USER_WIDTH-1:0]),
+ .bready_s (bready_s),
+ .arid_s (arid_s[ARID_WIDTH-1:0]),
+ .araddr_s (araddr_s[ADDR_WIDTH-1:0]),
+ .arsize_s (arsize_s[2:0]),
+ .arburst_s (arburst_s[1:0]),
+ .arlock_s (arlock_s[1:0]),
+ .arcache_s (arcache_s[3:0]),
+ .arprot_s (arprot_s[2:0]),
+ .arvalid_s (arvalid_s),
+ .aruser_s (aruser_s[USER_WIDTH-1:0]),
+ .arregion_s (arregion_s[3:0]),
+ .rready_s (rready_s),
+ .aw_ready (aw_ready),
+ .b_data (b_data[B_IDB_WIDTH-1:0]),
+ .b_valid (b_valid),
+ .ar_ready (ar_ready),
+ .r_data (r_data[R_IDB_WIDTH-1:0]),
+ .r_valid (r_valid),
+ .w_ready (w_ready),
+ .aclk (aclk),
+ .aresetn (aresetn));
+upsize_master_domain #(
+ .ARID_WIDTH (ARID_WIDTH),
+ .AWID_WIDTH (AWID_WIDTH),
+ .ADDR_WIDTH (ADDR_WIDTH),
+ .US_DATA_WIDTH (US_DATA_WIDTH),
+ .DS_DATA_WIDTH (DS_DATA_WIDTH),
+ .USER_WIDTH (USER_WIDTH),
+ .RD_ISS (RD_ISS),
+ .WR_ISS (WR_ISS)) u_master_domain(
+ .awqv_m (awqos_m),
+ .arqv_m (arqos_m),
+ .arlen_m (arlen_m_ext),
+ .awlen_m (awlen_m_ext),
+ .awvalid_vect_m (),
+ .arvalid_vect_m (),
+ .awid_m (awid_m[AWID_WIDTH-1:0]),
+ .awaddr_m (awaddr_m[ADDR_WIDTH-1:0]),
+ .awsize_m (awsize_m[2:0]),
+ .awburst_m (awburst_m[1:0]),
+ .awlock_m (awlock_m[1:0]),
+ .awcache_m (awcache_m[3:0]),
+ .awprot_m (awprot_m[2:0]),
+ .awvalid_m (awvalid_m),
+ .awuser_m (awuser_m[USER_WIDTH-1:0]),
+ .awregion_m (awregion_m[3:0]),
+ .wdata_m (wdata_m[DS_DATA_WIDTH-1:0]),
+ .wstrb_m (wstrb_m[DS_WSTRB_WIDTH-1:0]),
+ .wlast_m (wlast_m),
+ .wvalid_m (wvalid_m),
+ .wid_m (wid_m[AWID_WIDTH-1:0]),
+ .wuser_m (wuser_m[USER_WIDTH-1:0]),
+ .bready_m (bready_m),
+ .arid_m (arid_m[ARID_WIDTH-1:0]),
+ .araddr_m (araddr_m[ADDR_WIDTH-1:0]),
+ .arsize_m (arsize_m[2:0]),
+ .arburst_m (arburst_m[1:0]),
+ .arlock_m (arlock_m[1:0]),
+ .arcache_m (arcache_m[3:0]),
+ .arprot_m (arprot_m[2:0]),
+ .arvalid_m (arvalid_m),
+ .aruser_m (aruser_m[USER_WIDTH-1:0]),
+ .arregion_m (arregion_m[3:0]),
+ .rready_m (rready_m),
+ .aw_ready (aw_ready),
+ .b_data (b_data[B_IDB_WIDTH-1:0]),
+ .b_valid (b_valid),
+ .ar_ready (ar_ready),
+ .r_data (r_data[R_IDB_WIDTH-1:0]),
+ .r_valid (r_valid),
+ .w_ready (w_ready),
+ .awready_m (awready_m),
+ .wready_m (wready_m),
+ .bid_m (bid_m[AWID_WIDTH-1:0]),
+ .bresp_m (bresp_m[1:0]),
+ .bvalid_m (bvalid_m),
+ .buser_m (buser_m[USER_WIDTH-1:0]),
+ .arready_m (arready_m),
+ .rid_m (rid_m[ARID_WIDTH-1:0]),
+ .rdata_m (rdata_m[DS_DATA_WIDTH-1:0]),
+ .rresp_m (rresp_m[1:0]),
+ .rlast_m (rlast_m),
+ .rvalid_m (rvalid_m),
+ .ruser_m (ruser_m[USER_WIDTH-1:0]),
+ .aw_data (aw_data[AW_IDB_WIDTH-1:0]),
+ .aw_valid (aw_valid),
+ .b_ready (b_ready),
+ .ar_data (ar_data[AR_IDB_WIDTH-1:0]),
+ .ar_valid (ar_valid),
+ .r_ready (r_ready),
+ .w_data (w_data[W_IDB_WIDTH-1:0]),
+ .w_valid (w_valid),
+ .aclk (aclk),
+ .aresetn (aresetn));
+endmodule
diff --git a/axi2sramcrs/rtl/upsizer/maskcntl.v b/axi2sramcrs/rtl/upsizer/maskcntl.v
new file mode 100644
index 0000000..ab3fbf2
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/maskcntl.v
@@ -0,0 +1,303 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+//=========================================================================
+//==maskcntl: mask the incoming transctions to garantee the outgoing outstanding transactions
+//====meet the outstanding configs
+//=========================================================================
+module maskcntl
+ (
+ // Master Interface address channel handshake signals
+ awvalid_m,
+ awready_m,
+ arvalid_m,
+ arready_m,
+ // Lock control signals
+ pre_awvalid,
+ pre_arvalid,
+ awlock,
+ arlock,
+ lock_seq,
+ // QoS input signals
+ aw_qos_s,
+ ar_qos_s,
+ // Master Interface return channel handshake signals
+ bvalid_m,
+ bready_m,
+ rvalid_m,
+ rready_m,
+ // Mask signals
+ wr_cnt_empty,
+ mask_w,
+ mask_r,
+ // QoS output signals
+ aw_qos_m,
+ ar_qos_m,
+ // Miscellaneous connections
+ aclk,
+ aresetn
+ );
+
+ // ---------------------------------------------------------------------------
+ // parameters
+ // ---------------------------------------------------------------------------
+//read outstanding issues
+parameter RD_ISS=8;
+//write outstanding issues
+parameter WR_ISS=8;
+
+localparam RCNT_WIDTH=$clog2(RD_ISS+1);
+localparam WCNT_WIDTH=$clog2(WR_ISS+1);
+localparam COMBCNT_WIDTH=(RCNT_WIDTH>WCNT_WIDTH) ? (RCNT_WIDTH+1) : (WCNT_WIDTH+1);
+ // ---------------------------------------------------------------------------
+ // Port definitions
+ // ---------------------------------------------------------------------------
+
+ // Master Interface address channel handshake signals
+ input awvalid_m;
+ input awready_m;
+ input arvalid_m;
+ input arready_m;
+ // Lock control signals
+ input pre_awvalid;
+ input pre_arvalid;
+ input awlock;
+ input arlock;
+ // QoS input signals
+ input [3:0] aw_qos_s;
+ input [3:0] ar_qos_s;
+ // Master Interface return channel handshake signals
+ input bvalid_m;
+ input bready_m;
+ input rvalid_m;
+ input rready_m;
+ // Mask signals
+ output wr_cnt_empty;
+ output mask_w;
+ output mask_r;
+ // QoS output signals
+ output [3:0] aw_qos_m;
+ output [3:0] ar_qos_m;
+ // Lock sequence signal
+ output lock_seq;
+ // Miscelaneous connections
+ input aclk;
+ input aresetn;
+
+ //------------------------------------------------------------------------------
+ // Wires
+ //------------------------------------------------------------------------------
+
+ wire push_rd; // Read address accepted;
+ wire push_wr; // Write address accepted
+ wire pop_rd; // Last read beat accepted
+ wire pop_wr; // Write transaction accepted
+ wire next_wr_cnt_empty; // Next Write counter empty
+ wire wr_cnt_en;
+ wire rd_cnt_en;
+ wire comb_cnt_en;
+ wire wr_mask_en;
+ wire rd_mask_en;
+ wire [RCNT_WIDTH-1:0] next_rd_cnt; // next outstanding reads count
+ wire [WCNT_WIDTH-1:0] next_wr_cnt; // next outstanding writes count
+ reg [COMBCNT_WIDTH-1:0] next_comb_cnt; // next outstanding trans count
+ reg [WCNT_WIDTH-1:0] wr_iss_d;
+ reg [RCNT_WIDTH-1:0] rd_iss_d;
+ reg next_mask_w;
+ reg next_mask_r;
+
+ wire nxt_lock_seq;
+ wire lock_seq_en;
+
+ wire [3:0] aw_qos_s;
+ wire [3:0] ar_qos_s;
+
+
+ //------------------------------------------------------------------------------
+ // Registers
+ //------------------------------------------------------------------------------
+
+ reg [RCNT_WIDTH-1:0] rd_cnt; // outstanding reads count
+ reg [WCNT_WIDTH-1:0] wr_cnt; // outstanding writes count
+ reg [COMBCNT_WIDTH-1:0] comb_cnt; // outstanding trans count
+ reg lock_seq;
+ reg wr_cnt_empty; // Write counter empty
+ reg reg_mask_w;
+ reg reg_mask_r;
+
+ // ---------------------------------------------------------------------------
+ // start of code
+ // ---------------------------------------------------------------------------
+
+ //---------------------------- Drive QoS outputs ----------------------------
+
+
+ // Pass through input Qos Value
+ assign aw_qos_m = aw_qos_s;
+ assign ar_qos_m = ar_qos_s;
+
+
+ //-------------------- Outstanding transaction counters ---------------------
+
+ assign push_rd = arvalid_m & arready_m;
+ assign push_wr = awvalid_m & awready_m;
+
+ assign pop_rd = rvalid_m & rready_m;
+ assign pop_wr = bvalid_m & bready_m;
+
+ // Determine next outstanding read counter
+ assign next_rd_cnt = (push_rd & ~pop_rd) ? rd_cnt + 1'b1
+ : ((~push_rd & pop_rd) ? rd_cnt - 1'b1
+ : rd_cnt);
+
+ // Determine next outstanding write counter
+ assign next_wr_cnt = (push_wr & ~pop_wr) ? wr_cnt + 1'b1
+ : ((~push_wr & pop_wr) ? wr_cnt - 1'b1
+ : wr_cnt);
+
+ // Determine next combined outstanding counter
+ always @(*)
+ begin : p_next_comb
+ case({push_wr, push_rd, pop_wr, pop_rd})
+ 4'b0001,
+ 4'b0010,
+ 4'b0111,
+ 4'b1011 : next_comb_cnt = (comb_cnt - 2'h1);
+ 4'b0011 : next_comb_cnt = (comb_cnt - 2'h2);
+ 4'b0100,
+ 4'b1000,
+ 4'b1101,
+ 4'b1110 : next_comb_cnt = (comb_cnt + 2'h1);
+ 4'b1100 : next_comb_cnt = (comb_cnt + 2'h2);
+ default : next_comb_cnt = comb_cnt;
+ endcase
+ end // p_next_comb
+
+
+
+
+ assign wr_cnt_en = push_wr ^ pop_wr;
+ assign rd_cnt_en = push_rd ^ pop_rd;
+ assign comb_cnt_en = push_wr | push_rd | pop_wr | pop_rd;
+
+ assign next_wr_cnt_empty = (next_wr_cnt == 1'b0);
+
+ always @(posedge aclk or negedge aresetn)
+ begin : p_wr_cnt_seq
+ if (!aresetn)
+ begin
+ wr_cnt <= {WCNT_WIDTH{1'b0}};
+ wr_cnt_empty <= 1'b1;
+ rd_cnt <= {RCNT_WIDTH{1'b0}};
+ comb_cnt <= {3{1'b0}};
+ end
+ else
+ begin
+ if (wr_cnt_en)
+ begin
+ wr_cnt <= next_wr_cnt;
+ wr_cnt_empty <= next_wr_cnt_empty;
+ end
+ if (rd_cnt_en)
+ begin
+ rd_cnt <= next_rd_cnt;
+ end
+ if (comb_cnt_en)
+ begin
+ comb_cnt <= next_comb_cnt;
+ end
+ end
+ end // p_wr_cnt_seq
+
+ //--------------------------- Mask Generation -------------------------------
+
+ always @(next_wr_cnt or next_rd_cnt)
+ begin : p_mask_comb
+ wr_iss_d = WR_ISS;
+ rd_iss_d = RD_ISS;
+
+ next_mask_w = 1'b0;
+ next_mask_r = 1'b0;
+
+ // If the next write count will be reached then
+ // mask all the write slave interfaces
+ if (next_wr_cnt == wr_iss_d )
+ next_mask_w = 1'b1;
+ // If the next read count will be reached then
+ // mask all the read slave interfaces
+ if (next_rd_cnt == rd_iss_d )
+ next_mask_r = 1'b1;
+ end // p_mask_comb
+
+
+
+ assign wr_mask_en =push_wr | pop_wr;
+ assign rd_mask_en = push_rd | pop_rd;
+
+ always @(posedge aclk or negedge aresetn)
+ begin : p_wr_mask_seq
+ if (!aresetn)
+ begin
+ reg_mask_w <= 1'b0;
+ end
+ else if (wr_mask_en)
+ begin
+ reg_mask_w <= next_mask_w;
+ end
+ end // p_wr_mask_seq
+
+ assign mask_w = reg_mask_w;
+
+ always @(posedge aclk or negedge aresetn)
+ begin : p_rd_mask_seq
+ if (!aresetn)
+ begin
+ reg_mask_r <= 1'b0;
+ end
+ else if (rd_mask_en)
+ begin
+ reg_mask_r <= next_mask_r;
+ end
+ end // p_rd_mask_seq
+
+ assign mask_r = reg_mask_r;
+ //--------------------------- Lock Seq Register -------------------------------
+
+ assign nxt_lock_seq = ((pre_awvalid & awlock) | (pre_arvalid & arlock))
+ ? 1'b1
+ : (((pre_awvalid & ~awlock) | (pre_arvalid & ~arlock)) & ~|comb_cnt
+ ? 1'b0
+ : lock_seq);
+
+ assign lock_seq_en = pre_awvalid || pre_arvalid;
+
+ always @(posedge aclk or negedge aresetn)
+ begin : p_lock_seq
+ if (!aresetn)
+ begin
+ lock_seq <= 1'b0;
+ end
+ else if (lock_seq_en)
+ begin
+ lock_seq <= nxt_lock_seq;
+ end
+ end // p_lock_seq
+
+ endmodule
diff --git a/axi2sramcrs/rtl/upsizer/upsize_master_domain.v b/axi2sramcrs/rtl/upsizer/upsize_master_domain.v
new file mode 100644
index 0000000..a3565fe
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_master_domain.v
@@ -0,0 +1,233 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`include "Axi.v"
+module upsize_master_domain
+ (
+ awid_m, awaddr_m, awlen_m, awsize_m, awburst_m, awlock_m,
+ awcache_m, awprot_m, awvalid_m, awvalid_vect_m, awuser_m,
+ awregion_m, wdata_m, wstrb_m, wlast_m, wvalid_m, wid_m, wuser_m,
+ bready_m, arid_m, araddr_m, arlen_m, arsize_m, arburst_m, arlock_m,
+ arcache_m, arprot_m, arvalid_m, arvalid_vect_m, aruser_m,
+ arregion_m, rready_m, awqv_m, arqv_m, aw_ready, b_data, b_valid,
+ ar_ready, r_data, r_valid, w_ready,
+ awready_m, wready_m, bid_m, bresp_m, bvalid_m, buser_m, arready_m,
+ rid_m, rdata_m, rresp_m, rlast_m, rvalid_m, ruser_m, aw_data,
+ aw_valid, b_ready, ar_data, ar_valid, r_ready, w_data, w_valid,
+ aclk, aresetn
+ );
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=4;
+parameter RD_ISS=8;
+parameter WR_ISS=8;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH;
+localparam W_IDB_WIDTH=AWID_WIDTH+USER_WIDTH+DS_DATA_WIDTH+DS_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+DS_DATA_WIDTH+2+1;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+ output [AWID_WIDTH-1:0] awid_m;
+ output [ADDR_WIDTH-1:0] awaddr_m;
+ output [7:0] awlen_m;
+ output [2:0] awsize_m;
+ output [1:0] awburst_m;
+ output [1:0] awlock_m;
+ output [3:0] awcache_m;
+ output [2:0] awprot_m;
+ output awvalid_m;
+ output awvalid_vect_m;
+ input awready_m;
+ output [USER_WIDTH-1:0] awuser_m;
+ output [3:0] awregion_m;
+ output [DS_DATA_WIDTH-1:0] wdata_m;
+ output [DS_WSTRB_WIDTH-1:0] wstrb_m;
+ output wlast_m;
+ output wvalid_m;
+ input wready_m;
+ output [AWID_WIDTH-1:0] wid_m;
+ output [USER_WIDTH-1:0] wuser_m;
+ input [AWID_WIDTH-1:0] bid_m;
+ input [1:0] bresp_m;
+ input bvalid_m;
+ output bready_m;
+ input [USER_WIDTH-1:0] buser_m;
+ output [ARID_WIDTH-1:0] arid_m;
+ output [ADDR_WIDTH-1:0] araddr_m;
+ output [7:0] arlen_m;
+ output [2:0] arsize_m;
+ output [1:0] arburst_m;
+ output [1:0] arlock_m;
+ output [3:0] arcache_m;
+ output [2:0] arprot_m;
+ output arvalid_m;
+ output arvalid_vect_m;
+ input arready_m;
+ output [USER_WIDTH-1:0] aruser_m;
+ output [3:0] arregion_m;
+ input [ARID_WIDTH-1:0] rid_m;
+ input [DS_DATA_WIDTH-1:0] rdata_m;
+ input [1:0] rresp_m;
+ input rlast_m;
+ input rvalid_m;
+ output rready_m;
+ input [USER_WIDTH-1:0] ruser_m;
+ output [3:0] awqv_m;
+ output [3:0] arqv_m;
+ input [AW_IDB_WIDTH-1:0] aw_data;
+ input aw_valid;
+ output aw_ready;
+ output [B_IDB_WIDTH-1:0] b_data;
+ output b_valid;
+ input b_ready;
+ input [AR_IDB_WIDTH-1:0] ar_data;
+ input ar_valid;
+ output ar_ready;
+ output [R_IDB_WIDTH-1:0] r_data;
+ output r_valid;
+ input r_ready;
+ input [W_IDB_WIDTH-1:0] w_data;
+ input w_valid;
+ output w_ready;
+ input aclk;
+ input aresetn;
+ wire awvalid_master;
+ wire awready_master;
+ wire arvalid_master;
+ wire arready_master;
+ wire bvalid_master;
+ wire bready_master;
+ wire rvalid_master;
+ wire awvalid_vector;
+ wire arvalid_vector;
+ wire wr_cnt_empty;
+ wire mask_w;
+ wire mask_r;
+ wire [3:0] aw_qos_s;
+ wire [3:0] ar_qos_s;
+ wire awvalid_lock;
+ wire arvalid_lock;
+ wire lock_seq;
+ assign {
+ awregion_m,
+ awuser_m,
+ awid_m,
+ awaddr_m,
+ awlen_m,
+ awsize_m,
+ awburst_m,
+ awlock_m,
+ awcache_m,
+ aw_qos_s,
+ awprot_m,
+ awvalid_vector} = aw_data;
+ assign awvalid_master = aw_valid;
+ assign aw_ready = awready_master;
+ assign {
+ arregion_m,
+ aruser_m,
+ arid_m,
+ araddr_m,
+ arlen_m,
+ arsize_m,
+ arburst_m,
+ arlock_m,
+ arcache_m,
+ ar_qos_s,
+ arprot_m,
+ arvalid_vector} = ar_data;
+ assign arvalid_master= ar_valid;
+ assign ar_ready = arready_master;
+ assign {
+ wid_m,
+ wuser_m,
+ wdata_m,
+ wstrb_m,
+ wlast_m} = w_data;
+ assign wvalid_m= w_valid;
+ assign w_ready = wready_m;
+ assign r_data = {
+ ruser_m,
+ rid_m,
+ rdata_m,
+ rresp_m,
+ rlast_m};
+ assign r_valid = rvalid_m;
+ assign rready_m= r_ready;
+ assign b_data = {
+ buser_m,
+ bid_m,
+ bresp_m};
+ assign b_valid = bvalid_master;
+ assign bready_master = b_ready;
+maskcntl #(
+ .RD_ISS(RD_ISS),
+ .WR_ISS(WR_ISS)
+ ) u_maskcntl (
+ .awvalid_m (awvalid_master),
+ .arvalid_m (arvalid_master),
+ .awready_m (awready_master),
+ .arready_m (arready_master),
+ .aw_qos_s (aw_qos_s),
+ .ar_qos_s (ar_qos_s),
+ .bvalid_m (bvalid_master),
+ .bready_m (bready_master),
+ .rvalid_m (rvalid_master),
+ .rready_m (rready_m),
+ .pre_awvalid (awvalid_master),
+ .pre_arvalid (arvalid_master),
+ .awlock (awlock_m[1]),
+ .arlock (arlock_m[1]),
+ .lock_seq (lock_seq),
+ .wr_cnt_empty (wr_cnt_empty),
+ .mask_w (mask_w),
+ .mask_r (mask_r),
+ .aw_qos_m (awqv_m),
+ .ar_qos_m (arqv_m),
+ .aclk (aclk),
+ .aresetn (aresetn)
+ );
+ assign awvalid_lock = (awvalid_master & awlock_m[1]);
+ assign arvalid_lock = (arvalid_master & arlock_m[1]);
+ assign awvalid_m = ~mask_w & ((awvalid_master & ~lock_seq) | awvalid_lock);
+ assign arvalid_m = ~mask_r & ((arvalid_master & ~lock_seq) | arvalid_lock);
+ assign awready_master = (awready_m & (~lock_seq | (awvalid_master & awlock_m[1])) & !mask_w);
+ assign arready_master = (arready_m & (~lock_seq | (arvalid_master & arlock_m[1])) & !mask_r);
+ assign bvalid_master = (bvalid_m & !wr_cnt_empty);
+ assign bready_m = (bready_master & !wr_cnt_empty);
+ assign rvalid_master = rvalid_m & rlast_m;
+ assign awvalid_vect_m = ({1{awvalid_m}} & awvalid_vector);
+ assign arvalid_vect_m = ({1{arvalid_m}} & arvalid_vector);
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_rd_addr_fmt.v b/axi2sramcrs/rtl/upsizer/upsize_rd_addr_fmt.v
new file mode 100644
index 0000000..6f5ab9d
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_rd_addr_fmt.v
@@ -0,0 +1,774 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_rd_addr_fmt
+ (
+ ar_lock_hndshk, ar_unlock_hndshk, ardata_valid, ardata_data,
+ arready_s, arid_m, araddr_m, arlen_m, arsize_m, arburst_m,
+ arcache_m, arprot_m, arlock_m, arvalid_m, aruser_m, arregion_m,
+ aclk, aresetn, lock_seq, ardata_ready, arid_s, araddr_s, arlen_s,
+ arsize_s, arburst_s, arcache_s, arprot_s, arvalid_s, arlock_s,
+ aruser_s, arregion_s, arready_m
+ );
+`include "Axi.v"
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=4;
+parameter DS_AXI3=1'h1;
+localparam US_AXLEN_WIDTH=8;
+localparam DS_AXLEN_WIDTH=8;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH+US_ADDR_AL_WIDTH-DS_ADDR_AL_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH+ARFMT_WIDTH;
+localparam W_IDB_WIDTH=USER_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1+DS_ADDR_AL_WIDTH;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+localparam RDATA_CAM_WIDTH_UP =DS_ADDR_AL_WIDTH-US_ADDR_AL_WIDTH;
+localparam TOTAL_BYTES_WIDTH = US_ADDR_AL_WIDTH+8;
+ input aclk;
+ input aresetn;
+ input lock_seq;
+ output ar_lock_hndshk;
+ output ar_unlock_hndshk;
+ input ardata_ready;
+ output ardata_valid;
+ output [ARFMT_WIDTH-1:0] ardata_data;
+ input [ARID_WIDTH-1:0] arid_s;
+ input [ADDR_WIDTH-1:0] araddr_s;
+ input [US_AXLEN_WIDTH-1:0] arlen_s;
+ input [2:0] arsize_s;
+ input [1:0] arburst_s;
+ input [3:0] arcache_s;
+ input [2:0] arprot_s;
+ input arvalid_s;
+ input [1:0] arlock_s;
+ output arready_s;
+ input [USER_WIDTH-1:0] aruser_s;
+ input [3:0] arregion_s;
+ output [ARID_WIDTH-1:0] arid_m;
+ output [ADDR_WIDTH-1:0] araddr_m;
+ output [DS_AXLEN_WIDTH-1:0] arlen_m;
+ output [2:0] arsize_m;
+ output [1:0] arburst_m;
+ output [3:0] arcache_m;
+ output [2:0] arprot_m;
+ output [1:0] arlock_m;
+ output arvalid_m;
+ input arready_m;
+ output [USER_WIDTH-1:0] aruser_m;
+ output [3:0] arregion_m;
+ reg [ADDR_WIDTH-1:0] araddro; // transaction start address (int)
+ reg [7:0] arleno; // transaction length (int)
+ reg [2:0] arsizeo; // transaction transfer size (int)
+ reg [1:0] arbursto; // transaction burst type (int)
+ reg [ARID_WIDTH-1:0] arido;
+ reg [3:0] arcacheo;
+ reg [2:0] arproto;
+ reg [1:0] arlocko;
+ reg [USER_WIDTH-1:0] arusero;
+ reg [3:0] arregiono;
+ reg excl_override_reg;
+ reg busy_reg;
+ reg [TOTAL_BYTES_WIDTH-1:0] wrap_bytes_remaining_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] align_mask;
+ reg [DS_ADDR_AL_WIDTH-1:0] read_mask;
+ wire n_response;
+ reg [TOTAL_BYTES_WIDTH-1:0] total_bytes;
+ reg [TOTAL_BYTES_WIDTH-1:0] total_bytes_masked;
+ reg [2:0] wrapsize;
+ reg [2:0] wrapfitsize;
+ reg [3:0] wraplen;
+ reg [DS_ADDR_AL_WIDTH:0] wrapalignmask;
+ reg wrap_split_reg;
+ reg [2:0] incrsize;
+ wire slave_hndshk;
+ wire master_hndshk;
+ wire bypass;
+ wire [ADDR_WIDTH-1:0] araddr_aligned;
+ wire [DS_ADDR_AL_WIDTH+8-1:0] total_bytes_ext;
+ wire [TOTAL_BYTES_WIDTH-1:0] wrap_boundary_mask;
+ wire wrap_aligned;
+ wire wrap_is_incr;
+ wire wrap_split;
+ wire wrap_fits;
+ wire [TOTAL_BYTES_WIDTH-1:0] wrap_fits_mask;
+ wire [DS_ADDR_AL_WIDTH:0] working_addr;
+ wire wrap_split_reg_nxt;
+ wire wrap_split_reg_wr_en;
+ wire wrap_info_write_en;
+ wire [TOTAL_BYTES_WIDTH-1:0] next_wrap_bytes_remaining_reg;
+ wire [TOTAL_BYTES_WIDTH-1:0] addr_less_one;
+ wire [7:0] wraplen_i;
+ wire [7:0] arlen_1;
+ wire [7:0] incrlen;
+ wire [TOTAL_BYTES_WIDTH-1:0] bytes_to_transfer;
+ wire [TOTAL_BYTES_WIDTH+8-1:0] bytes_to_transfer_large;
+ wire [TOTAL_BYTES_WIDTH-1:0] bytes_to_transfer_wrap1;
+ wire [DS_ADDR_AL_WIDTH-1:0] offset_address;
+ wire [7:0] incrlenmaxsize;
+ wire [DS_ADDR_AL_WIDTH:0] final_address;
+ wire overflow;
+ wire bytes_lt_one_byte;
+ wire bytes_lt_two_byte;
+ wire bytes_lt_two_half;
+ wire bytes_lt_four_half;
+ wire half_carry;
+ wire half_carry_double;
+ wire bytes_lt_four_word;
+ wire bytes_lt_eight_word;
+ wire [2:0] word_carry;
+ wire word_carry_double;
+ wire bytes_lt_eight_dword;
+ wire bytes_lt_sixt_dword;
+ wire [3:0] dword_carry;
+ wire dword_carry_double;
+ wire bytes_lt_sixt_qword;
+ wire bytes_lt_ttwo_qword;
+ wire [4:0] qword_carry;
+ wire qword_carry_double;
+ wire bytes_lt_ttwo_oword;
+ wire bytes_lt_sfour_oword;
+ wire [5:0] oword_carry;
+ wire oword_carry_double;
+ wire buffers_ok;
+ wire new_transaction;
+ wire trans_in_progress;
+ wire new_trans_avail;
+ wire trans_complete;
+ wire next_busy_reg;
+ wire busy_reg_wr_en;
+ wire excl_override;
+ assign slave_hndshk = arvalid_s & arready_s;
+ assign master_hndshk = arvalid_m & arready_m;
+assign ardata_data = {
+ wrap_fits,
+ n_response,
+ arid_s,
+ ((arburst_s == `AXI_ABURST_WRAP) & ~wrap_is_incr) ? addr_less_one[DS_ADDR_AL_WIDTH-1:0] & align_mask : final_address[DS_ADDR_AL_WIDTH-1:0] & align_mask,
+ read_mask,
+ araddr_s[DS_ADDR_AL_WIDTH-1:0] & align_mask,
+ bypass,
+ arsize_s
+ };
+ assign ardata_valid = new_transaction;
+ always @(*)
+ begin : p_new_addr_incr_en_r
+ read_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ case (arburst_s)
+ `AXI_ABURST_FIXED : read_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ `AXI_ABURST_WRAP : read_mask = total_bytes[DS_ADDR_AL_WIDTH-1:0];
+ `AXI_ABURST_INCR : read_mask = {DS_ADDR_AL_WIDTH{1'b1}};
+ default : read_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ endcase
+ end
+ assign n_response = wrap_split;
+ assign buffers_ok = ardata_ready;
+ assign trans_complete = ~(wrap_split & ~wrap_split_reg);
+ assign trans_in_progress = new_transaction | busy_reg;
+ assign new_transaction = new_trans_avail & buffers_ok;
+ assign new_trans_avail = arvalid_s & ~busy_reg;
+ assign next_busy_reg = (trans_complete & slave_hndshk) ? 1'b0 :
+ ((new_transaction & ~slave_hndshk) ? 1'b1 : busy_reg);
+ assign busy_reg_wr_en = busy_reg ^ next_busy_reg;
+ always @(posedge aclk or negedge aresetn)
+ begin : busy_reg_p
+ if (!aresetn) begin
+ busy_reg <= 1'b0;
+ end else if (busy_reg_wr_en) begin
+ busy_reg <= next_busy_reg;
+ end
+ end
+ assign excl_override = (new_transaction) ? n_response | (|arleno[7:4]) : excl_override_reg;
+ always @(posedge aclk or negedge aresetn)
+ begin : excl_override_reg_p
+ if (!aresetn) begin
+ excl_override_reg <= 1'b0;
+ end else if (new_transaction) begin
+ excl_override_reg <= excl_override;
+ end
+ end
+ assign arid_m = arido;
+ assign arcache_m = arcacheo;
+ assign arprot_m = arproto;
+ assign arlen_m = arleno;
+ assign arsize_m = arsizeo;
+ assign araddr_m = araddro;
+ assign arburst_m = arbursto;
+ assign arlock_m = arlocko;
+ assign aruser_m = arusero;
+ assign arregion_m = arregiono;
+ assign arvalid_m = arvalid_s && trans_in_progress;
+ assign arready_s = master_hndshk && trans_complete;
+ always @(*) begin
+ arleno = incrlen;
+ arsizeo = incrsize;
+ arbursto = `AXI_ABURST_INCR;
+ arido = arid_s;
+ arcacheo = arcache_s;
+ arproto = arprot_s;
+ arusero = aruser_s;
+ arregiono = arregion_s;
+ araddro = araddr_aligned;
+ arlocko = {(arlock_s[1] | (lock_seq & ~trans_complete)),(arlock_s[0] && (~excl_override))};
+ if (!wrap_split_reg) begin
+ araddro = araddr_s;
+ if (wrap_aligned) begin
+ arleno = wraplen_i;
+ arsizeo = wrapsize;
+ arbursto = `AXI_ABURST_WRAP;
+ end else if (bypass) begin
+ arleno = arlen_s;
+ arsizeo = arsize_s;
+ arbursto = arburst_s;
+ end else if (wrap_fits) begin
+ araddro = araddr_aligned;
+ arleno = arlen_1;
+ arsizeo = wrapfitsize;
+ arbursto = `AXI_ABURST_INCR;
+ end
+ end
+ end
+ assign wraplen_i = {4'b0000,wraplen};
+ assign arlen_1 = {4'b0000,`AXI_ALEN_1};
+ assign addr_less_one = araddr_s[TOTAL_BYTES_WIDTH-1:0] - {{TOTAL_BYTES_WIDTH{1'b0}},1'b1};
+ assign next_wrap_bytes_remaining_reg = (addr_less_one & total_bytes);
+ assign wrap_info_write_en = wrap_split & master_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : wrap_bytes_remaining_reg_p
+ if (!aresetn) begin
+ wrap_bytes_remaining_reg <= {TOTAL_BYTES_WIDTH{1'b0}};
+ end else if (wrap_info_write_en) begin
+ wrap_bytes_remaining_reg <= next_wrap_bytes_remaining_reg;
+ end
+ end
+ assign araddr_aligned = {araddr_s[ADDR_WIDTH-1:TOTAL_BYTES_WIDTH],((araddr_s[TOTAL_BYTES_WIDTH-1:0]) & (~total_bytes))};
+ assign wrap_split_reg_nxt = wrap_split & ~(wrap_split_reg);
+ assign wrap_split_reg_wr_en = master_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : wrap_split_p
+ if (!aresetn)
+ wrap_split_reg <= 1'b0;
+ else if (wrap_split_reg_wr_en)
+ wrap_split_reg <= wrap_split_reg_nxt;
+ end
+ assign ar_lock_hndshk = (slave_hndshk & arlock_s[1]);
+ assign ar_unlock_hndshk = (master_hndshk & ~arlock_m[1]);
+ assign bypass = (arburst_s == `AXI_ABURST_FIXED ) || ~arcache_s[1] || (arlen_s == `AXI_ALEN_1);
+
+generate
+
+if(TOTAL_BYTES_WIDTH == 10) begin: tb10
+always @(*)
+ begin : total_bytes_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes = {2'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes = {1'h0, arlen_s, 1'b1};
+ `AXI_ASIZE_32 : total_bytes = { arlen_s, 2'b11};
+ `AXI_ASIZE_64 : total_bytes = { arlen_s[6:0], 3'b111};
+ `AXI_ASIZE_128 : total_bytes = { arlen_s[5:0], 4'b1111};
+ `AXI_ASIZE_256 : total_bytes = { arlen_s[4:0], 5'b11111};
+ `AXI_ASIZE_512 : total_bytes = { arlen_s[3:0], 6'b111111};
+ `AXI_ASIZE_1024 : total_bytes = {2'h0, arlen_s};
+ default : total_bytes = {10'hx};
+ endcase
+ end
+end
+else if(TOTAL_BYTES_WIDTH == 11) begin: tb11
+always @(*)
+ begin : total_bytes_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes = {3'b0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes = {2'b0, arlen_s, 1'b1};
+ `AXI_ASIZE_32 : total_bytes = {1'b0, arlen_s, 2'b11};
+ `AXI_ASIZE_64 : total_bytes = { arlen_s, 3'b111};
+ `AXI_ASIZE_128 : total_bytes = { arlen_s[6:0], 4'b1111};
+ `AXI_ASIZE_256 : total_bytes = { arlen_s[5:0], 5'b11111};
+ `AXI_ASIZE_512 : total_bytes = { arlen_s[4:0], 6'b111111};
+ `AXI_ASIZE_1024 : total_bytes = {3'b0, arlen_s};
+ default : total_bytes = {11'b0};
+ endcase
+ end
+
+end
+else if(TOTAL_BYTES_WIDTH == 12) begin: tb12
+always @(*)
+ begin : total_bytes_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes = {4'b0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes = {3'b0, arlen_s, 1'b1};
+ `AXI_ASIZE_32 : total_bytes = {2'b0, arlen_s, 2'b11};
+ `AXI_ASIZE_64 : total_bytes = {1'b0, arlen_s, 3'b111};
+ `AXI_ASIZE_128 : total_bytes = { arlen_s, 4'b1111};
+ `AXI_ASIZE_256 : total_bytes = { arlen_s[6:0], 5'b11111};
+ `AXI_ASIZE_512 : total_bytes = { arlen_s[5:0], 6'b111111};
+ `AXI_ASIZE_1024 : total_bytes = {4'b0, arlen_s};
+ default : total_bytes = {12'b0};
+ endcase
+ end
+
+end
+else if(TOTAL_BYTES_WIDTH == 13) begin: tb13
+always @(*)
+ begin : total_bytes_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes = {5'b0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes = {4'b0, arlen_s, 1'b1};
+ `AXI_ASIZE_32 : total_bytes = {3'b0, arlen_s, 2'b11};
+ `AXI_ASIZE_64 : total_bytes = {2'b0, arlen_s, 3'b111};
+ `AXI_ASIZE_128 : total_bytes = {1'b0, arlen_s, 4'b1111};
+ `AXI_ASIZE_256 : total_bytes = { arlen_s, 5'b11111};
+ `AXI_ASIZE_512 : total_bytes = { arlen_s[6:0], 6'b111111};
+ `AXI_ASIZE_1024 : total_bytes = {5'b0, arlen_s};
+ default : total_bytes = {13'b0};
+ endcase
+ end
+
+end
+
+else begin: tb_o
+
+always @(*)
+ begin : total_bytes_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes = {6'b0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes = {5'b0, arlen_s, 1'b1};
+ `AXI_ASIZE_32 : total_bytes = {4'b0, arlen_s, 2'b11};
+ `AXI_ASIZE_64 : total_bytes = {3'b0, arlen_s, 3'b111};
+ `AXI_ASIZE_128 : total_bytes = {2'b0, arlen_s, 4'b1111};
+ `AXI_ASIZE_256 : total_bytes = {1'b0, arlen_s, 5'b11111};
+ `AXI_ASIZE_512 : total_bytes = { arlen_s, 6'b111111};
+ `AXI_ASIZE_1024 : total_bytes = {6'b0, arlen_s};
+ default : total_bytes = {14'b0};
+ endcase
+ end
+
+end
+
+endgenerate
+
+
+ assign total_bytes_ext = { {RDATA_CAM_WIDTH_UP{1'b0}},total_bytes };
+
+
+generate
+
+if(DS_DATA_WIDTH==512) begin: wmsk_512
+
+always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[6]&&(DS_DATA_WIDTH>=512)) begin
+ wrapfitsize = `AXI_ASIZE_1024;
+ wrapsize = `AXI_ASIZE_512;
+ wraplen = total_bytes_ext[9:6];
+ wrapalignmask = {1'b0, 6'b111111};
+ end else if (total_bytes_ext[5]&&(DS_DATA_WIDTH>=256)) begin
+ wrapfitsize = `AXI_ASIZE_512;
+ wrapsize = `AXI_ASIZE_256;
+ wraplen = total_bytes_ext[8:5];
+ wrapalignmask = {2'b0, 5'b11111};
+ end else if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+
+end
+
+if(DS_DATA_WIDTH==256) begin: wmsk_256
+
+always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[5]&&(DS_DATA_WIDTH>=256)) begin
+ wrapfitsize = `AXI_ASIZE_512;
+ wrapsize = `AXI_ASIZE_256;
+ wraplen = total_bytes_ext[8:5];
+ wrapalignmask = {2'b0, 5'b11111};
+ end else if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;//x;
+ wrapsize = 3'b0;//x;
+ wraplen = 4'b0;//x;
+ wrapalignmask = 7'b0;//x;
+ end
+ end
+
+end
+
+if(DS_DATA_WIDTH==128) begin: wmsk_128
+
+always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;//x;
+ wrapsize = 3'b0;//x;
+ wraplen = 4'b0;//x;
+ wrapalignmask = 7'b0;//x;
+ end
+ end
+
+end
+if(DS_DATA_WIDTH==64) begin: wmsk_64
+
+always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+
+end
+
+if(DS_DATA_WIDTH==32) begin: wmsk_32
+
+always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+
+end
+
+endgenerate
+
+
+ assign working_addr = araddr_s[DS_ADDR_AL_WIDTH:0] & wrapalignmask;
+ assign wrap_fits_mask = ({(TOTAL_BYTES_WIDTH-DS_ADDR_AL_WIDTH){1'b1}}<<DS_ADDR_AL_WIDTH);
+ assign wrap_fits = ~|(total_bytes & wrap_fits_mask) & (arburst_s == `AXI_ABURST_WRAP);
+ assign wrap_is_incr = ~|(araddr_s[TOTAL_BYTES_WIDTH-1:0] & total_bytes);
+ assign wrap_aligned = ~|working_addr & (arburst_s == `AXI_ABURST_WRAP) & ~bypass & ~wrap_is_incr & ~wrap_fits ;
+ assign wrap_split = ((|working_addr)) & (arburst_s == `AXI_ABURST_WRAP) & ~bypass & ~wrap_fits;
+ assign wrap_boundary_mask = total_bytes;
+ assign bytes_to_transfer_wrap1 = ~(araddr_s[TOTAL_BYTES_WIDTH-1:0]) & wrap_boundary_mask;
+ assign bytes_to_transfer = (wrap_split_reg) ? wrap_bytes_remaining_reg
+ : ((arburst_s == `AXI_ABURST_WRAP) ? bytes_to_transfer_wrap1
+ : total_bytes_masked);
+generate
+if(TOTAL_BYTES_WIDTH == 10) begin:tbm10
+always @(*)
+ begin : total_bytes_masked_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes_masked = { 2'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes_masked = { 1'h0, arlen_s, ~araddr_s[0]};
+ `AXI_ASIZE_32 : total_bytes_masked = { arlen_s, ~araddr_s[1:0]};
+ `AXI_ASIZE_64 : total_bytes_masked = { arlen_s[6:0], ~araddr_s[2:0]};
+ `AXI_ASIZE_128 : total_bytes_masked = { arlen_s[5:0], ~araddr_s[3:0]};
+ `AXI_ASIZE_256 : total_bytes_masked = { arlen_s[4:0], ~araddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { arlen_s[3:0], ~araddr_s[5:0]};
+ `AXI_ASIZE_1024 : total_bytes_masked = { 2'h0, arlen_s};
+ default : total_bytes_masked = {10{1'b0}};
+ endcase
+ end
+end
+
+
+else if(TOTAL_BYTES_WIDTH == 11) begin:tbm11
+always @(*)
+ begin : total_bytes_masked_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes_masked = { 3'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes_masked = { 2'h0, arlen_s, ~araddr_s[0]};
+ `AXI_ASIZE_32 : total_bytes_masked = { 1'h0, arlen_s, ~araddr_s[1:0]};
+ `AXI_ASIZE_64 : total_bytes_masked = { arlen_s, ~araddr_s[2:0]};
+ `AXI_ASIZE_128 : total_bytes_masked = { arlen_s[6:0], ~araddr_s[3:0]};
+ `AXI_ASIZE_256 : total_bytes_masked = { arlen_s[5:0], ~araddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { arlen_s[4:0], ~araddr_s[5:0]};
+ `AXI_ASIZE_1024 : total_bytes_masked = { 3'h0, arlen_s};
+ default : total_bytes_masked = {11{1'b0}};
+ endcase
+ end
+end
+
+
+else if(TOTAL_BYTES_WIDTH == 12) begin:tbm12
+always @(*)
+ begin : total_bytes_masked_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes_masked = { 4'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes_masked = { 3'h0, arlen_s, ~araddr_s[0]};
+ `AXI_ASIZE_32 : total_bytes_masked = { 2'h0, arlen_s, ~araddr_s[1:0]};
+ `AXI_ASIZE_64 : total_bytes_masked = { 1'b0, arlen_s, ~araddr_s[2:0]};
+ `AXI_ASIZE_128 : total_bytes_masked = { arlen_s, ~araddr_s[3:0]};
+ `AXI_ASIZE_256 : total_bytes_masked = { arlen_s[6:0], ~araddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { arlen_s[5:0], ~araddr_s[5:0]};
+ `AXI_ASIZE_1024 : total_bytes_masked = { 4'h0, arlen_s};
+ default : total_bytes_masked = {12{1'b0}};
+ endcase
+ end
+end
+
+
+else if(TOTAL_BYTES_WIDTH == 13) begin:tbm13
+always @(*)
+ begin : total_bytes_masked_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes_masked = { 5'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes_masked = { 4'h0, arlen_s, ~araddr_s[0]};
+ `AXI_ASIZE_32 : total_bytes_masked = { 3'h0, arlen_s, ~araddr_s[1:0]};
+ `AXI_ASIZE_64 : total_bytes_masked = { 2'h0, arlen_s, ~araddr_s[2:0]};
+ `AXI_ASIZE_128 : total_bytes_masked = { 1'h0, arlen_s, ~araddr_s[3:0]};
+ `AXI_ASIZE_256 : total_bytes_masked = { arlen_s, ~araddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { arlen_s[6:0], ~araddr_s[5:0]};
+ `AXI_ASIZE_1024 : total_bytes_masked = { 5'h0, arlen_s};
+ default : total_bytes_masked = {13{1'b0}};
+ endcase
+ end
+end
+
+
+else begin:tbm_o
+always @(*)
+ begin : total_bytes_masked_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : total_bytes_masked = { 6'h0, arlen_s};
+ `AXI_ASIZE_16 : total_bytes_masked = { 5'h0, arlen_s, ~araddr_s[0]};
+ `AXI_ASIZE_32 : total_bytes_masked = { 4'h0, arlen_s, ~araddr_s[1:0]};
+ `AXI_ASIZE_64 : total_bytes_masked = { 3'h0, arlen_s, ~araddr_s[2:0]};
+ `AXI_ASIZE_128 : total_bytes_masked = { 2'h0, arlen_s, ~araddr_s[3:0]};
+ `AXI_ASIZE_256 : total_bytes_masked = { 1'h0, arlen_s, ~araddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { arlen_s, ~araddr_s[5:0]};
+ `AXI_ASIZE_1024 : total_bytes_masked = { 6'h0, arlen_s};
+ default : total_bytes_masked = {14{1'b0}};
+ endcase
+ end
+end
+
+
+endgenerate
+
+
+
+
+ always @(*)
+ begin : align_mask_p
+ case (arsize_s)
+ `AXI_ASIZE_8 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}};
+ `AXI_ASIZE_16 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<1;
+ `AXI_ASIZE_32 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<2;
+ `AXI_ASIZE_64 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<3;
+ `AXI_ASIZE_128 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<4;
+ `AXI_ASIZE_256 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<5;
+ `AXI_ASIZE_512 : align_mask = {DS_ADDR_AL_WIDTH{1'b1}}<<6;
+ default : align_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ endcase
+ end
+ assign offset_address = (wrap_split_reg) ? araddr_aligned[DS_ADDR_AL_WIDTH-1:0] :
+ araddr_s[DS_ADDR_AL_WIDTH-1:0];
+ assign half_carry = bytes_to_transfer[0] & offset_address[0];
+ assign half_carry_double = half_carry & bytes_to_transfer[1];
+ assign word_carry = {1'b0, bytes_to_transfer[1:0]} + {1'b0, offset_address[1:0]};
+ assign word_carry_double = word_carry[2] & bytes_to_transfer[2];
+generate
+ if(DS_DATA_WIDTH>=64) begin: dword_carry_64
+ assign dword_carry = {1'b0, bytes_to_transfer[2:0]} + {1'b0, offset_address[2:0]};
+ assign dword_carry_double = dword_carry[3] & bytes_to_transfer[3];
+ end
+ else begin: dword_carry_useless
+ assign dword_carry=4'h0;
+ assign dword_carry_double=1'h0;
+ end
+endgenerate
+generate
+ if(DS_DATA_WIDTH>=128) begin: qword_carry_128
+ assign qword_carry = {1'b0, bytes_to_transfer[3:0]} + {1'b0, offset_address[3:0]};
+ assign qword_carry_double = qword_carry[4] & bytes_to_transfer[4];
+ end
+ else begin: qword_carry_useless
+ assign qword_carry=5'h0;
+ assign qword_carry_double=1'h0;
+ end
+endgenerate
+generate
+ if(DS_DATA_WIDTH>=256) begin: oword_carry_256
+ assign oword_carry = {1'b0, bytes_to_transfer[4:0]} + {1'b0, offset_address[4:0]};
+ assign oword_carry_double = oword_carry[5] & bytes_to_transfer[5];
+ end
+ else begin: oword_carry_useless
+ assign oword_carry=6'h0;
+ assign oword_carry_double=1'h0;
+ end
+endgenerate
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ assign bytes_lt_sixt_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~qword_carry[4];
+ assign bytes_lt_ttwo_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~qword_carry_double;
+ assign bytes_lt_ttwo_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~oword_carry[5];
+ assign bytes_lt_sfour_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:6] & ~oword_carry_double;
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end else if ((bytes_lt_sixt_qword || (bytes_lt_ttwo_qword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=5) ? 4:0)])))&&(DS_DATA_WIDTH>=256)) begin
+ incrsize = `AXI_ASIZE_128;
+ end else if ((bytes_lt_ttwo_oword || (bytes_lt_sfour_oword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=6) ? 5:0)])))&&(DS_DATA_WIDTH>=512)) begin
+ incrsize = `AXI_ASIZE_256;
+ end
+ end
+ assign final_address = {1'b0, offset_address} + {1'b0, bytes_to_transfer_large[DS_ADDR_AL_WIDTH-1:0]};
+ assign overflow = final_address[DS_ADDR_AL_WIDTH];
+ assign bytes_to_transfer_large = {8'h0, bytes_to_transfer};
+ assign incrlenmaxsize = bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:((DS_AXI3==1) ? 4 : 8)] + 4'b1;
+ assign incrlen = (overflow) ? incrlenmaxsize : ((DS_AXI3==1) ? {4'b0000,bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:4]} : bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:8]);
+
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_rd_cam_slice.v b/axi2sramcrs/rtl/upsizer/upsize_rd_cam_slice.v
new file mode 100644
index 0000000..4656541
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_rd_cam_slice.v
@@ -0,0 +1,263 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_rd_cam_slice
+ (
+ aresetn,
+ aclk,
+ match_id,
+ store,
+ push_slice,
+ pop_slice,
+ update,
+ match_pointer,
+ hazard_in,
+ hazard_pointer,
+ archannel_data,
+ rlast_in,
+ hazard,
+ match,
+ addr_out,
+ last_addr_match,
+ valid,
+ beat_complete,
+ rdata_byte_mask
+ );
+`include "Axi.v"
+parameter ARID_WIDTH=4;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter RD_ISS=8;
+parameter ARCHAN_WIDTH=20;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam PTR_WIDTH=$clog2(RD_ISS+1);
+localparam UPSIZE_WIDTH=DS_ADDR_AL_WIDTH-US_ADDR_AL_WIDTH;
+ input aresetn;
+ input aclk;
+ input [ARID_WIDTH-1:0] match_id;
+ input store;
+ input push_slice;
+ input pop_slice;
+ input update;
+ input [PTR_WIDTH-1:0] hazard_pointer;
+ input [PTR_WIDTH-1:0] match_pointer;
+ input hazard_in;
+ input [ARCHAN_WIDTH-1:0] archannel_data;
+ input rlast_in;
+ wire wrap_fits;
+ output hazard;
+ output valid;
+ output match;
+ output [UPSIZE_WIDTH-1:0] addr_out;
+ output last_addr_match;
+ output beat_complete;
+ output [US_WSTRB_WIDTH-1:0] rdata_byte_mask;
+ reg [ARID_WIDTH-1:0] id_reg;
+ reg [PTR_WIDTH-1:0] pointer_reg;
+ reg hazard_reg;
+ reg valid_reg;
+ reg last_reg;
+ reg n_response_reg;
+ reg wrap_fits_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_mask_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_mask_end_reg;
+ reg [2:0] size_reg;
+ reg bypass_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_next;
+ reg [7:0] size_incr;
+ wire [ARID_WIDTH-1:0] next_id_reg;
+ wire [PTR_WIDTH-1:0] next_pointer_reg;
+ wire next_hazard_reg;
+ wire next_valid_reg;
+ wire next_last_reg;
+ wire next_n_response_reg;
+ wire [DS_ADDR_AL_WIDTH-1:0] next_addr_reg;
+ wire allowed_to_match;
+ wire rid_match;
+ wire arid_match;
+ wire pointer_match;
+ wire match_i;
+ wire last_reg_wr_en;
+ wire hazard_reg_wr_en;
+ wire valid_reg_wr_en;
+ wire n_response_reg_wr_en;
+ wire default_reg_wr_en;
+ wire addr_reg_wr;
+ wire [2:0] size_in;
+ wire n_response;
+ wire bypass_in;
+ wire [DS_ADDR_AL_WIDTH-1:0] addr;
+ wire [DS_ADDR_AL_WIDTH-1:0] addr_mask;
+ wire [DS_ADDR_AL_WIDTH-1:0] addr_mask_end;
+ wire [ARID_WIDTH-1:0] hazard_id;
+ wire boundary_cross;
+ wire [DS_ADDR_AL_WIDTH:0] addr_incr;
+ wire can_complete;
+ wire last_addr_match_int;
+ wire beat_complete_i;
+assign {
+ wrap_fits,
+ n_response,
+ hazard_id,
+ addr_mask_end,
+ addr_mask,
+ addr,
+ bypass_in,
+ size_in
+ } = archannel_data;
+ assign rid_match = (match_id == id_reg);
+ assign arid_match = (hazard_id == id_reg);
+ assign allowed_to_match = valid_reg && ~hazard_reg;
+ assign match_i = allowed_to_match && rid_match;
+ assign match = match_i;
+ assign can_complete = match_i && ~|n_response_reg;
+ reg [63:0] size_mask_r;
+ wire [US_WSTRB_WIDTH-1:0] size_mask,byte_mask,byte_mask_r;
+ wire [US_WSTRB_WIDTH-1:0] rdata_byte_mask ;
+ assign rdata_byte_mask = byte_mask & {US_WSTRB_WIDTH{match_i}};
+ always @(size_reg)
+ begin : size_mask_p
+ case (size_reg)
+ 3'b000 : size_mask_r = {64'b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000001};
+ 3'b001 : size_mask_r = {64'b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000011};
+ 3'b010 : size_mask_r = {64'b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00001111};
+ 3'b011 : size_mask_r = {64'b00000000_00000000_00000000_00000000_00000000_00000000_00000000_11111111};
+ 3'b100 : size_mask_r = {64'b00000000_00000000_00000000_00000000_00000000_00000000_11111111_11111111};
+ 3'b101 : size_mask_r = {64'b00000000_00000000_00000000_00000000_11111111_11111111_11111111_11111111};
+ 3'b110 : size_mask_r = {64'b00000000_00000000_11111111_11111111_11111111_11111111_11111111_11111111};
+ 3'b111 : size_mask_r = {64'b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111};
+ default : size_mask_r = {64'bx};
+ endcase
+ end
+assign size_mask = size_mask_r[US_WSTRB_WIDTH-1:0] ;
+assign byte_mask_r = (size_mask << addr_reg[US_ADDR_AL_WIDTH-1:0]) ;//& { {(US_WSTRB_WIDTH-addr_reg){1'b1}}, {addr_reg{1'b0}}};
+assign byte_mask = byte_mask_r[US_WSTRB_WIDTH-1:0] ;
+ assign hazard = arid_match && last_reg && valid_reg && ~(can_complete && pop_slice);
+ assign default_reg_wr_en = (store && push_slice);
+ assign next_id_reg = hazard_id;
+ always @(posedge aclk)
+ begin : id_seq
+ if (default_reg_wr_en)
+ id_reg <= next_id_reg;
+ end
+ assign next_pointer_reg = hazard_pointer;
+ always @(posedge aclk)
+ begin : pointer_seq
+ if (default_reg_wr_en)
+ pointer_reg <= next_pointer_reg;
+ end
+ assign next_last_reg = (store) ? 1'b1 :
+ ((arid_match) ? 1'b0 : last_reg);
+ assign last_reg_wr_en = (default_reg_wr_en || (arid_match && valid_reg && push_slice));
+ always @(posedge aclk)
+ begin : last_seq
+ if (last_reg_wr_en)
+ last_reg <= next_last_reg;
+ end
+ assign pointer_match = (pointer_reg == match_pointer);
+ assign next_hazard_reg = (store) ? hazard_in : 1'b0;
+ assign hazard_reg_wr_en = (default_reg_wr_en || (pointer_match && valid_reg && pop_slice && rid_match));
+ always @(posedge aclk)
+ begin : hazard_seq
+ if (hazard_reg_wr_en)
+ hazard_reg <= next_hazard_reg;
+ end
+ assign next_valid_reg = (store && push_slice) || (n_response_reg);
+ assign valid_reg_wr_en = default_reg_wr_en || (match_i && pop_slice);
+ always @(posedge aclk or negedge aresetn)
+ begin : valid_seq
+ if (!aresetn)
+ valid_reg <= 1'b0;
+ else if (valid_reg_wr_en)
+ valid_reg <= next_valid_reg;
+ end
+ assign valid = valid_reg;
+ assign next_n_response_reg = (store && push_slice) ? n_response : (n_response_reg - 1'b1);
+ assign n_response_reg_wr_en = (rid_match && ~hazard_reg && rlast_in && update && beat_complete_i) || default_reg_wr_en;
+ always @(posedge aclk or negedge aresetn)
+ begin : two_resp_seq
+ if (!aresetn)
+ n_response_reg <= {1{1'b0}};
+ else if (n_response_reg_wr_en)
+ n_response_reg <= next_n_response_reg;
+ end
+ assign boundary_cross = |((addr_incr ^ {1'b0, addr_reg}) & {1'b1, ~addr_mask_reg}) & ~wrap_fits_reg;
+ always @(*)
+ begin : size_incr_p
+ case (size_reg)
+ `AXI_ASIZE_8 : size_incr = {7'b0, 1'b1};
+ `AXI_ASIZE_16 : size_incr = {6'b0, 2'b10};
+ `AXI_ASIZE_32 : size_incr = {5'b0, 3'b100};
+ `AXI_ASIZE_64 : size_incr = {4'b0, 4'b1000};
+ `AXI_ASIZE_128 : size_incr = {3'b0, 5'b10000};
+ `AXI_ASIZE_256 : size_incr = {2'b0, 6'b100000};
+ `AXI_ASIZE_512 : size_incr = {1'b0, 7'b1000000};
+ default : size_incr = {8'bx};
+ endcase
+ end
+ assign addr_incr = {1'b0, addr_reg} + size_incr[DS_ADDR_AL_WIDTH:0];
+ always @(*)
+ begin : addr_reg_nxt_p
+ integer index_i;
+ for (index_i = 0; index_i < DS_ADDR_AL_WIDTH ; index_i = index_i + 1)
+ begin
+ if ( addr_mask_reg[index_i] == 1'b1)
+ addr_next[index_i] = addr_incr[index_i];
+ else
+ addr_next[index_i] = addr_reg[index_i];
+ end
+ end
+ assign addr_reg_wr = default_reg_wr_en || (match_i && update);
+ assign next_addr_reg = (store && push_slice) ? addr : addr_next;
+ always @(posedge aclk or negedge aresetn)
+ begin : addr_seq
+ if (!aresetn)
+ addr_reg <= {DS_ADDR_AL_WIDTH{1'b0}};
+ else if (addr_reg_wr)
+ addr_reg <= next_addr_reg;
+ end
+ assign addr_out = addr_reg[DS_ADDR_AL_WIDTH-1:US_ADDR_AL_WIDTH] & {UPSIZE_WIDTH{match_i}};
+ assign last_addr_match_int = (((addr_reg & addr_mask_reg) == (addr_mask_end_reg & addr_mask_reg)) || bypass_reg) && ~|n_response_reg;
+ assign last_addr_match = last_addr_match_int;
+ assign beat_complete_i = boundary_cross || bypass_reg;
+ assign beat_complete = beat_complete_i;
+ always @(posedge aclk or negedge aresetn)
+ begin : ardata_seq
+ if (!aresetn) begin
+ addr_mask_reg <= {DS_ADDR_AL_WIDTH{1'b0}};
+ addr_mask_end_reg <= {DS_ADDR_AL_WIDTH{1'b0}};
+ size_reg <= 3'b0;
+ bypass_reg <= 1'b0;
+ wrap_fits_reg <= 1'b0;
+ end else if (default_reg_wr_en) begin
+ addr_mask_reg <= addr_mask;
+ addr_mask_end_reg <= addr_mask_end;
+ size_reg <= size_in;
+ bypass_reg <= bypass_in;
+ wrap_fits_reg <= wrap_fits;
+ end
+ end
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_rd_chan.v b/axi2sramcrs/rtl/upsizer/upsize_rd_chan.v
new file mode 100644
index 0000000..debc58c
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_rd_chan.v
@@ -0,0 +1,280 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_rd_chan
+ (
+ archannel_ready, rready_m, rvalid_s, rdata_s, rid_s, rresp_s,
+ rlast_s, ruser_s,
+ aclk, aresetn, archannel_valid, archannel_data, rvalid_m, rdata_m,
+ rid_m, rresp_m, rlast_m, ruser_m, rready_s
+ );
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=4;
+parameter RD_ISS=8;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam AWFMT_WIDTH=1+US_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam PTR_WIDTH=$clog2(RD_ISS+1);
+localparam UPSIZE_WIDTH=DS_ADDR_AL_WIDTH-US_ADDR_AL_WIDTH;
+localparam DATA_RATIO=(DS_DATA_WIDTH/US_DATA_WIDTH);
+ input aclk;
+ input aresetn;
+ input archannel_valid;
+ output archannel_ready;
+ input [ARFMT_WIDTH-1:0] archannel_data;
+ input rvalid_m;
+ output rready_m;
+ input [DS_DATA_WIDTH-1:0] rdata_m;
+ input [ARID_WIDTH-1:0] rid_m;
+ input [1:0] rresp_m;
+ input rlast_m;
+ input [USER_WIDTH-1:0] ruser_m;
+ input rready_s;
+ output rvalid_s;
+ output [US_DATA_WIDTH-1:0] rdata_s;
+ output [ARID_WIDTH-1:0] rid_s;
+ output [1:0] rresp_s;
+ output rlast_s;
+ output [USER_WIDTH-1:0] ruser_s;
+ wire archannel_ready_i;
+ wire [RD_ISS-1:0] match_bus;
+ wire [RD_ISS-1:0] hazard_bus;
+ wire [RD_ISS-1:0] valid_bus;
+ wire [RD_ISS-1:0] last_addr_match_bus;
+ wire [RD_ISS-1:0] beat_complete_slice_bus;
+ wire hazard;
+ wire last_addr_match;
+ wire beat_complete_slice;
+ wire archannel_hndshk;
+ wire rchannel_hndshk;
+ wire push_slice;
+ wire pop_slice;
+ wire update;
+ wire beat_complete;
+ wire [UPSIZE_WIDTH-1:0] data_select;
+ reg [UPSIZE_WIDTH-1:0] addr;
+ wire [ARID_WIDTH-1:0] rid_m;
+ wire [DS_DATA_WIDTH-1:0] rdata;
+ wire rlast_in;
+ wire rlast_s_i;
+ wire [1:0] rresp_s;
+ wire [UPSIZE_WIDTH-1:0] addr_out[RD_ISS-1:0];
+ wire [US_WSTRB_WIDTH-1:0] rdata_byte_mask[RD_ISS-1:0];
+ wire [RD_ISS-1:0] const_onehot[RD_ISS-1:0];
+ wire [RD_ISS-1:0] valid_bus_zero_lsb;
+ wire [PTR_WIDTH-1:0] hazard_bus_one_pos[RD_ISS-1:0];
+ wire [PTR_WIDTH-1:0] match_bus_one_pos[RD_ISS-1:0];
+ reg [US_DATA_WIDTH-1:0] rdata_beat_mask;
+ reg [US_DATA_WIDTH-1:0] rdata_s_demux;
+ reg [PTR_WIDTH-1:0] hazard_pointer;
+ reg [PTR_WIDTH-1:0] match_pointer;
+ reg [RD_ISS-1:0] store;
+ assign rid_s = rid_m;
+ assign rlast_in = rlast_m;
+ assign rresp_s = rresp_m;
+ assign ruser_s = ruser_m;
+ assign rdata = rdata_m;
+ assign hazard = |hazard_bus;
+ assign last_addr_match = |(last_addr_match_bus & match_bus);
+ assign beat_complete_slice = |(beat_complete_slice_bus & match_bus);
+always @(*)
+begin:for_addr
+ integer i,j;
+ addr = {UPSIZE_WIDTH{1'h0}};
+ for(i=0;i<UPSIZE_WIDTH;i=i+1)
+ begin: for_addr_i
+ for(j=0;j<RD_ISS;j=j+1)
+ begin: for_addr_j
+ addr[i] = addr[i]|addr_out[j][i];
+ end
+ end
+end
+reg [US_WSTRB_WIDTH-1:0] rdata_byte_mask_i;
+always @(*)
+begin:for_rdata_beat
+ integer i,j;
+ rdata_beat_mask = {US_DATA_WIDTH{1'b0}};
+ for(i=0;i<US_WSTRB_WIDTH;i=i+1)
+ for(j=0;j<8;j=j+1)
+ rdata_beat_mask[i*8+j] = rdata_byte_mask_i[i];
+end
+always @(*)
+begin:for_rdata_byte
+ integer i,j;
+ rdata_byte_mask_i = {US_WSTRB_WIDTH{1'b0}};
+ for(i=0;i<US_WSTRB_WIDTH;i=i+1)
+ for(j=0;j<RD_ISS;j=j+1)
+ begin
+ rdata_byte_mask_i[i] = rdata_byte_mask_i[i] | rdata_byte_mask[j][i] ;
+ end
+end
+ assign data_select = addr;
+/*
+always@(*)
+begin:rdata_s_demux_a
+ integer i;
+ for(i=0;i<DATA_RATIO;i=i+1)
+ begin
+ if(data_select == i)
+ begin
+ rdata_s_demux = rdata[US_DATA_WIDTH*i+:US_DATA_WIDTH];//[(US_DATA_WIDTH*(i+1)-1):US_DATA_WIDTH*i];
+ end
+ end
+end
+*/
+generate
+ if(DATA_RATIO==2)
+ begin:demux_D2
+ always@(*)
+ begin
+ case(data_select)
+ 0:rdata_s_demux=rdata[US_DATA_WIDTH-1:0];
+ 1:rdata_s_demux=rdata[US_DATA_WIDTH*2-1:US_DATA_WIDTH];
+ default:rdata_s_demux= {US_DATA_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(DATA_RATIO==4)
+ begin:demux_D4
+ always@(*)
+ begin
+ case(data_select)
+ 0:rdata_s_demux=rdata[US_DATA_WIDTH-1:0];
+ 1:rdata_s_demux=rdata[US_DATA_WIDTH*2-1:US_DATA_WIDTH];
+ 2:rdata_s_demux=rdata[US_DATA_WIDTH*3-1:US_DATA_WIDTH*2];
+ 3:rdata_s_demux=rdata[US_DATA_WIDTH*4-1:US_DATA_WIDTH*3];
+ default:rdata_s_demux={US_DATA_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(DATA_RATIO==8)
+ begin:demux_D8
+ always@(*)
+ begin
+ case(data_select)
+ 0:rdata_s_demux=rdata[US_DATA_WIDTH-1:0];
+ 1:rdata_s_demux=rdata[US_DATA_WIDTH*2-1:US_DATA_WIDTH];
+ 2:rdata_s_demux=rdata[US_DATA_WIDTH*3-1:US_DATA_WIDTH*2];
+ 3:rdata_s_demux=rdata[US_DATA_WIDTH*4-1:US_DATA_WIDTH*3];
+ 4:rdata_s_demux=rdata[US_DATA_WIDTH*5-1:US_DATA_WIDTH*4];
+ 5:rdata_s_demux=rdata[US_DATA_WIDTH*6-1:US_DATA_WIDTH*5];
+ 6:rdata_s_demux=rdata[US_DATA_WIDTH*7-1:US_DATA_WIDTH*6];
+ 7:rdata_s_demux=rdata[US_DATA_WIDTH*8-1:US_DATA_WIDTH*7];
+ default:rdata_s_demux={US_DATA_WIDTH{1'b0}};
+ endcase
+ end
+ end
+endgenerate
+assign rdata_s = rdata_s_demux & rdata_beat_mask;
+ assign rlast_s_i = last_addr_match && rlast_in;
+ assign rlast_s = rlast_s_i;
+ assign archannel_ready_i = ~&valid_bus;
+ assign archannel_ready = archannel_ready_i;
+ assign archannel_hndshk = archannel_ready_i && archannel_valid;
+ assign push_slice = archannel_hndshk;
+genvar i;
+generate
+ for(i=0;i<RD_ISS;i=i+1) begin:const_onehot_g
+ if(RD_ISS==1) begin: rd_iss_1
+ assign const_onehot[i]=(1'h1<<i);
+ end
+ else begin: rd_iss_n
+ assign const_onehot[i]=({{(RD_ISS-1){1'h0}},1'h1}<<i);
+ end
+ assign valid_bus_zero_lsb[i]=((~valid_bus[i:0])==const_onehot[i][i:0]);
+ assign hazard_bus_one_pos[i]={PTR_WIDTH{hazard_bus[i]}}&i;
+ assign match_bus_one_pos[i]={PTR_WIDTH{match_bus[i]}}&i;
+ always @(*)
+ begin : store_decode
+ if (&valid_bus)
+ store[i] = match_bus[i];
+ else
+ store[i] = valid_bus_zero_lsb[i];
+ end
+ end
+endgenerate
+ always @(*)
+ begin : hazard_num_distibution
+ integer a;
+ hazard_pointer={PTR_WIDTH{1'h0}};
+ for(a=0;a<RD_ISS;a=a+1) begin
+ hazard_pointer=hazard_pointer | hazard_bus_one_pos[a];
+ end
+ end
+ always @(*)
+ begin : match_num_distibution
+ integer a;
+ match_pointer={PTR_WIDTH{1'h0}};
+ for(a=0;a<RD_ISS;a=a+1) begin
+ match_pointer=match_pointer | match_bus_one_pos[a];
+ end
+ end
+ assign beat_complete = (rlast_s_i | beat_complete_slice) && update;
+ assign rready_m = beat_complete && rvalid_m;
+ assign rvalid_s = rvalid_m;
+ assign rchannel_hndshk = rvalid_s && rready_s;
+ assign update = rchannel_hndshk;
+ assign pop_slice = update && rlast_s_i;
+generate
+for(i=0;i<RD_ISS;i=i+1) begin: rd_cam_slice_inst
+ upsize_rd_cam_slice #(
+ .ARID_WIDTH(ARID_WIDTH),
+ .US_DATA_WIDTH(US_DATA_WIDTH),
+ .DS_DATA_WIDTH(DS_DATA_WIDTH),
+ .RD_ISS(RD_ISS),
+ .ARCHAN_WIDTH(ARFMT_WIDTH)
+ ) u_upsize_rd_cam_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .match_id (rid_m),
+ .store (store[i]),
+ .push_slice (push_slice),
+ .pop_slice (pop_slice),
+ .update (update),
+ .match_pointer (match_pointer),
+ .archannel_data (archannel_data),
+ .rlast_in (rlast_in),
+ .hazard_in (hazard),
+ .hazard_pointer (hazard_pointer),
+ .hazard (hazard_bus[i]),
+ .match (match_bus[i]),
+ .valid (valid_bus[i]),
+ .addr_out (addr_out[i]),
+ .last_addr_match (last_addr_match_bus[i]),
+ .beat_complete (beat_complete_slice_bus[i]),
+ .rdata_byte_mask (rdata_byte_mask[i])
+ );
+end
+endgenerate
+endmodule
diff --git a/axi2sramcrs/rtl/upsizer/upsize_resp_cam_slice.v b/axi2sramcrs/rtl/upsizer/upsize_resp_cam_slice.v
new file mode 100644
index 0000000..0f0a899
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_resp_cam_slice.v
@@ -0,0 +1,145 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_resp_cam_slice
+ (
+ aresetn,
+ aclk,
+ matchid,
+ hazardid,
+ store,
+ push_slice,
+ pop_slice,
+ update,
+ match_pointer,
+ hazard_in,
+ hazard_pointer,
+ n_response,
+ bresp_in,
+ hazard,
+ match,
+ valid,
+ bresp_out
+ );
+parameter ID_WIDTH=4;
+parameter USER_WIDTH=4;
+parameter PTR_WIDTH=8;
+ input aresetn;
+ input aclk;
+ input [ID_WIDTH-1:0] matchid;
+ input [ID_WIDTH-1:0] hazardid;
+ input store;
+ input push_slice;
+ input pop_slice;
+ input update;
+ input [PTR_WIDTH-1:0] hazard_pointer;
+ input [PTR_WIDTH-1:0] match_pointer;
+ input hazard_in;
+ input n_response;
+ input [1:0] bresp_in;
+ output hazard;
+ output match;
+ output valid;
+ output [1:0] bresp_out;
+ reg [ID_WIDTH-1:0] id_reg;
+ reg [PTR_WIDTH-1:0] pointer_reg;
+ reg hazard_reg;
+ reg valid_reg;
+ reg last_reg;
+ reg n_response_reg;
+ reg [1:0] bresp_reg;
+ wire [ID_WIDTH-1:0] next_id_reg;
+ wire [PTR_WIDTH-1:0] next_pointer_reg;
+ wire next_hazard_reg;
+ wire next_valid_reg;
+ wire next_last_reg;
+ wire next_n_response_reg;
+ wire [1:0] next_bresp_reg;
+ wire allowed_to_match;
+ wire bid_match;
+ wire awid_match;
+ wire match_i;
+ wire last_reg_wr_en;
+ wire hazard_reg_wr_en;
+ wire valid_reg_wr_en;
+ wire n_response_reg_wr_en;
+ wire default_reg_wr_en;
+ wire pointer_match;
+ assign bid_match = (matchid == id_reg);
+ assign awid_match = (hazardid == id_reg);
+ assign allowed_to_match = valid_reg && ~hazard_reg && ~n_response_reg;
+ assign match_i = allowed_to_match && bid_match;
+ assign match = match_i;
+ assign hazard = awid_match && last_reg && valid_reg && ~(match_i && pop_slice);
+ assign default_reg_wr_en = (store && push_slice);
+ assign next_id_reg = hazardid;
+ always @(posedge aclk)
+ begin : id_seq
+ if (default_reg_wr_en)
+ id_reg <= next_id_reg;
+ end
+ assign next_pointer_reg = hazard_pointer;
+ always @(posedge aclk)
+ begin : pointer_seq
+ if (default_reg_wr_en)
+ pointer_reg <= next_pointer_reg;
+ end
+ assign next_last_reg = (store && push_slice) ? 1'b1 :
+ ((awid_match) ? 1'b0 : last_reg);
+ assign last_reg_wr_en = (default_reg_wr_en || (awid_match && valid_reg && push_slice));
+ always @(posedge aclk)
+ begin : last_seq
+ if (last_reg_wr_en)
+ last_reg <= next_last_reg;
+ end
+ assign pointer_match = (pointer_reg == match_pointer);
+ assign next_hazard_reg = (store && push_slice) ? hazard_in : 1'b0;
+ assign hazard_reg_wr_en = (default_reg_wr_en || (pointer_match && valid_reg && pop_slice));
+ always @(posedge aclk)
+ begin : hazard_seq
+ if (hazard_reg_wr_en)
+ hazard_reg <= next_hazard_reg;
+ end
+ assign next_valid_reg = (store && push_slice) || (n_response_reg);
+ assign valid_reg_wr_en = default_reg_wr_en || (match_i && pop_slice);
+ always @(posedge aclk or negedge aresetn)
+ begin : valid_seq
+ if (!aresetn)
+ valid_reg <= 1'b0;
+ else if (valid_reg_wr_en)
+ valid_reg <= next_valid_reg;
+ end
+ assign valid = valid_reg;
+ assign next_n_response_reg = (store && push_slice) ? n_response : 1'b0;
+ assign next_bresp_reg = (store && push_slice) ? 2'b0 : (bresp_in | bresp_reg);
+ assign n_response_reg_wr_en = (bid_match && ~hazard_reg && update && (n_response_reg)) || (store && push_slice);
+ always @(posedge aclk or negedge aresetn)
+ begin : two_resp_seq
+ if (!aresetn) begin
+ n_response_reg <= 1'b0;
+ bresp_reg <= 2'b0;
+ end else if (n_response_reg_wr_en) begin
+ n_response_reg <= next_n_response_reg;
+ bresp_reg <= next_bresp_reg;
+ end
+ end
+ assign bresp_out = {2{match_i}} & bresp_reg;
+endmodule
diff --git a/axi2sramcrs/rtl/upsizer/upsize_slave_domain.v b/axi2sramcrs/rtl/upsizer/upsize_slave_domain.v
new file mode 100644
index 0000000..b9a9799
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_slave_domain.v
@@ -0,0 +1,754 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+`include "Axi.v"
+module upsize_slave_domain
+ (
+ awready_s, wready_s, bid_s, bresp_s, bvalid_s, buser_s, arready_s,
+ rid_s, rdata_s, rresp_s, rlast_s, rvalid_s, ruser_s, aw_data,
+ aw_valid, b_ready, ar_data, ar_valid, r_ready, w_data, w_valid,
+ awid_s, awaddr_s, awlen_s, awsize_s, awburst_s, awlock_s,
+ awcache_s, awprot_s, awvalid_s, awvalid_vect_s, awuser_s,
+ awregion_s, wdata_s, wstrb_s, wlast_s, wvalid_s, wid_s, wuser_s,
+ bready_s, arid_s, araddr_s, arlen_s, arsize_s, arburst_s, arlock_s,
+ arcache_s, arprot_s, arvalid_s, arvalid_vect_s, aruser_s,
+ arregion_s, rready_s, awqv_s, arqv_s, aw_ready, b_data, b_valid,
+ ar_ready, r_data, r_valid, w_ready, aclk, aresetn
+ );
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=4;
+parameter RD_ISS=8;
+parameter WR_ISS=8;
+parameter DS_AXI3=1'h1;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=1+1+ARID_WIDTH+DS_ADDR_AL_WIDTH*3+1+3;
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH;
+localparam W_IDB_WIDTH=AWID_WIDTH+USER_WIDTH+DS_DATA_WIDTH+DS_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+DS_DATA_WIDTH+2+1;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+localparam DATA_RATIO=(DS_DATA_WIDTH/US_DATA_WIDTH);
+localparam BCHAN_WIDTH=AWID_WIDTH+1;
+ input [AWID_WIDTH-1:0] awid_s;
+ input [ADDR_WIDTH-1:0] awaddr_s;
+ input [7:0] awlen_s;
+ input [2:0] awsize_s;
+ input [1:0] awburst_s;
+ input [1:0] awlock_s;
+ input [3:0] awcache_s;
+ input [2:0] awprot_s;
+ input awvalid_s;
+ input awvalid_vect_s;
+ output awready_s;
+ input [USER_WIDTH-1:0] awuser_s;
+ input [3:0] awregion_s;
+ input [US_DATA_WIDTH-1:0] wdata_s;
+ input [US_WSTRB_WIDTH-1:0] wstrb_s;
+ input wlast_s;
+ input wvalid_s;
+ output wready_s;
+ input [AWID_WIDTH-1:0] wid_s;
+ input [USER_WIDTH-1:0] wuser_s;
+ output [AWID_WIDTH-1:0] bid_s;
+ output [1:0] bresp_s;
+ output bvalid_s;
+ input bready_s;
+ output [USER_WIDTH-1:0] buser_s;
+ input [ARID_WIDTH-1:0] arid_s;
+ input [ADDR_WIDTH-1:0] araddr_s;
+ input [7:0] arlen_s;
+ input [2:0] arsize_s;
+ input [1:0] arburst_s;
+ input [1:0] arlock_s;
+ input [3:0] arcache_s;
+ input [2:0] arprot_s;
+ input arvalid_s;
+ input arvalid_vect_s;
+ output arready_s;
+ input [USER_WIDTH-1:0] aruser_s;
+ input [3:0] arregion_s;
+ output [ARID_WIDTH-1:0] rid_s;
+ output [US_DATA_WIDTH-1:0] rdata_s;
+ output [1:0] rresp_s;
+ output rlast_s;
+ output rvalid_s;
+ input rready_s;
+ output [USER_WIDTH-1:0] ruser_s;
+ input [3:0] awqv_s;
+ input [3:0] arqv_s;
+ output [AW_IDB_WIDTH-1:0] aw_data;
+ output aw_valid;
+ input aw_ready;
+ input [B_IDB_WIDTH-1:0] b_data;
+ input b_valid;
+ output b_ready;
+ output [AR_IDB_WIDTH-1:0] ar_data;
+ output ar_valid;
+ input ar_ready;
+ input [R_IDB_WIDTH-1:0] r_data;
+ input r_valid;
+ output r_ready;
+ output [W_IDB_WIDTH-1:0] w_data;
+ output w_valid;
+ input w_ready;
+ input aclk;
+ input aresetn;
+ wire [W_IDB_WIDTH-1:0] w_boundary_src_data;
+ wire [W_IDB_WIDTH-1:0] w_boundary_dst_data;
+ wire w_boundary_dst_valid;
+ wire w_boundary_dst_ready;
+ wire w_boundary_src_valid;
+ wire w_boundary_src_ready;
+ wire [US_AW_WIDTH-1:0] aw_slave_port_src_data;
+ wire [US_AW_WIDTH-1:0] aw_slave_port_dst_data;
+ wire aw_slave_port_dst_valid;
+ wire aw_slave_port_dst_ready;
+ wire aw_slave_port_src_valid;
+ wire aw_slave_port_src_ready;
+ wire [US_AR_WIDTH-1:0] ar_slave_port_src_data;
+ wire [US_AR_WIDTH-1:0] ar_slave_port_dst_data;
+ wire ar_slave_port_dst_valid;
+ wire ar_slave_port_dst_ready;
+ wire ar_slave_port_src_valid;
+ wire ar_slave_port_src_ready;
+ wire [US_R_WIDTH-1:0] r_slave_port_src_data;
+ wire [US_R_WIDTH-1:0] r_slave_port_dst_data;
+ wire [US_W_WIDTH-1:0] w_slave_port_src_data;
+ wire [US_W_WIDTH-1:0] w_slave_port_dst_data;
+ wire [US_B_WIDTH-1:0] b_slave_port_src_data;
+ wire [US_B_WIDTH-1:0] b_slave_port_dst_data;
+ wire [BCHAN_WIDTH-1:0] bdata_data;
+ wire bdata_valid;
+ wire bdata_ready;
+ wire [AWFMT_WIDTH-1:0] awdata_data;
+ wire awdata_valid;
+ wire awdata_ready;
+ wire merge;
+ wire merge_clear;
+ wire [DATA_RATIO-1:0] data_select;
+ wire strb_skid_valid;
+ wire [DS_DATA_WIDTH-1:0] wdata_merged;
+ wire [DS_WSTRB_WIDTH-1:0] wstrb_merged;
+ wire [ARFMT_WIDTH-1:0] arfifo_data;
+ wire arfifo_valid;
+ wire arfifo_ready;
+ wire [US_AW_WIDTH-1:0] aw_fmt_src_data;
+ wire [US_AR_WIDTH-1:0] ar_fmt_src_data;
+ wire [US_AW_WIDTH-1:0] aw_fmt_dst_data;
+ wire [US_AR_WIDTH-1:0] ar_fmt_dst_data;
+ wire [USER_WIDTH-1:0] awuser_bif;
+ wire [3:0] awregion_bif;
+ wire [AWID_WIDTH-1:0] awid_bif;
+ wire [ADDR_WIDTH-1:0] awaddr_bif;
+ wire [7:0] awlen_bif;
+ wire [2:0] awsize_bif;
+ wire [1:0] awburst_bif;
+ wire [1:0] awlock_bif;
+ wire [3:0] awcache_bif;
+ wire [2:0] awprot_bif;
+ wire awvalid_bif;
+ wire awvalid_vect_bif;
+ wire awready_bif;
+ wire [3:0] awqv_bif;
+ wire [USER_WIDTH-1:0] aruser_bif;
+ wire [3:0] arregion_bif;
+ wire [ARID_WIDTH-1:0] arid_bif;
+ wire [ADDR_WIDTH-1:0] araddr_bif;
+ wire [7:0] arlen_bif;
+ wire [2:0] arsize_bif;
+ wire [1:0] arburst_bif;
+ wire [1:0] arlock_bif;
+ wire [3:0] arcache_bif;
+ wire [2:0] arprot_bif;
+ wire arvalid_bif;
+ wire arvalid_vect_bif;
+ wire arready_bif;
+ wire [3:0] arqv_bif;
+ wire lock_seq;
+ wire ar_lock_hndshk;
+ wire ar_unlock_hndshk;
+ wire [USER_WIDTH-1:0] wuser_bif;
+ wire [AWID_WIDTH-1:0] wid_bif;
+ wire wvalid_bif;
+ wire wready_bif;
+ wire [DS_DATA_WIDTH-1:0] wdata_bif;
+ wire [DS_WSTRB_WIDTH-1:0] wstrb_bif;
+ wire wlast_bif;
+ wire [USER_WIDTH-1:0] buser_bif;
+ wire [AWID_WIDTH-1:0] bid_bif;
+ wire [1:0] bresp_bif;
+ wire bvalid_bif;
+ wire bready_bif;
+ wire [USER_WIDTH-1:0] ruser_bif;
+ wire [ARID_WIDTH-1:0] rid_bif;
+ wire [1:0] rresp_bif;
+ wire [DS_DATA_WIDTH-1:0] rdata_bif;
+ wire rlast_bif;
+ wire rvalid_bif;
+ wire rready_bif;
+ wire [USER_WIDTH-1:0] aruser_fmt;
+ wire [3:0] arregion_fmt;
+ wire arvalid_fmt;
+ wire arvalid_vect_fmt;
+ wire [ADDR_WIDTH-1:0] araddr_fmt;
+ wire [7:0] arlen_fmt;
+ wire [2:0] arsize_fmt;
+ wire [1:0] arburst_fmt;
+ wire [1:0] arlock_fmt;
+ wire [3:0] arcache_fmt;
+ wire [2:0] arprot_fmt;
+ wire [ARID_WIDTH-1:0] arid_fmt;
+ wire arready_fmt;
+ wire [3:0] arqv_fmt;
+ wire [USER_WIDTH-1:0] awuser_fmt;
+ wire [3:0] awregion_fmt;
+ wire awvalid_fmt;
+ wire awvalid_vect_fmt;
+ wire [ADDR_WIDTH-1:0] awaddr_fmt;
+ wire [7:0] awlen_fmt;
+ wire [2:0] awsize_fmt;
+ wire [1:0] awburst_fmt;
+ wire [1:0] awlock_fmt;
+ wire [3:0] awcache_fmt;
+ wire [2:0] awprot_fmt;
+ wire [AWID_WIDTH-1:0] awid_fmt;
+ wire awready_fmt;
+ wire [3:0] awqv_fmt;
+ wire [USER_WIDTH-1:0] aruser_axi_r;
+ wire [3:0] arregion_axi_r;
+ wire arvalid_axi_r;
+ wire arvalid_vect_axi_r;
+ wire [ADDR_WIDTH-1:0] araddr_axi_r;
+ wire [7:0] arlen_axi_r;
+ wire [2:0] arsize_axi_r;
+ wire [1:0] arburst_axi_r;
+ wire [1:0] arlock_axi_r;
+ wire [3:0] arcache_axi_r;
+ wire [2:0] arprot_axi_r;
+ wire [ARID_WIDTH-1:0] arid_axi_r;
+ wire arready_axi_r;
+ wire [3:0] arqv_axi_r;
+ wire [USER_WIDTH-1:0] awuser_axi_r;
+ wire [3:0] awregion_axi_r;
+ wire awvalid_axi_r;
+ wire awvalid_vect_axi_r;
+ wire [ADDR_WIDTH-1:0] awaddr_axi_r;
+ wire [7:0] awlen_axi_r;
+ wire [2:0] awsize_axi_r;
+ wire [1:0] awburst_axi_r;
+ wire [1:0] awlock_axi_r;
+ wire [3:0] awcache_axi_r;
+ wire [2:0] awprot_axi_r;
+ wire [AWID_WIDTH-1:0] awid_axi_r;
+ wire awready_axi_r;
+ wire [3:0] awqv_axi_r;
+ wire [USER_WIDTH-1:0] ruser_axi_r;
+ wire rvalid_axi_r;
+ wire rlast_axi_r;
+ wire [US_DATA_WIDTH-1:0] rdata_axi_r;
+ wire [1:0] rresp_axi_r;
+ wire [ARID_WIDTH-1:0] rid_axi_r;
+ wire rready_axi_r;
+ wire [USER_WIDTH-1:0] wuser_axi_r;
+ wire [AWID_WIDTH-1:0] wid_axi_r;
+ wire wvalid_axi_r;
+ wire wlast_axi_r;
+ wire [US_DATA_WIDTH-1:0] wdata_axi_r;
+ wire [US_WSTRB_WIDTH-1:0] wstrb_axi_r;
+ wire wready_axi_r;
+ wire [USER_WIDTH-1:0] buser_axi_r;
+ wire bvalid_axi_r;
+ wire [1:0] bresp_axi_r;
+ wire [AWID_WIDTH-1:0] bid_axi_r;
+ wire bready_axi_r;
+ assign aw_fmt_src_data = {
+ awregion_axi_r,
+ awuser_axi_r,
+ awid_axi_r,
+ awaddr_axi_r,
+ awlen_axi_r,
+ awsize_axi_r,
+ awburst_axi_r,
+ awlock_axi_r,
+ awcache_axi_r,
+ awqv_axi_r,
+ awprot_axi_r,
+ awvalid_vect_axi_r};
+ assign awvalid_fmt = awvalid_axi_r;
+ assign awready_axi_r = awready_fmt;
+ assign aw_fmt_dst_data = aw_fmt_src_data;
+ assign {
+ awregion_fmt,
+ awuser_fmt,
+ awid_fmt,
+ awaddr_fmt,
+ awlen_fmt,
+ awsize_fmt,
+ awburst_fmt,
+ awlock_fmt,
+ awcache_fmt,
+ awqv_fmt,
+ awprot_fmt,
+ awvalid_vect_fmt} = aw_fmt_dst_data;
+ upsize_wr_addr_fmt #(
+ .ARID_WIDTH(ARID_WIDTH),
+ .AWID_WIDTH(AWID_WIDTH),
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .US_DATA_WIDTH(US_DATA_WIDTH),
+ .DS_DATA_WIDTH(DS_DATA_WIDTH),
+ .USER_WIDTH(USER_WIDTH),
+ .DS_AXI3(DS_AXI3)
+ ) u_axi_write_address_format
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .lock_seq (lock_seq),
+ .ar_lock_hndshk (ar_lock_hndshk),
+ .ar_unlock_hndshk (ar_unlock_hndshk),
+ .bdata_data (bdata_data),
+ .bdata_valid (bdata_valid),
+ .bdata_ready (bdata_ready),
+ .awfmt_valid (awdata_valid),
+ .awfmt_ready (awdata_ready),
+ .awfmt_data (awdata_data),
+ .awid_s (awid_fmt),
+ .awaddr_s (awaddr_fmt),
+ .awlen_s (awlen_fmt),
+ .awsize_s (awsize_fmt),
+ .awburst_s (awburst_fmt),
+ .awvalid_s (awvalid_fmt),
+ .awready_s (awready_fmt),
+ .awprot_s (awprot_fmt),
+ .awcache_s (awcache_fmt),
+ .awlock_s (awlock_fmt),
+ .awuser_s (awuser_fmt),
+ .awregion_s (awregion_fmt),
+ .awid_m (awid_bif),
+ .awaddr_m (awaddr_bif),
+ .awlen_m (awlen_bif),
+ .awsize_m (awsize_bif),
+ .awburst_m (awburst_bif),
+ .awvalid_m (awvalid_bif),
+ .awready_m (awready_bif),
+ .awprot_m (awprot_bif),
+ .awlock_m (awlock_bif),
+ .awcache_m (awcache_bif),
+ .awuser_m (awuser_bif),
+ .awregion_m (awregion_bif)
+ );
+ assign awvalid_vect_bif = awvalid_vect_fmt;
+ assign awqv_bif = awqv_fmt;
+upsize_wr_cntrl #(
+ .ARID_WIDTH(ARID_WIDTH),
+ .AWID_WIDTH(AWID_WIDTH),
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .US_DATA_WIDTH(US_DATA_WIDTH),
+ .DS_DATA_WIDTH(DS_DATA_WIDTH),
+ .USER_WIDTH(USER_WIDTH)
+ ) u_upsize_axi_write_control
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .awfifo_valid (awdata_valid),
+ .awfifo_ready (awdata_ready),
+ .awfifo_data (awdata_data),
+ .wvalid_s (wvalid_axi_r),
+ .wready_s (wready_axi_r),
+ .wlast (wlast_axi_r),
+ .wuser (wuser_axi_r),
+ .wid (wid_axi_r),
+ .merge (merge),
+ .merge_clear (merge_clear),
+ .data_select (data_select),
+ .strb_skid_valid (strb_skid_valid),
+ .wdata_merged (wdata_merged),
+ .wstrb_merged (wstrb_merged),
+ .wvalid_m (wvalid_bif),
+ .wready_m (wready_bif),
+ .wlast_m (wlast_bif),
+ .wuser_m (wuser_bif),
+ .wid_m (wid_bif),
+ .wdata_m (wdata_bif),
+ .wstrb_m (wstrb_bif)
+ );
+ upsize_wr_merge_buffer #(
+ .US_DATA_WIDTH(US_DATA_WIDTH),
+ .DS_DATA_WIDTH(DS_DATA_WIDTH)
+ ) u_upsize_axi_write_merge_buffer
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .wdata_out (wdata_merged),
+ .wstrb_out (wstrb_merged),
+ .wdata_in (wdata_axi_r),
+ .wstrb_in (wstrb_axi_r),
+ .data_select (data_select),
+ .merge_skid_valid (strb_skid_valid),
+ .merge (merge),
+ .merge_clear (merge_clear)
+ );
+ upsize_wr_resp_block #(
+ .AWID_WIDTH(AWID_WIDTH),
+ .USER_WIDTH(USER_WIDTH),
+ .WR_ISS(WR_ISS)
+ ) u_upsize_axi_write_response_block
+ (
+ .aclk (aclk),
+ .aresetn (aresetn),
+ .bchannel_ready (bdata_ready),
+ .bchannel_valid (bdata_valid),
+ .bchannel_data (bdata_data),
+ .bready_s (bready_axi_r),
+ .bvalid_s (bvalid_axi_r),
+ .bid_s (bid_axi_r),
+ .buser_s (buser_axi_r),
+ .bresp_s (bresp_axi_r),
+ .buser_m (buser_bif),
+ .bresp_m (bresp_bif),
+ .bid_m (bid_bif),
+ .bvalid_m (bvalid_bif),
+ .bready_m (bready_bif)
+ );
+ assign ar_fmt_src_data = {
+ arregion_axi_r,
+ aruser_axi_r,
+ arid_axi_r,
+ araddr_axi_r,
+ arlen_axi_r,
+ arsize_axi_r,
+ arburst_axi_r,
+ arlock_axi_r,
+ arcache_axi_r,
+ arqv_axi_r,
+ arprot_axi_r,
+ arvalid_vect_axi_r};
+ assign arvalid_fmt = arvalid_axi_r;
+ assign arready_axi_r = arready_fmt;
+ assign ar_fmt_dst_data = ar_fmt_src_data;
+ assign {
+ arregion_fmt,
+ aruser_fmt,
+ arid_fmt,
+ araddr_fmt,
+ arlen_fmt,
+ arsize_fmt,
+ arburst_fmt,
+ arlock_fmt,
+ arcache_fmt,
+ arqv_fmt,
+ arprot_fmt,
+ arvalid_vect_fmt} = ar_fmt_dst_data;
+ upsize_rd_addr_fmt #(
+ .ARID_WIDTH(ARID_WIDTH),
+ .AWID_WIDTH(AWID_WIDTH),
+ .ADDR_WIDTH(ADDR_WIDTH),
+ .US_DATA_WIDTH(US_DATA_WIDTH),
+ .DS_DATA_WIDTH(DS_DATA_WIDTH),
+ .USER_WIDTH(USER_WIDTH),
+ .DS_AXI3(DS_AXI3)
+ ) u_axi_read_address_format
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .lock_seq (lock_seq),
+ .ar_lock_hndshk (ar_lock_hndshk),
+ .ar_unlock_hndshk (ar_unlock_hndshk),
+ .ardata_valid (arfifo_valid),
+ .ardata_ready (arfifo_ready),
+ .ardata_data (arfifo_data),
+ .arid_s (arid_fmt),
+ .araddr_s (araddr_fmt),
+ .arlen_s (arlen_fmt),
+ .arsize_s (arsize_fmt),
+ .arburst_s (arburst_fmt),
+ .arvalid_s (arvalid_fmt),
+ .arready_s (arready_fmt),
+ .arprot_s (arprot_fmt),
+ .arcache_s (arcache_fmt),
+ .arlock_s (arlock_fmt),
+ .aruser_s (aruser_fmt),
+ .arregion_s (arregion_fmt),
+ .arid_m (arid_bif),
+ .araddr_m (araddr_bif),
+ .arlen_m (arlen_bif),
+ .arsize_m (arsize_bif),
+ .arburst_m (arburst_bif),
+ .arvalid_m (arvalid_bif),
+ .arready_m (arready_bif),
+ .arprot_m (arprot_bif),
+ .arlock_m (arlock_bif),
+ .aruser_m (aruser_bif),
+ .arregion_m (arregion_bif),
+ .arcache_m (arcache_bif)
+ );
+ assign arvalid_vect_bif = arvalid_vect_fmt;
+ assign arqv_bif = arqv_fmt;
+ upsize_rd_chan
+ #(
+.ARID_WIDTH (ARID_WIDTH ),
+.AWID_WIDTH (AWID_WIDTH ),
+.ADDR_WIDTH (ADDR_WIDTH ),
+.US_DATA_WIDTH (US_DATA_WIDTH),
+.DS_DATA_WIDTH (DS_DATA_WIDTH),
+.USER_WIDTH (USER_WIDTH ),
+.RD_ISS (RD_ISS )
+ )
+u_upsize_axi_read_channel
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .archannel_data (arfifo_data),
+ .archannel_valid (arfifo_valid),
+ .archannel_ready (arfifo_ready),
+ .rvalid_s (rvalid_axi_r),
+ .rdata_s (rdata_axi_r),
+ .rlast_s (rlast_axi_r),
+ .rid_s (rid_axi_r),
+ .rresp_s (rresp_axi_r),
+ .ruser_s (ruser_axi_r),
+ .rready_s (rready_axi_r),
+ .rvalid_m (rvalid_bif),
+ .rdata_m (rdata_bif),
+ .rlast_m (rlast_bif),
+ .rid_m (rid_bif),
+ .rresp_m (rresp_bif),
+ .ruser_m (ruser_bif),
+ .rready_m (rready_bif)
+ );
+ assign aw_data = {
+ awregion_bif,
+ awuser_bif,
+ awid_bif,
+ awaddr_bif,
+ awlen_bif,
+ awsize_bif,
+ awburst_bif,
+ awlock_bif,
+ awcache_bif,
+ awqv_bif,
+ awprot_bif,
+ awvalid_vect_bif};
+ assign aw_valid = awvalid_bif;
+ assign awready_bif = aw_ready;
+ assign ar_data = {
+ arregion_bif,
+ aruser_bif,
+ arid_bif,
+ araddr_bif,
+ arlen_bif,
+ arsize_bif,
+ arburst_bif,
+ arlock_bif,
+ arcache_bif,
+ arqv_bif,
+ arprot_bif,
+ arvalid_vect_bif};
+ assign ar_valid = arvalid_bif;
+ assign arready_bif = ar_ready;
+ assign w_boundary_src_data = {
+ wid_bif,
+ wuser_bif,
+ wdata_bif,
+ wstrb_bif,
+ wlast_bif};
+ assign w_boundary_src_valid = wvalid_bif;
+ assign wready_bif = w_boundary_src_ready;
+ assign w_data = w_boundary_dst_data;
+ assign w_valid = w_boundary_dst_valid;
+ assign w_boundary_dst_ready = w_ready;
+ assign {
+ ruser_bif,
+ rid_bif,
+ rdata_bif,
+ rresp_bif,
+ rlast_bif} = r_data;
+ assign r_ready = rready_bif;
+ assign rvalid_bif = r_valid;
+ assign {
+ buser_bif,
+ bid_bif,
+ bresp_bif} = b_data;
+ assign b_ready = bready_bif;
+ assign bvalid_bif = b_valid;
+ assign aw_slave_port_src_data = {
+ awregion_s,
+ awuser_s,
+ awid_s,
+ awaddr_s,
+ awlen_s,
+ awsize_s,
+ awburst_s,
+ awlock_s,
+ awcache_s,
+ awqv_s,
+ awprot_s,
+ awvalid_vect_s};
+ assign {
+ awregion_axi_r,
+ awuser_axi_r,
+ awid_axi_r,
+ awaddr_axi_r,
+ awlen_axi_r,
+ awsize_axi_r,
+ awburst_axi_r,
+ awlock_axi_r,
+ awcache_axi_r,
+ awqv_axi_r,
+ awprot_axi_r,
+ awvalid_vect_axi_r} = aw_slave_port_dst_data;
+ assign awvalid_axi_r = aw_slave_port_dst_valid;
+ assign aw_slave_port_dst_ready = awready_axi_r;
+ assign aw_slave_port_src_valid = awvalid_s;
+ assign awready_s = aw_slave_port_src_ready;
+ assign ar_slave_port_src_data = {
+ arregion_s,
+ aruser_s,
+ arid_s,
+ araddr_s,
+ arlen_s,
+ arsize_s,
+ arburst_s,
+ arlock_s,
+ arcache_s,
+ arqv_s,
+ arprot_s,
+ arvalid_vect_s};
+ assign {
+ arregion_axi_r,
+ aruser_axi_r,
+ arid_axi_r,
+ araddr_axi_r,
+ arlen_axi_r,
+ arsize_axi_r,
+ arburst_axi_r,
+ arlock_axi_r,
+ arcache_axi_r,
+ arqv_axi_r,
+ arprot_axi_r,
+ arvalid_vect_axi_r} = ar_slave_port_dst_data;
+ assign arvalid_axi_r = ar_slave_port_dst_valid;
+ assign ar_slave_port_dst_ready = arready_axi_r;
+ assign ar_slave_port_src_valid = arvalid_s;
+ assign arready_s = ar_slave_port_src_ready;
+ assign r_slave_port_src_data = {
+ ruser_axi_r,
+ rid_axi_r,
+ rdata_axi_r,
+ rresp_axi_r,
+ rlast_axi_r};
+ assign {
+ ruser_s,
+ rid_s,
+ rdata_s,
+ rresp_s,
+ rlast_s} = r_slave_port_dst_data;
+ assign r_slave_port_dst_data = r_slave_port_src_data;
+ assign rvalid_s = rvalid_axi_r;
+ assign rready_axi_r = rready_s;
+ assign w_slave_port_src_data = {
+ wid_s,
+ wuser_s,
+ wdata_s,
+ wstrb_s,
+ wlast_s};
+ assign {
+ wid_axi_r,
+ wuser_axi_r,
+ wdata_axi_r,
+ wstrb_axi_r,
+ wlast_axi_r} = w_slave_port_dst_data;
+ assign w_slave_port_dst_data = w_slave_port_src_data;
+ assign wvalid_axi_r = wvalid_s;
+ assign wready_s = wready_axi_r;
+ assign b_slave_port_src_data = {
+ buser_axi_r,
+ bid_axi_r,
+ bresp_axi_r};
+ assign {
+ buser_s,
+ bid_s,
+ bresp_s} = b_slave_port_dst_data;
+ assign b_slave_port_dst_data = b_slave_port_src_data;
+ assign bvalid_s = bvalid_axi_r;
+ assign bready_axi_r = bready_s;
+ axi_slice
+ #(
+ .HNDSHK_MODE (2'h0),
+ .PAYLD_WIDTH (W_IDB_WIDTH)
+ )
+ u_w_boundary_chan_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .src_valid (w_boundary_src_valid),
+ .src_data (w_boundary_src_data),
+ .dst_ready (w_boundary_dst_ready),
+ .src_ready (w_boundary_src_ready),
+ .dst_data (w_boundary_dst_data),
+ .dst_valid (w_boundary_dst_valid)
+ );
+ axi_slice
+ #(
+ .HNDSHK_MODE (2'h0),
+ .PAYLD_WIDTH (US_AW_WIDTH)
+ )
+ u_aw_slave_port_chan_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .src_valid (aw_slave_port_src_valid),
+ .src_data (aw_slave_port_src_data),
+ .dst_ready (aw_slave_port_dst_ready),
+ .src_ready (aw_slave_port_src_ready),
+ .dst_data (aw_slave_port_dst_data),
+ .dst_valid (aw_slave_port_dst_valid)
+ );
+ axi_slice
+ #(
+ .HNDSHK_MODE (2'h0),
+ .PAYLD_WIDTH (US_AR_WIDTH)
+ )
+ u_ar_slave_port_chan_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .src_valid (ar_slave_port_src_valid),
+ .src_data (ar_slave_port_src_data),
+ .dst_ready (ar_slave_port_dst_ready),
+ .src_ready (ar_slave_port_src_ready),
+ .dst_data (ar_slave_port_dst_data),
+ .dst_valid (ar_slave_port_dst_valid)
+ );
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_wr_addr_fmt.v b/axi2sramcrs/rtl/upsizer/upsize_wr_addr_fmt.v
new file mode 100644
index 0000000..8db1554
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_wr_addr_fmt.v
@@ -0,0 +1,1049 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_wr_addr_fmt
+ (
+ lock_seq, bdata_data, bdata_valid, awfmt_valid, awfmt_data,
+ awready_s, awid_m, awaddr_m, awlen_m, awsize_m, awburst_m,
+ awcache_m, awprot_m, awlock_m, awvalid_m, awuser_m, awregion_m,
+ aclk, aresetn, ar_lock_hndshk, ar_unlock_hndshk, bdata_ready,
+ awfmt_ready, awid_s, awaddr_s, awlen_s, awsize_s, awburst_s,
+ awcache_s, awprot_s, awvalid_s, awlock_s, awuser_s, awregion_s,
+ awready_m
+ );
+`include "Axi.v"
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+parameter USER_WIDTH=4;
+parameter DS_AXI3=1'h1;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH;
+localparam W_IDB_WIDTH=USER_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+localparam BCHAN_WIDTH=AWID_WIDTH+1;
+localparam WDATA_CAM_WIDTH_UP =DS_ADDR_AL_WIDTH-US_ADDR_AL_WIDTH;
+localparam TOTAL_BYTES_WIDTH = US_ADDR_AL_WIDTH+8;
+ input aclk;
+ input aresetn;
+ input ar_lock_hndshk;
+ input ar_unlock_hndshk;
+ output lock_seq;
+ output [BCHAN_WIDTH-1:0] bdata_data;
+ output bdata_valid;
+ input bdata_ready;
+ input awfmt_ready;
+ output awfmt_valid;
+ output [AWFMT_WIDTH-1:0] awfmt_data;
+ input [AWID_WIDTH-1:0] awid_s;
+ input [ADDR_WIDTH-1:0] awaddr_s;
+ input [7:0] awlen_s;
+ input [2:0] awsize_s;
+ input [1:0] awburst_s;
+ input [3:0] awcache_s;
+ input [2:0] awprot_s;
+ input awvalid_s;
+ input [1:0] awlock_s;
+ output awready_s;
+ input [USER_WIDTH-1:0] awuser_s;
+ input [3:0] awregion_s;
+ output [AWID_WIDTH-1:0] awid_m;
+ output [ADDR_WIDTH-1:0] awaddr_m;
+ output [7:0] awlen_m;
+ output [2:0] awsize_m;
+ output [1:0] awburst_m;
+ output [3:0] awcache_m;
+ output [2:0] awprot_m;
+ output [1:0] awlock_m;
+ output awvalid_m;
+ input awready_m;
+ output [USER_WIDTH-1:0] awuser_m;
+ output [3:0] awregion_m;
+ reg [ADDR_WIDTH-1:0] awaddro; // transaction start address (int)
+ reg [7:0] awleno; // transaction length (int)
+ reg [2:0] awsizeo; // transaction transfer size (int)
+ reg [1:0] awbursto; // transaction burst type (int)
+ reg [AWID_WIDTH-1:0] awido;
+ reg [3:0] awcacheo;
+ reg [2:0] awproto;
+ reg [1:0] awlocko;
+ reg [USER_WIDTH-1:0] awusero;
+ reg [3:0] awregiono;
+ reg excl_override_reg;
+ reg busy_reg;
+ reg [TOTAL_BYTES_WIDTH-1:0] wrap_bytes_remaining_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] write_mask;
+ wire n_response;
+ reg [TOTAL_BYTES_WIDTH-1:0] total_bytes;
+ reg [TOTAL_BYTES_WIDTH-1:0] total_bytes_masked;
+ reg [2:0] wrapsize;
+ reg [2:0] wrapfitsize;
+ reg [3:0] wraplen;
+ reg [DS_ADDR_AL_WIDTH:0] wrapalignmask;
+ reg wrap_split_reg;
+ reg [2:0] incrsize;
+ reg lock_seq;
+ wire slave_hndshk;
+ wire master_hndshk;
+ wire bypass;
+ wire [ADDR_WIDTH-1:0] awaddr_aligned;
+ wire [DS_ADDR_AL_WIDTH+8-1:0] total_bytes_ext;
+ wire [TOTAL_BYTES_WIDTH-1:0] wrap_boundary_mask;
+ wire wrap_aligned;
+ wire wrap_is_incr;
+ wire wrap_split;
+ wire wrap_fits;
+ wire [TOTAL_BYTES_WIDTH-1:0] wrap_fits_mask;
+ wire [DS_ADDR_AL_WIDTH:0] working_addr;
+ wire wrap_split_reg_nxt;
+ wire wrap_split_reg_wr_en;
+ wire wrap_info_write_en;
+ wire [TOTAL_BYTES_WIDTH-1:0] next_wrap_bytes_remaining_reg;
+ wire [TOTAL_BYTES_WIDTH-1:0] addr_less_one;
+ wire [7:0] wraplen_i;
+ wire [7:0] awlen_1;
+ wire [7:0] incrlen;
+ wire [TOTAL_BYTES_WIDTH-1:0] bytes_to_transfer;
+ wire [TOTAL_BYTES_WIDTH+8-1:0] bytes_to_transfer_large;
+ wire [TOTAL_BYTES_WIDTH-1:0] bytes_to_transfer_wrap1;
+ wire [DS_ADDR_AL_WIDTH-1:0] offset_address;
+ wire [7:0] incrlenmaxsize;
+ wire [DS_ADDR_AL_WIDTH:0] final_address;
+ wire overflow;
+ wire bytes_lt_one_byte;
+ wire bytes_lt_two_byte;
+ wire bytes_lt_two_half;
+ wire bytes_lt_four_half;
+ wire half_carry;
+ wire half_carry_double;
+ wire bytes_lt_four_word;
+ wire bytes_lt_eight_word;
+ wire [2:0] word_carry;
+ wire word_carry_double;
+ wire bytes_lt_eight_dword;
+ wire bytes_lt_sixt_dword;
+ wire [3:0] dword_carry;
+ wire dword_carry_double;
+ wire bytes_lt_sixt_qword;
+ wire bytes_lt_ttwo_qword;
+ wire [4:0] qword_carry;
+ wire qword_carry_double;
+ wire bytes_lt_ttwo_oword;
+ wire bytes_lt_sfour_oword;
+ wire [5:0] oword_carry;
+ wire oword_carry_double;
+ wire buffers_ok;
+ wire new_transaction;
+ wire trans_in_progress;
+ wire new_trans_avail;
+ wire trans_complete;
+ wire next_busy_reg;
+ wire busy_reg_wr_en;
+ wire excl_override;
+ assign slave_hndshk = awvalid_s & awready_s;
+ assign master_hndshk = awvalid_m & awready_m;
+assign awfmt_data = {
+ awid_s,
+ wrap_split,
+ awleno[3:0],
+ wrap_fits,
+ write_mask,
+ awaddr_s[DS_ADDR_AL_WIDTH-1:0],
+ awsize_s,
+ bypass || (awburst_s == `AXI_ABURST_FIXED)
+ };
+ assign awfmt_valid = new_transaction;
+ always @(*)
+ begin : p_new_addr_incr_en_w
+ write_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ case (awburst_s)
+ `AXI_ABURST_FIXED : write_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ `AXI_ABURST_WRAP : write_mask = total_bytes[DS_ADDR_AL_WIDTH-1:0];
+ `AXI_ABURST_INCR : write_mask = {DS_ADDR_AL_WIDTH{1'b1}};
+ default : write_mask = {DS_ADDR_AL_WIDTH{1'b0}};
+ endcase
+ end
+ assign bdata_data = {awid_s, n_response};
+ assign bdata_valid = new_transaction;
+ assign n_response = wrap_split;
+ assign buffers_ok = bdata_ready & awfmt_ready;
+ assign trans_complete = ~((wrap_split & ~wrap_split_reg) );
+ assign trans_in_progress = new_transaction | busy_reg;
+ assign new_transaction = new_trans_avail & buffers_ok;
+ assign new_trans_avail = awvalid_s & ~busy_reg;
+ assign next_busy_reg = (trans_complete & slave_hndshk) ? 1'b0 :
+ ((new_transaction & ~slave_hndshk) ? 1'b1 : busy_reg);
+ assign busy_reg_wr_en = busy_reg ^ next_busy_reg;
+ always @(posedge aclk or negedge aresetn)
+ begin : busy_reg_p
+ if (!aresetn) begin
+ busy_reg <= 1'b0;
+ end else if (busy_reg_wr_en) begin
+ busy_reg <= next_busy_reg;
+ end
+ end
+ assign excl_override = (new_transaction) ? n_response | (|awleno[7:4]) : excl_override_reg;
+ always @(posedge aclk or negedge aresetn)
+ begin : excl_override_reg_p
+ if (!aresetn) begin
+ excl_override_reg <= 1'b0;
+ end else if (new_transaction) begin
+ excl_override_reg <= excl_override;
+ end
+ end
+ assign awregion_m = awregiono;
+ assign awuser_m = awusero;
+ assign awid_m = awido;
+ assign awcache_m = awcacheo;
+ assign awprot_m = awproto;
+ assign awlen_m = awleno;
+ assign awsize_m = awsizeo;
+ assign awaddr_m = awaddro;
+ assign awburst_m = awbursto;
+ assign awlock_m = awlocko;
+ assign awvalid_m = awvalid_s && trans_in_progress;
+ assign awready_s = master_hndshk && trans_complete;
+ always @(*) begin
+ awleno = incrlen;
+ awsizeo = incrsize;
+ awbursto = `AXI_ABURST_INCR;
+ awido = awid_s;
+ awusero = awuser_s;
+ awregiono = awregion_s;
+ awcacheo = awcache_s;
+ awproto = awprot_s;
+ awaddro = awaddr_aligned;
+ awlocko = {(awlock_s[1] | (lock_seq & ~trans_complete)),(awlock_s[0] && (~excl_override))};
+ if (!wrap_split_reg) begin
+ awaddro = awaddr_s;
+ if (wrap_aligned) begin
+ awleno = wraplen_i;
+ awsizeo = wrapsize;
+ awbursto = `AXI_ABURST_WRAP;
+ end else if (bypass) begin
+ awleno = awlen_s;
+ awsizeo = awsize_s;
+ awbursto = awburst_s;
+ end else if (wrap_fits) begin
+ awaddro = awaddr_aligned;
+ awleno = awlen_1;
+ awsizeo = wrapfitsize;
+ awbursto = `AXI_ABURST_INCR;
+ end
+ end
+ end
+ assign wraplen_i = {4'b0000,wraplen};
+ assign awlen_1 = {4'b0000,`AXI_ALEN_1};
+ assign addr_less_one = awaddr_s[TOTAL_BYTES_WIDTH-1:0] - {{TOTAL_BYTES_WIDTH{1'b0}},1'b1};
+ assign next_wrap_bytes_remaining_reg = (addr_less_one & total_bytes);
+ assign wrap_info_write_en = wrap_split & master_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : wrap_bytes_remaining_reg_p
+ if (!aresetn) begin
+ wrap_bytes_remaining_reg <= {TOTAL_BYTES_WIDTH{1'b0}};
+ end else if (wrap_info_write_en) begin
+ wrap_bytes_remaining_reg <= next_wrap_bytes_remaining_reg;
+ end
+ end
+ assign awaddr_aligned = {awaddr_s[ADDR_WIDTH-1:TOTAL_BYTES_WIDTH],((awaddr_s[TOTAL_BYTES_WIDTH-1:0]) & (~total_bytes))};
+ assign wrap_split_reg_nxt = wrap_split & ~(wrap_split_reg);
+ assign wrap_split_reg_wr_en = master_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : wrap_split_p
+ if (!aresetn)
+ wrap_split_reg <= 1'b0;
+ else if (wrap_split_reg_wr_en)
+ wrap_split_reg <= wrap_split_reg_nxt;
+ end
+ assign next_lock_seq = (ar_lock_hndshk | (slave_hndshk & awlock_s[1])) ?
+ 1'b1 : ((ar_unlock_hndshk | (master_hndshk & ~awlock_m[1])) ?
+ 1'b0 : lock_seq);
+ always @(posedge aclk or negedge aresetn)
+ begin : locked_sequence_reg
+ if (!aresetn)
+ lock_seq <= 1'b0;
+ else if (master_hndshk || slave_hndshk || ar_lock_hndshk || ar_unlock_hndshk)
+ lock_seq <= next_lock_seq;
+ end
+ assign bypass = (awburst_s == `AXI_ABURST_FIXED ) || ~awcache_s[1] || (awlen_s == `AXI_ALEN_1);
+generate
+ if( US_DATA_WIDTH == 32 )
+ begin
+ always @(*)
+ begin : total_bytes_p32
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { awlen_s, 2'b11};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+ else if( US_DATA_WIDTH == 64 )
+ begin
+ always @(*)
+ begin : total_bytes_p64
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, 2'b11};
+ `AXI_ASIZE_64 :
+ total_bytes = { awlen_s, 3'b111};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+ else if( US_DATA_WIDTH == 128 )
+ begin
+ always @(*)
+ begin : total_bytes_p128
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, 2'b11};
+ `AXI_ASIZE_64 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, 3'b111};
+ `AXI_ASIZE_128 :
+ total_bytes = { awlen_s, 4'b1111};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+ else if( US_DATA_WIDTH == 256 )
+ begin
+ always @(*)
+ begin : total_bytes_p256
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, 2'b11};
+ `AXI_ASIZE_64 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, 3'b111};
+ `AXI_ASIZE_128 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, 4'b1111};
+ `AXI_ASIZE_256 :
+ total_bytes = { awlen_s, 5'b11111};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+ else if( US_DATA_WIDTH == 512 )
+ begin
+ always @(*)
+ begin : total_bytes_p512
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, 2'b11};
+ `AXI_ASIZE_64 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, 3'b111};
+ `AXI_ASIZE_128 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, 4'b1111};
+ `AXI_ASIZE_256 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-5){1'b0}}, awlen_s, 5'b11111};
+ `AXI_ASIZE_512 :
+ total_bytes = { awlen_s, 6'b111111};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+ else
+ begin
+ always @(*)
+ begin : total_bytes_p_others
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, 1'b1};
+ `AXI_ASIZE_32 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, 2'b11};
+ `AXI_ASIZE_64 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, 3'b111};
+ `AXI_ASIZE_128 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, 4'b1111};
+ `AXI_ASIZE_256 :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8-5){1'b0}}, awlen_s, 5'b11111};
+ `AXI_ASIZE_512 :
+ total_bytes = { awlen_s, 6'b111111};
+ default :
+ total_bytes = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ endcase
+ end
+ end
+endgenerate
+
+ assign total_bytes_ext = { {WDATA_CAM_WIDTH_UP{1'b0}},total_bytes };
+
+
+generate
+
+
+if(DS_DATA_WIDTH==512) begin:wrmsk512
+ always @(*)
+ begin : wrap_size_len
+
+ if (total_bytes_ext[6]&&(DS_DATA_WIDTH>=512)) begin
+ wrapfitsize = `AXI_ASIZE_1024;
+ wrapsize = `AXI_ASIZE_512;
+ wraplen = total_bytes_ext[9:6];
+ wrapalignmask = {1'b0, 6'b111111};
+ end else if (total_bytes_ext[5]&&(DS_DATA_WIDTH>=256)) begin
+ wrapfitsize = `AXI_ASIZE_512;
+ wrapsize = `AXI_ASIZE_256;
+ wraplen = total_bytes_ext[8:5];
+ wrapalignmask = {2'b0, 5'b11111};
+ end else if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+ end
+
+
+if(DS_DATA_WIDTH==256) begin:wrmsk256
+ always @(*)
+ begin : wrap_size_len
+
+ if (total_bytes_ext[5]&&(DS_DATA_WIDTH>=256)) begin
+ wrapfitsize = `AXI_ASIZE_512;
+ wrapsize = `AXI_ASIZE_256;
+ wraplen = total_bytes_ext[8:5];
+ wrapalignmask = {2'b0, 5'b11111};
+ end else if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;//x;
+ wrapsize = 3'b0;//x;
+ wraplen = 4'b0;//x;
+ wrapalignmask = 7'b0;//x;
+ end
+ end
+ end
+
+
+if(DS_DATA_WIDTH==128) begin:wrmsk128
+ always @(*)
+ begin : wrap_size_len
+
+ if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+ end
+
+
+
+if(DS_DATA_WIDTH==64) begin:wrmsk64
+ always @(*)
+ begin : wrap_size_len
+
+ if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+ end
+
+
+
+if(DS_DATA_WIDTH==32) begin:wrmsk32
+ always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+ end
+
+endgenerate
+
+
+
+/*
+
+ always @(*)
+ begin : wrap_size_len
+ if (total_bytes_ext[6]&&(DS_DATA_WIDTH>=512)) begin
+ wrapfitsize = `AXI_ASIZE_1024;
+ wrapsize = `AXI_ASIZE_512;
+ wraplen = total_bytes_ext[9:6];
+ wrapalignmask = {1'b0, 6'b111111};
+ end else
+ if (total_bytes_ext[5]&&(DS_DATA_WIDTH>=256)) begin
+ wrapfitsize = `AXI_ASIZE_512;
+ wrapsize = `AXI_ASIZE_256;
+ wraplen = total_bytes_ext[8:5];
+ wrapalignmask = {2'b0, 5'b11111};
+ end else if (total_bytes_ext[4]&&(DS_DATA_WIDTH>=128)) begin
+ wrapfitsize = `AXI_ASIZE_256;
+ wrapsize = `AXI_ASIZE_128;
+ wraplen = total_bytes_ext[7:4];
+ wrapalignmask = {3'b0, 4'b1111};
+ end else if (total_bytes_ext[3]&&(DS_DATA_WIDTH>=64)) begin
+ wrapfitsize = `AXI_ASIZE_128;
+ wrapsize = `AXI_ASIZE_64;
+ wraplen = total_bytes_ext[6:3];
+ wrapalignmask = {4'b0, 3'b111};
+ end else if (total_bytes_ext[2]&&(DS_DATA_WIDTH>=32)) begin
+ wrapfitsize = `AXI_ASIZE_64;
+ wrapsize = `AXI_ASIZE_32;
+ wraplen = total_bytes_ext[5:2];
+ wrapalignmask = {5'b0, 2'b11};
+ end else if (total_bytes_ext[1]&&(DS_DATA_WIDTH>=16)) begin
+ wrapfitsize = `AXI_ASIZE_32;
+ wrapsize = `AXI_ASIZE_16;
+ wraplen = total_bytes_ext[4:1];
+ wrapalignmask = {6'b0, 1'b1};
+ end else if (total_bytes_ext[0]&&(DS_DATA_WIDTH>=8))begin
+ wrapfitsize = `AXI_ASIZE_16;
+ wrapsize = `AXI_ASIZE_8;
+ wraplen = total_bytes_ext[3:0];
+ wrapalignmask = 7'b0;
+ end else begin
+ wrapfitsize = 3'b0;
+ wrapsize = 3'b0;
+ wraplen = 4'b0;
+ wrapalignmask = 7'b0;
+ end
+ end
+
+*/
+
+ assign working_addr = awaddr_s[DS_ADDR_AL_WIDTH:0] & wrapalignmask[DS_ADDR_AL_WIDTH:0];
+ assign wrap_fits_mask = {{(TOTAL_BYTES_WIDTH-DS_ADDR_AL_WIDTH){1'b1}}, {DS_ADDR_AL_WIDTH{1'b0}}};
+ assign wrap_fits = ~|(total_bytes & wrap_fits_mask) & (awburst_s == `AXI_ABURST_WRAP);
+ assign wrap_is_incr = ~|(awaddr_s[TOTAL_BYTES_WIDTH-1:0] & total_bytes);
+ assign wrap_aligned = ~|working_addr & (awburst_s == `AXI_ABURST_WRAP) & ~bypass & ~wrap_is_incr & ~wrap_fits ;
+ assign wrap_split = ((|working_addr)) & (awburst_s == `AXI_ABURST_WRAP) & ~bypass & ~wrap_fits;
+ assign wrap_boundary_mask = total_bytes;
+ assign bytes_to_transfer_wrap1 = ~(awaddr_s[TOTAL_BYTES_WIDTH-1:0]) & wrap_boundary_mask;
+ assign bytes_to_transfer = (wrap_split_reg) ? wrap_bytes_remaining_reg
+ : ((awburst_s == `AXI_ABURST_WRAP) ? bytes_to_transfer_wrap1
+ : total_bytes_masked);
+generate
+ if(US_DATA_WIDTH == 32)
+ begin
+ always @(*)
+ begin : total_bytes_masked_p32
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { awlen_s, ~awaddr_s[1:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(US_DATA_WIDTH == 64)
+ begin
+ always @(*)
+ begin : total_bytes_masked_p64
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}} , awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}} , awlen_s, ~awaddr_s[1:0]};
+ `AXI_ASIZE_64 : //total_bytes_masked = {3'h0, awlen_s, ~awaddr_s[2:0]};
+ total_bytes_masked = { awlen_s, ~awaddr_s[2:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(US_DATA_WIDTH == 128)
+ begin
+ always @(*)
+ begin : total_bytes_masked_p128
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}} , awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}} , awlen_s, ~awaddr_s[1:0]};
+ `AXI_ASIZE_64 : //total_bytes_masked = {3'h0, awlen_s, ~awaddr_s[2:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}} , awlen_s, ~awaddr_s[2:0]};
+ `AXI_ASIZE_128 : //total_bytes_masked = {2'h0, awlen_s, ~awaddr_s[3:0]};
+ total_bytes_masked = { awlen_s, ~awaddr_s[3:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(US_DATA_WIDTH == 256)
+ begin
+ always @(*)
+ begin : total_bytes_masked_p256
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, ~awaddr_s[1:0]};
+ `AXI_ASIZE_64 : //total_bytes_masked = {3'h0, awlen_s, ~awaddr_s[2:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, ~awaddr_s[2:0]};
+ `AXI_ASIZE_128 : //total_bytes_masked = {2'h0, awlen_s, ~awaddr_s[3:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, ~awaddr_s[3:0]};
+ `AXI_ASIZE_256 : //total_bytes_masked = {1'h0, awlen_s, ~awaddr_s[4:0]};
+ total_bytes_masked = { awlen_s, ~awaddr_s[4:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else if(US_DATA_WIDTH == 512)
+ begin
+ always @(*)
+ begin : total_bytes_masked_p512
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, ~awaddr_s[1:0]};
+ `AXI_ASIZE_64 : //total_bytes_masked = {3'h0, awlen_s, ~awaddr_s[2:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, ~awaddr_s[2:0]};
+ `AXI_ASIZE_128 : //total_bytes_masked = {2'h0, awlen_s, ~awaddr_s[3:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, ~awaddr_s[3:0]};
+ `AXI_ASIZE_256 : //total_bytes_masked = {1'h0, awlen_s, ~awaddr_s[4:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-5){1'b0}}, awlen_s, ~awaddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { awlen_s, ~awaddr_s[5:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+ else
+ begin
+ always @(*)
+ begin : total_bytes_masked_pothers
+ case (awsize_s)
+ `AXI_ASIZE_8 :
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8){1'b0}}, awlen_s};
+ `AXI_ASIZE_16 : //total_bytes_masked = {5'h0, awlen_s, ~awaddr_s[0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-1){1'b0}}, awlen_s, ~awaddr_s[0]};
+ `AXI_ASIZE_32 : //total_bytes_masked = {4'h0, awlen_s, ~awaddr_s[1:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-2){1'b0}}, awlen_s, ~awaddr_s[1:0]};
+ `AXI_ASIZE_64 : //total_bytes_masked = {3'h0, awlen_s, ~awaddr_s[2:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-3){1'b0}}, awlen_s, ~awaddr_s[2:0]};
+ `AXI_ASIZE_128 : //total_bytes_masked = {2'h0, awlen_s, ~awaddr_s[3:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-4){1'b0}}, awlen_s, ~awaddr_s[3:0]};
+ `AXI_ASIZE_256 : //total_bytes_masked = {1'h0, awlen_s, ~awaddr_s[4:0]};
+ total_bytes_masked = { {(TOTAL_BYTES_WIDTH-8-5){1'b0}}, awlen_s, ~awaddr_s[4:0]};
+ `AXI_ASIZE_512 : total_bytes_masked = { awlen_s, ~awaddr_s[5:0]};
+ default :
+ total_bytes_masked = {TOTAL_BYTES_WIDTH{1'b0}};
+ endcase
+ end
+ end
+endgenerate
+
+ assign offset_address = (wrap_split_reg) ? awaddr_aligned[DS_ADDR_AL_WIDTH-1:0] :
+ awaddr_s[DS_ADDR_AL_WIDTH-1:0];
+ assign half_carry = bytes_to_transfer[0] & offset_address[0];
+ assign half_carry_double = half_carry & bytes_to_transfer[1];
+ assign word_carry = {1'b0, bytes_to_transfer[1:0]} + {1'b0, offset_address[1:0]};
+ assign word_carry_double = word_carry[2] & bytes_to_transfer[2];
+ generate
+ if(DS_DATA_WIDTH>=64) begin: dword_carry_64
+ assign dword_carry = {1'b0, bytes_to_transfer[2:0]} + {1'b0, offset_address[2:0]};
+ assign dword_carry_double = dword_carry[3] & bytes_to_transfer[3];
+ end
+ else begin: dword_carry_useless
+ assign dword_carry=4'h0;
+ assign dword_carry_double=1'h0;
+ end
+endgenerate
+generate
+ if(DS_DATA_WIDTH>=128) begin: qword_carry_128
+ assign qword_carry = {1'b0, bytes_to_transfer[3:0]} + {1'b0, offset_address[3:0]};
+ assign qword_carry_double = qword_carry[4] & bytes_to_transfer[4];
+ end
+ else begin: qword_carry_useless
+ assign qword_carry=5'h0;
+ assign qword_carry_double=1'h0;
+ end
+endgenerate
+generate
+ if(DS_DATA_WIDTH>=256) begin: oword_carry_256
+ assign oword_carry = {1'b0, bytes_to_transfer[4:0]} + {1'b0, offset_address[4:0]};
+ assign oword_carry_double = oword_carry[5] & bytes_to_transfer[5];
+ end
+ else begin: oword_carry_useless
+ assign oword_carry=6'h0;
+ assign oword_carry_double=1'h0;
+ end
+endgenerate
+
+generate
+ if(DS_DATA_WIDTH == 32)
+ begin:bytes_lt_32
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ end
+ else if(DS_DATA_WIDTH == 64)
+ begin:bytes_lt_64
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ end
+ else if(DS_DATA_WIDTH == 128)
+ begin:bytes_lt_128
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ assign bytes_lt_sixt_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~qword_carry[4];
+ assign bytes_lt_ttwo_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~qword_carry_double;
+ end
+ else if(DS_DATA_WIDTH == 256)
+ begin:bytes_lt_256
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ assign bytes_lt_sixt_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~qword_carry[4];
+ assign bytes_lt_ttwo_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~qword_carry_double;
+ assign bytes_lt_ttwo_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~oword_carry[5];
+ assign bytes_lt_sfour_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:6] & ~oword_carry_double;
+ end
+ else if(DS_DATA_WIDTH == 512)
+ begin:bytes_lt_512
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ assign bytes_lt_sixt_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~qword_carry[4];
+ assign bytes_lt_ttwo_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~qword_carry_double;
+ assign bytes_lt_ttwo_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~oword_carry[5];
+ assign bytes_lt_sfour_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:6] & ~oword_carry_double;
+ end
+ else
+ begin:bytes_lt_others
+ assign bytes_lt_one_byte = ~|bytes_to_transfer;
+ assign bytes_lt_two_byte = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1];
+ assign bytes_lt_two_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:1] & ~half_carry;
+ assign bytes_lt_four_half = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~half_carry_double;
+ assign bytes_lt_four_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:2] & ~word_carry[2];
+ assign bytes_lt_eight_word = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~word_carry_double;
+ assign bytes_lt_eight_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:3] & ~dword_carry[3];
+ assign bytes_lt_sixt_dword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~dword_carry_double;
+ assign bytes_lt_sixt_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:4] & ~qword_carry[4];
+ assign bytes_lt_ttwo_qword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~qword_carry_double;
+ assign bytes_lt_ttwo_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:5] & ~oword_carry[5];
+ assign bytes_lt_sfour_oword = ~|bytes_to_transfer[TOTAL_BYTES_WIDTH-1:6] & ~oword_carry_double;
+ end
+endgenerate
+generate
+ if(DS_DATA_WIDTH == 32)
+ begin:incrsize_32
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end
+ end
+ end
+ else if(DS_DATA_WIDTH == 64)
+ begin:incrsize_64
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end
+ end
+ end
+ else if(DS_DATA_WIDTH == 128)
+ begin:incrsize_128
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end else if ((bytes_lt_sixt_qword || (bytes_lt_ttwo_qword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=5) ? 4:0)])))&&(DS_DATA_WIDTH>=256)) begin
+ incrsize = `AXI_ASIZE_128;
+ end
+ end
+ end
+ else if(DS_DATA_WIDTH == 256)
+ begin:incrsize_256
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end else if ((bytes_lt_sixt_qword || (bytes_lt_ttwo_qword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=5) ? 4:0)])))&&(DS_DATA_WIDTH>=256)) begin
+ incrsize = `AXI_ASIZE_128;
+ end else if ((bytes_lt_ttwo_oword || (bytes_lt_sfour_oword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=6) ? 4:0)])))&&(DS_DATA_WIDTH>=512)) begin
+ incrsize = `AXI_ASIZE_256;
+ end
+ end
+ end
+ else if(DS_DATA_WIDTH == 512)
+ begin:incrsize_512
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end else if ((bytes_lt_sixt_qword || (bytes_lt_ttwo_qword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=5) ? 4:0)])))&&(DS_DATA_WIDTH>=256)) begin
+ incrsize = `AXI_ASIZE_128;
+ end else if ((bytes_lt_ttwo_oword || (bytes_lt_sfour_oword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=6) ? 5:0)])))&&(DS_DATA_WIDTH>=512)) begin
+ incrsize = `AXI_ASIZE_256;
+ end
+ end
+ end
+ else
+ begin:incrsize_others
+ always @(*)
+ begin : size_lookup
+ incrsize = DS_ADDR_AL_WIDTH;
+ if ((bytes_lt_one_byte || (bytes_lt_two_byte && (&offset_address[DS_ADDR_AL_WIDTH-1:0])))&&(DS_DATA_WIDTH>=16)) begin
+ incrsize = `AXI_ASIZE_8;
+ end else if ((bytes_lt_two_half || (bytes_lt_four_half && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=2) ? 1:0)])))&&(DS_DATA_WIDTH>=32)) begin
+ incrsize = `AXI_ASIZE_16;
+ end else if ((bytes_lt_four_word || (bytes_lt_eight_word && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=3) ? 2:0)])))&&(DS_DATA_WIDTH>=64)) begin
+ incrsize = `AXI_ASIZE_32;
+ end else if ((bytes_lt_eight_dword || (bytes_lt_sixt_dword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=4) ? 3:0)])))&&(DS_DATA_WIDTH>=128)) begin
+ incrsize = `AXI_ASIZE_64;
+ end else if ((bytes_lt_sixt_qword || (bytes_lt_ttwo_qword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=5) ? 4:0)])))&&(DS_DATA_WIDTH>=256)) begin
+ incrsize = `AXI_ASIZE_128;
+ end else if ((bytes_lt_ttwo_oword || (bytes_lt_sfour_oword && (&offset_address[DS_ADDR_AL_WIDTH-1:((DS_ADDR_AL_WIDTH>=6) ? 4:0)])))&&(DS_DATA_WIDTH>=512)) begin
+ incrsize = `AXI_ASIZE_256;
+ end
+ end
+ end
+endgenerate
+ assign final_address = {1'b0, offset_address} + {1'b0, bytes_to_transfer_large[DS_ADDR_AL_WIDTH-1:0]};
+ assign overflow = final_address[DS_ADDR_AL_WIDTH];
+ assign bytes_to_transfer_large = {8'h0, bytes_to_transfer};
+ assign incrlenmaxsize = bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:((DS_AXI3==1) ? 4 : 8)] + 4'b1;
+ assign incrlen = (overflow) ? incrlenmaxsize : ((DS_AXI3==1) ? {4'b0000,bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:4]}:bytes_to_transfer_large[DS_ADDR_AL_WIDTH+:8]);
+
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_wr_cntrl.v b/axi2sramcrs/rtl/upsizer/upsize_wr_cntrl.v
new file mode 100644
index 0000000..d887a1c
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_wr_cntrl.v
@@ -0,0 +1,280 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_wr_cntrl
+ (
+ awfifo_ready, wready_s, merge, merge_clear, data_select, wvalid_m,
+ wdata_m, wstrb_m, wlast_m, wuser_m, wid_m,
+ aclk, aresetn, awfifo_valid, awfifo_data, wvalid_s, wlast, wuser,
+ wid, strb_skid_valid, wdata_merged, wstrb_merged, wready_m
+ );
+`include "Axi.v"
+parameter ARID_WIDTH=4;
+parameter AWID_WIDTH=4;
+parameter ADDR_WIDTH=32;
+parameter US_DATA_WIDTH=256;
+parameter DS_DATA_WIDTH=128;
+parameter USER_WIDTH=4;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_ADDR_AL_WIDTH=$clog2(DS_WSTRB_WIDTH);
+localparam US_ADDR_AL_WIDTH=$clog2(US_WSTRB_WIDTH);
+localparam ARFMT_WIDTH=4+DS_ADDR_AL_WIDTH+US_ADDR_AL_WIDTH+3;
+localparam AWFMT_WIDTH=AWID_WIDTH+1+4+1+DS_ADDR_AL_WIDTH*2+3+1;
+localparam US_AW_WIDTH=4+USER_WIDTH+AWID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_AR_WIDTH=4+USER_WIDTH+ARID_WIDTH+ADDR_WIDTH+8+3+2+2+4+4+3+1;
+localparam US_R_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1;
+localparam US_W_WIDTH=USER_WIDTH+AWID_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam US_B_WIDTH=USER_WIDTH+AWID_WIDTH+2;
+localparam AW_IDB_WIDTH=US_AW_WIDTH+US_ADDR_AL_WIDTH-DS_ADDR_AL_WIDTH;
+localparam AR_IDB_WIDTH=US_AR_WIDTH+ARFMT_WIDTH;
+localparam W_IDB_WIDTH=USER_WIDTH+US_DATA_WIDTH+US_WSTRB_WIDTH+1;
+localparam R_IDB_WIDTH=USER_WIDTH+ARID_WIDTH+US_DATA_WIDTH+2+1+DS_ADDR_AL_WIDTH;
+localparam B_IDB_WIDTH=USER_WIDTH+2+AWID_WIDTH;
+localparam DATA_RATIO=(DS_DATA_WIDTH/US_DATA_WIDTH);
+ input aclk;
+ input aresetn;
+ output awfifo_ready;
+ input awfifo_valid;
+ input [AWFMT_WIDTH-1:0] awfifo_data;
+ input wvalid_s;
+ output wready_s;
+ input wlast;
+ input [USER_WIDTH-1:0] wuser;
+ input [AWID_WIDTH-1:0] wid;
+ output merge;
+ output merge_clear;
+ output [DATA_RATIO-1:0] data_select;
+ input strb_skid_valid;
+ input [DS_DATA_WIDTH-1:0] wdata_merged;
+ input [DS_WSTRB_WIDTH-1:0] wstrb_merged;
+ output wvalid_m;
+ input wready_m;
+ output [DS_DATA_WIDTH-1:0] wdata_m;
+ output [DS_WSTRB_WIDTH-1:0] wstrb_m;
+ output wlast_m;
+ output [USER_WIDTH-1:0] wuser_m;
+ output [AWID_WIDTH-1:0] wid_m;
+ wire slavew_hndshk;
+ wire wfifo_hndshk;
+ wire awfifo_hndshk;
+ wire bypass_in;
+ wire [2:0] write_size;
+ wire [DS_ADDR_AL_WIDTH-1:0] write_addr;
+ wire [DS_ADDR_AL_WIDTH-1:0] write_addr_mask;
+ wire [3:0] write_len_tb;
+ wire bypass;
+ wire [2:0] a_size;
+ wire [DS_ADDR_AL_WIDTH-1:0] addr_mask;
+ wire [DS_ADDR_AL_WIDTH-1:0] addr_internal;
+ wire [3:0] beat_count;
+ wire [DS_ADDR_AL_WIDTH:0] addr_incr;
+ wire [DS_ADDR_AL_WIDTH-1:0] store_addr;
+ wire [3:0] beat_reg_next;
+ wire beat_reg_wr_en;
+ wire wrap_fits_in;
+ wire wrap_fits;
+ wire split_wrap;
+ wire split_wrap_in;
+ wire split_wrap_reg_en;
+ wire split_wrap_reg_next;
+ wire cross_boundary;
+ wire cross_boundary_sel;
+ wire idle;
+ wire insert_extra_wlast;
+ wire wlast_sel;
+ wire wfifo_valid_next;
+ wire wfifo_should_push;
+ wire busy_reg_next;
+ wire reg_wr_en;
+ wire reg_update;
+ wire [AWID_WIDTH-1:0] wid_in;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_reg;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_mask_reg;
+ reg cross_boundary_reg;
+ reg [2:0] size_reg;
+ reg bypass_reg;
+ reg [3:0] beat_reg;
+ reg split_wrap_reg;
+ reg wrap_fits_reg;
+ reg [6:0] size_incr;
+ reg [DS_ADDR_AL_WIDTH-1:0] addr_reg_nxt;
+ wire [DATA_RATIO-1:0] data_select;
+ reg wfifo_valid_reg;
+ reg busy_reg;
+ reg merge_clear;
+ reg wlast_reg;
+ reg [USER_WIDTH-1:0] wuser_reg;
+ reg [AWID_WIDTH-1:0] wid_reg;
+ assign slavew_hndshk = wvalid_s && wready_s;
+ assign wfifo_hndshk = wvalid_m && wready_m;
+ assign awfifo_hndshk = awfifo_valid && awfifo_ready;
+ assign merge = slavew_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : last_clear_p
+ if (!aresetn)
+ merge_clear <= 1'b0;
+ else if (merge || wfifo_hndshk)
+ merge_clear <= wfifo_hndshk;
+ end
+ assign idle = (~awfifo_valid && ~busy_reg);
+genvar i;
+generate
+ for(i=0;i<DATA_RATIO;i=i+1) begin: for_data_select
+ assign data_select[i]=(idle) ? 1'h1 : (addr_internal[DS_ADDR_AL_WIDTH-1:US_ADDR_AL_WIDTH]==i);
+ end
+endgenerate
+ assign wready_s = ~strb_skid_valid & ~wfifo_valid_reg;
+ assign awfifo_ready = ~busy_reg;
+ assign wfifo_valid_next = ((wvalid_m & ~wready_m) || wfifo_valid_reg) & ~wfifo_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : wfifo_valid_seq
+ if (!aresetn)
+ wfifo_valid_reg <= 1'b0;
+ else
+ wfifo_valid_reg <= wfifo_valid_next;
+ end
+ assign wfifo_should_push = (bypass || wlast_sel || cross_boundary_sel) & (busy_reg || awfifo_hndshk);
+ assign wvalid_m = wfifo_should_push & (wfifo_valid_reg || merge || strb_skid_valid);
+ assign reg_update = slavew_hndshk || (busy_reg_next && strb_skid_valid);
+ always @(posedge aclk or negedge aresetn)
+ begin : wfifo_data_int_seq
+ if (!aresetn) begin
+ wlast_reg <= 1'b0;
+ wuser_reg <= {USER_WIDTH{1'b0}};
+ end else if (slavew_hndshk) begin
+ wlast_reg <= wlast;
+ wuser_reg <= wuser;
+ end
+ end
+ always @(posedge aclk or negedge aresetn)
+ begin : cross_boundary_reg_seq
+ if (!aresetn) begin
+ cross_boundary_reg <= 1'b0;
+ end else if (reg_update) begin
+ cross_boundary_reg <= cross_boundary;
+ end
+ end
+ assign wlast_sel = (wready_s) ? (wlast & wvalid_s) : wlast_reg;
+ assign cross_boundary_sel = (wfifo_valid_reg) ? cross_boundary_reg : cross_boundary;
+ assign busy_reg_next = ((awfifo_hndshk & ~(strb_skid_valid & wfifo_valid_reg) & ~(wlast_sel & wfifo_hndshk))) ? 1'b1 :
+ ((wfifo_hndshk & wlast_sel) ? 1'b0 : busy_reg);
+ always @(posedge aclk or negedge aresetn)
+ begin : busy_seq
+ if (!aresetn)
+ busy_reg <= 1'b0;
+ else
+ busy_reg <= busy_reg_next;
+ end
+assign {
+ wid_in,
+ split_wrap_in,
+ write_len_tb,
+ wrap_fits_in,
+ write_addr_mask,
+ write_addr,
+ write_size,
+ bypass_in
+ } = awfifo_data;
+ assign wlast_m = wlast_sel || insert_extra_wlast;
+ assign wid_m = (awfifo_valid ? wid_in : wid_reg);
+ assign wuser_m = (wfifo_valid_reg || strb_skid_valid) ? wuser_reg : wuser;
+ assign wdata_m = wdata_merged;
+ assign wstrb_m = wstrb_merged;
+ assign insert_extra_wlast = (~|beat_count & ~bypass & split_wrap);
+ assign beat_reg_next = (|beat_count & wfifo_hndshk) ? beat_count - 4'b1 : beat_count;
+ assign beat_reg_wr_en = (wfifo_hndshk || awfifo_hndshk)& split_wrap;
+ always @(posedge aclk or negedge aresetn)
+ begin : beat_cnt_p
+ if (!aresetn)
+ beat_reg <= 4'b0;
+ else if (beat_reg_wr_en)
+ beat_reg <= beat_reg_next;
+ end
+ assign split_wrap_reg_en = awfifo_hndshk || (insert_extra_wlast & wfifo_hndshk);
+ assign split_wrap_reg_next = split_wrap & ~(insert_extra_wlast & wfifo_hndshk);
+ always @(posedge aclk or negedge aresetn)
+ begin : unaligned_p
+ if (!aresetn)
+ split_wrap_reg <= 1'b0;
+ else if (split_wrap_reg_en)
+ split_wrap_reg <= split_wrap_reg_next;
+ end
+ assign addr_internal = (awfifo_hndshk) ? write_addr : addr_reg;
+ assign addr_mask = (awfifo_hndshk) ? write_addr_mask : addr_mask_reg;
+ assign bypass = (awfifo_hndshk) ? bypass_in : bypass_reg;
+ assign a_size = (awfifo_hndshk) ? write_size : size_reg;
+ assign wrap_fits = (awfifo_hndshk) ? wrap_fits_in : wrap_fits_reg;
+ assign beat_count = (awfifo_hndshk) ? write_len_tb : beat_reg;
+ assign split_wrap = (awfifo_hndshk) ? split_wrap_in : split_wrap_reg;
+ always @(*)
+ begin : size_incr_p
+ case (a_size)
+ `AXI_ASIZE_8 : size_incr = {6'b0, 1'b1};
+ `AXI_ASIZE_16 : size_incr = {5'b0, 2'b10};
+ `AXI_ASIZE_32 : size_incr = {4'b0, 3'b100};
+ `AXI_ASIZE_64 : size_incr = {3'b0, 4'b1000};
+ `AXI_ASIZE_128 : size_incr = {2'b0, 5'b10000};
+ `AXI_ASIZE_256 : size_incr = {1'b0, 6'b100000};
+ `AXI_ASIZE_512 : size_incr = {7'b1000000};
+ default : size_incr = {7'bx};
+ endcase
+ end
+ assign addr_incr = {1'b0, addr_internal} + size_incr[DS_ADDR_AL_WIDTH:0];
+ always @(*)
+ begin : addr_reg_nxt_p
+ integer index_i;
+ for (index_i = 0; index_i < DS_ADDR_AL_WIDTH ; index_i = index_i + 1)
+ begin
+ if (addr_mask[index_i] == 1'b1)
+ addr_reg_nxt[index_i] = addr_incr[index_i];
+ else
+ addr_reg_nxt[index_i] = addr_internal[index_i];
+ end
+ end
+ assign store_addr = (reg_update) ? addr_reg_nxt : addr_internal;
+ assign reg_wr_en = merge || awfifo_hndshk;
+ always @(posedge aclk or negedge aresetn)
+ begin : addr_seq
+ if (!aresetn)
+ addr_reg <= {DS_ADDR_AL_WIDTH{1'b0}};
+ else if (reg_wr_en)
+ addr_reg <= store_addr;
+ end
+ always @(posedge aclk or negedge aresetn)
+ begin : store_seq
+ if (!aresetn) begin
+ addr_mask_reg <= {DS_ADDR_AL_WIDTH{1'b0}};
+ wid_reg <= {AWID_WIDTH{1'b0}};
+ bypass_reg <= 1'b0;
+ size_reg <= 3'b0;
+ wrap_fits_reg <= 1'b0;
+ end else if (awfifo_hndshk) begin
+ addr_mask_reg <= write_addr_mask;
+ wid_reg <= wid_in;
+ bypass_reg <= bypass_in;
+ size_reg <= write_size;
+ wrap_fits_reg <= wrap_fits_in;
+ end
+ end
+ assign cross_boundary = (|((addr_incr ^ {1'b0, addr_internal}) & ({1'b1, ~addr_mask} ))) & ~(wrap_fits);
+endmodule
+`include "Axi_undefs.v"
diff --git a/axi2sramcrs/rtl/upsizer/upsize_wr_merge_buffer.v b/axi2sramcrs/rtl/upsizer/upsize_wr_merge_buffer.v
new file mode 100644
index 0000000..bdd3b0a
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_wr_merge_buffer.v
@@ -0,0 +1,102 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_wr_merge_buffer
+ (
+ wdata_out,
+ wstrb_out,
+ merge_skid_valid,
+ wdata_in,
+ wstrb_in,
+ data_select,
+ merge,
+ merge_clear,
+ aclk,
+ aresetn
+ );
+parameter US_DATA_WIDTH=128;
+parameter DS_DATA_WIDTH=256;
+localparam US_WSTRB_WIDTH=US_DATA_WIDTH/8;
+localparam DS_WSTRB_WIDTH=DS_DATA_WIDTH/8;
+localparam DATA_RATIO=(DS_DATA_WIDTH/US_DATA_WIDTH);
+ input aclk;
+ input aresetn;
+ output [DS_DATA_WIDTH-1:0] wdata_out;
+ output [DS_WSTRB_WIDTH-1:0] wstrb_out;
+ output merge_skid_valid;
+ input [US_DATA_WIDTH-1:0] wdata_in;
+ input [US_WSTRB_WIDTH-1:0] wstrb_in;
+ input [DATA_RATIO-1:0] data_select;
+ input merge;
+ input merge_clear;
+ wire [DS_DATA_WIDTH-1:0] wide_wdata_in;
+ wire [DS_WSTRB_WIDTH-1:0] wide_wstrb_in;
+ wire [DS_WSTRB_WIDTH-1:0] wide_wstrb_masked;
+ wire [DS_WSTRB_WIDTH-1:0] wstrb_out_i;
+ wire update_strb;
+ wire strb_skid_valid_wr;
+ wire strb_skid_valid_nxt;
+ wire all_bytes;
+ wire [DS_WSTRB_WIDTH-1:0] merge_byte,merge_strb,next_strb;
+ reg strb_skid_valid;
+ reg [7:0] merged_byte[DS_WSTRB_WIDTH-1:0];
+ reg merged_strb[DS_WSTRB_WIDTH-1:0];
+ assign wide_wdata_in = {DATA_RATIO{wdata_in}};
+ assign wide_wstrb_masked = {DATA_RATIO{wstrb_in}} | {DS_WSTRB_WIDTH{all_bytes}};
+ assign wide_wstrb_in = {DATA_RATIO{wstrb_in}};
+ assign all_bytes = data_select == {DATA_RATIO{1'b1}};
+ assign update_strb = merge_clear || (merge && all_bytes)
+ || (~all_bytes && strb_skid_valid);
+ assign strb_skid_valid_wr = (merge && all_bytes) || update_strb;
+ assign strb_skid_valid_nxt = merge && all_bytes;
+ always @(posedge aclk or negedge aresetn)
+ begin : strb_skid_valid_p
+ if (!aresetn)
+ strb_skid_valid <= 1'b0;
+ else if (strb_skid_valid_wr)
+ strb_skid_valid <= strb_skid_valid_nxt;
+ end
+ assign merge_skid_valid = strb_skid_valid;
+genvar i;
+generate
+ for(i=0;i<DS_WSTRB_WIDTH;i=i+1) begin:merge_byte_g
+ assign merge_byte[i]=merge && data_select[i/US_WSTRB_WIDTH] && wide_wstrb_masked[i];
+ assign wdata_out[i*8+:8]=merge_byte[i] ? wide_wdata_in[i*8+:8] : merged_byte[i];
+ assign merge_strb[i]=merge_byte[i] | update_strb;
+ assign wstrb_out_i[i] = merge_byte[i] ? wide_wstrb_in[i] :
+ (((strb_skid_valid && data_select[i/US_WSTRB_WIDTH]) || (~strb_skid_valid && ~update_strb)) ? merged_strb[i] : 1'b0);
+ assign wstrb_out[i] = wstrb_out_i[i];
+ assign next_strb[i] = wstrb_out_i[i];
+ always @(posedge aclk)
+ begin : byte_seq
+ if (merge_byte[i])
+ merged_byte[i] <= wide_wdata_in[i*8+:8];
+ end
+ always @(posedge aclk or negedge aresetn)
+ begin : byte_strb_seq
+ if (!aresetn)
+ merged_strb[i] <= 1'b0;
+ else if (merge_strb[i])
+ merged_strb[i] <= next_strb[i];
+ end
+ end
+endgenerate
+endmodule
diff --git a/axi2sramcrs/rtl/upsizer/upsize_wr_resp_block.v b/axi2sramcrs/rtl/upsizer/upsize_wr_resp_block.v
new file mode 100644
index 0000000..4e9ebfb
--- /dev/null
+++ b/axi2sramcrs/rtl/upsizer/upsize_wr_resp_block.v
@@ -0,0 +1,170 @@
+//****************************************************************************
+//
+// Copyright 2017-2023 Vivante Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//****************************************************************************
+// Auto-generated file on 11/03/2023.
+//
+//****************************************************************************
+
+module upsize_wr_resp_block
+ (
+ bchannel_ready, bvalid_s, bready_m, bid_s, bresp_s, buser_s,
+ aclk, aresetn, bvalid_m, bready_s, bid_m, bresp_m, buser_m,
+ bchannel_valid, bchannel_data
+ );
+parameter AWID_WIDTH=4;
+parameter USER_WIDTH=4;
+parameter WR_ISS=8;
+localparam PTR_WIDTH=$clog2(WR_ISS+1);
+localparam BCHAN_WIDTH=AWID_WIDTH+1;
+ input aclk;
+ input aresetn;
+ output bchannel_ready;
+ output bvalid_s;
+ output bready_m;
+ output [AWID_WIDTH-1:0] bid_s;
+ output [1:0] bresp_s;
+ output [USER_WIDTH-1:0] buser_s;
+ input bvalid_m;
+ input bready_s;
+ input [AWID_WIDTH-1:0] bid_m;
+ input [1:0] bresp_m;
+ input [USER_WIDTH-1:0] buser_m;
+ input bchannel_valid;
+ input [BCHAN_WIDTH-1:0] bchannel_data;
+ wire [WR_ISS-1:0] match_bus;
+ wire [WR_ISS-1:0] hazard_bus;
+ wire [WR_ISS-1:0] valid_bus;
+ wire [WR_ISS-1:0] valid_bus_zero_lsb;
+ wire [PTR_WIDTH-1:0] hazard_bus_one_pos[WR_ISS-1:0];
+ wire [PTR_WIDTH-1:0] match_bus_one_pos[WR_ISS-1:0];
+ wire match;
+ wire hazard;
+ wire bready_m_i;
+ wire bhndshk;
+ wire push_slice;
+ wire pop_slice;
+ wire update;
+ wire [AWID_WIDTH-1:0] awid;
+ wire n_response;
+ wire next_bchannel_ready;
+ wire [1:0] bresp_out[WR_ISS-1:0];
+ wire [WR_ISS-1:0] const_onehot[WR_ISS-1:0];
+ reg [PTR_WIDTH-1:0] hazard_pointer;
+ reg [PTR_WIDTH-1:0] match_pointer;
+ reg [WR_ISS-1:0] store;
+ reg bchannel_ready_i;
+ reg [1:0] bresp_out_or;
+ assign {
+ awid,
+ n_response
+ }=bchannel_data;
+ assign match = |match_bus;
+ assign hazard = |hazard_bus;
+ assign next_bchannel_ready = ~(&(valid_bus | (store & {WR_ISS{push_slice}}))) || (pop_slice);
+ always @(posedge aclk or negedge aresetn)
+ begin : bchannel_seq
+ if (!aresetn)
+ bchannel_ready_i <= 1'b0;
+ else
+ bchannel_ready_i <= next_bchannel_ready;
+ end
+ assign bchannel_ready = bchannel_ready_i;
+genvar i;
+generate
+ for(i=0;i<WR_ISS;i=i+1) begin: for_store
+ if(WR_ISS==1) begin: wr_iss_1
+ assign const_onehot[i]=(1'h1<<i);
+ end
+ else begin: wr_iss_n
+ assign const_onehot[i]=({{(WR_ISS-1){1'h0}},1'h1}<<i);
+ end
+ assign valid_bus_zero_lsb[i]=((~valid_bus[i:0])==const_onehot[i][i:0]);
+ assign hazard_bus_one_pos[i]={PTR_WIDTH{hazard_bus[i]}}&i;
+ assign match_bus_one_pos[i]={PTR_WIDTH{match_bus[i]}}&i;
+ always @(*)
+ begin : store_decode
+ if (&valid_bus)
+ store[i] = match_bus[i];
+ else
+ store[i] = valid_bus_zero_lsb[i];
+ end
+ end
+endgenerate
+ always @(*)
+ begin : hazard_num_distibution
+ integer a;
+ hazard_pointer={PTR_WIDTH{1'h0}};
+ for(a=0;a<WR_ISS;a=a+1) begin
+ hazard_pointer=hazard_pointer | hazard_bus_one_pos[a];
+ end
+ end
+ always @(*)
+ begin : match_num_distibution
+ integer a;
+ match_pointer={PTR_WIDTH{1'h0}};
+ for(a=0;a<WR_ISS;a=a+1) begin
+ match_pointer=match_pointer | match_bus_one_pos[a];
+ end
+ end
+ assign push_slice = bchannel_ready_i && bchannel_valid;
+ assign bhndshk = bvalid_m && bready_m_i;
+ assign update = bhndshk;
+ assign pop_slice = update && match;
+ assign bready_m_i = bvalid_m && (bready_s || ~match);
+ assign bready_m = bready_m_i;
+ assign bid_s = bid_m;
+ assign buser_s=buser_m;
+ always @(*)
+ begin:bresp_a
+ integer a;
+ bresp_out_or={2{1'h0}};
+ for(a=0;a<WR_ISS;a=a+1) begin
+ bresp_out_or=bresp_out_or | bresp_out[a];
+ end
+ end
+ assign bresp_s = (bresp_m
+ | bresp_out_or );
+ assign bvalid_s = (bvalid_m && match);
+generate
+for(i=0;i<WR_ISS;i=i+1) begin: resp_cam_slice_inst
+ upsize_resp_cam_slice #(
+ .ID_WIDTH(AWID_WIDTH),
+ .USER_WIDTH(USER_WIDTH),
+ .PTR_WIDTH(PTR_WIDTH)
+ ) u_upsize_resp_cam_slice
+ (
+ .aresetn (aresetn),
+ .aclk (aclk),
+ .matchid (bid_m),
+ .hazardid (awid),
+ .store (store[i]),
+ .push_slice (push_slice),
+ .pop_slice (pop_slice),
+ .update (update),
+ .match_pointer (match_pointer),
+ .hazard_in (hazard),
+ .hazard_pointer (hazard_pointer),
+ .n_response (n_response),
+ .bresp_in (bresp_m),
+ .hazard (hazard_bus[i]),
+ .match (match_bus[i]),
+ .valid (valid_bus[i]),
+ .bresp_out (bresp_out[i])
+ );
+end
+endgenerate
+endmodule