/* Copyright (c) 2020 - 2023 Wuhan University of Technology <295054118@whut.edu.cn> 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. */ `timescale 1 ns / 1 ps module axi_full_slv_sram # ( parameter DW = 32, parameter AW = 14 ) ( input [3:0] MEM_AWID, output [3:0] MEM_BID, input [3:0] MEM_ARID, output [3:0] MEM_RID, input [31:0] MEM_AWADDR, input [7:0] MEM_AWLEN, input [2:0] MEM_AWSIZE, input [1:0] MEM_AWBURST, input MEM_AWVALID, output MEM_AWREADY, input [DW-1:0] MEM_WDATA, input [DW/8-1:0] MEM_WSTRB, input MEM_WLAST, input MEM_WVALID, output MEM_WREADY, output [1:0] MEM_BRESP, output MEM_BVALID, input MEM_BREADY, input [31:0] MEM_ARADDR, input [7:0] MEM_ARLEN, input [2:0] MEM_ARSIZE, input [1:0] MEM_ARBURST, input MEM_ARVALID, output MEM_ARREADY, output [DW-1:0] MEM_RDATA, output [1:0] MEM_RRESP, output MEM_RLAST, output MEM_RVALID, input MEM_RREADY, input CLK, input RSTn ); localparam ADDR_LSB = $clog2(DW/8); gen_dffren # (.DW(4)) awid_dffren (.dnxt(MEM_AWID), .qout(MEM_BID), .en(MEM_AWVALID & MEM_AWREADY), .CLK(CLK), .RSTn(RSTn)); gen_dffren # (.DW(4)) arid_dffren (.dnxt(MEM_ARID), .qout(MEM_RID), .en(MEM_ARVALID & MEM_ARREADY), .CLK(CLK), .RSTn(RSTn)); wire [31:0] aw_wrap_size; wire [31:0] ar_wrap_size; wire aw_wrap_en, ar_wrap_en; wire axi_awready_set, axi_awready_rst, axi_awready_qout; wire axi_awv_awr_flag_set, axi_awv_awr_flag_rst, axi_awv_awr_flag_qout; wire [31:0] axi_awaddr_dnxta; wire [31:0] axi_awaddr_dnxtb; wire [31:0] axi_awaddr_qout; wire axi_awaddr_ena, axi_awaddr_enb; wire axi_awburst_en; wire [1:0] axi_awburst_dnxt; wire [1:0] axi_awburst_qout; wire axi_awlen_en; wire [7:0] axi_awlen_dnxt; wire [7:0] axi_awlen_qout; wire [7:0] axi_awlen_cnt_dnxta; wire [7:0] axi_awlen_cnt_dnxtb; wire [7:0] axi_awlen_cnt_qout; wire axi_awlen_cnt_ena, axi_awlen_cnt_enb; wire axi_wready_set, axi_wready_rst, axi_wready_qout; wire axi_bvalid_set, axi_bvalid_rst, axi_bvalid_qout; wire axi_arready_set, axi_arready_rst, axi_arready_qout; wire axi_arv_arr_flag_set, axi_arv_arr_flag_rst, axi_arv_arr_flag_qout; wire [31:0] axi_araddr_dnxta; wire [31:0] axi_araddr_dnxtb; wire [31:0] axi_araddr_qout; wire axi_araddr_ena, axi_araddr_enb, axi_arburst_en; wire [1:0] axi_arburst_dnxt; wire [1:0] axi_arburst_qout; wire axi_arlen_en; wire [7:0] axi_arlen_dnxt; wire [7:0] axi_arlen_qout; wire [7:0] axi_arlen_cnt_dnxta; wire [7:0] axi_arlen_cnt_dnxtb; wire [7:0] axi_arlen_cnt_qout; wire axi_arlen_cnt_ena, axi_arlen_cnt_enb; wire axi_rvalid_set, axi_rvalid_rst, axi_rvalid_qout; wire axi_rlast_set, axi_rlast_rst, axi_rlast_qout; assign MEM_AWREADY = axi_awready_qout; assign MEM_WREADY = axi_wready_qout; assign MEM_BRESP = 2'b00; assign MEM_BVALID = axi_bvalid_qout; assign MEM_ARREADY = axi_arready_qout; assign MEM_RRESP = 2'b00; assign MEM_RLAST = axi_rlast_qout; assign MEM_RVALID = axi_rvalid_qout; assign axi_awready_set = (~axi_awready_qout & MEM_AWVALID & ~axi_awv_awr_flag_qout & ~axi_arv_arr_flag_qout); assign axi_awready_rst = ~(~axi_awready_qout & MEM_AWVALID & ~axi_awv_awr_flag_qout & ~axi_arv_arr_flag_qout) & ~(MEM_WLAST & axi_wready_qout); gen_rsffr axi_awready_rsffr (.set_in(axi_awready_set), .rst_in(axi_awready_rst), .qout(axi_awready_qout), .CLK(CLK), .RSTn(RSTn)); assign axi_awv_awr_flag_set = (~axi_awready_qout & MEM_AWVALID & ~axi_awv_awr_flag_qout & ~axi_arv_arr_flag_qout); assign axi_awv_awr_flag_rst = ( axi_awready_qout | ~MEM_AWVALID | axi_awv_awr_flag_qout | axi_arv_arr_flag_qout) & (MEM_WLAST & axi_wready_qout); gen_rsffr axi_awv_awr_flag_rsffr (.set_in(axi_awv_awr_flag_set), .rst_in(axi_awv_awr_flag_rst), .qout(axi_awv_awr_flag_qout), .CLK(CLK), .RSTn(RSTn)); assign axi_awaddr_dnxta = MEM_AWADDR; assign axi_awaddr_dnxtb = ( {32{axi_awburst_qout == 2'b00}} & axi_awaddr_qout ) | ( {32{axi_awburst_qout == 2'b01}} & axi_awaddr_qout + (1<