/// Copyright by Syntacore LLC © 2016-2020. See LICENSE for details /// @file /// @brief Memory AXI bridge /// `include "scr1_memif.svh" `include "scr1_arch_description.svh" module scr1_mem_axi #( parameter SCR1_REQ_BUF_SIZE = 2, // Power of 2 value parameter SCR1_AXI_IDWIDTH = 4, parameter SCR1_ADDR_WIDTH = 32, parameter SCR1_AXI_REQ_BP = 1, parameter SCR1_AXI_RESP_BP = 1 ) ( // Clock and Reset input logic clk, input logic rst_n, input logic axi_reinit, // Core Interface output logic core_idle, output logic core_req_ack, input logic core_req, input type_scr1_mem_cmd_e core_cmd, input type_scr1_mem_width_e core_width, input logic [SCR1_ADDR_WIDTH-1:0] core_addr, input logic [31:0] core_wdata, output logic [31:0] core_rdata, output type_scr1_mem_resp_e core_resp, // AXI output logic [SCR1_AXI_IDWIDTH-1:0] awid, output logic [SCR1_ADDR_WIDTH-1:0] awaddr, output logic [ 7:0] awlen, output logic [ 2:0] awsize, output logic [ 1:0] awburst, output logic awlock, output logic [ 3:0] awcache, output logic [ 2:0] awprot, output logic [ 3:0] awregion, output logic [ 3:0] awuser, output logic [ 3:0] awqos, output logic awvalid, input logic awready, output logic [31:0] wdata, output logic [3:0] wstrb, output logic wlast, output logic [3:0] wuser, output logic wvalid, input logic wready, input logic [SCR1_AXI_IDWIDTH-1:0] bid, input logic [ 1:0] bresp, input logic bvalid, input logic [ 3:0] buser, output logic bready, output logic [SCR1_AXI_IDWIDTH-1:0] arid, output logic [SCR1_ADDR_WIDTH-1:0] araddr, output logic [ 7:0] arlen, output logic [ 2:0] arsize, output logic [ 1:0] arburst, output logic arlock, output logic [ 3:0] arcache, output logic [ 2:0] arprot, output logic [ 3:0] arregion, output logic [ 3:0] aruser, output logic [ 3:0] arqos, output logic arvalid, input logic arready, input logic [SCR1_AXI_IDWIDTH-1:0] rid, input logic [31:0] rdata, input logic [ 1:0] rresp, input logic rlast, input logic [ 3:0] ruser, input logic rvalid, output logic rready ); // Local functions function automatic logic [2:0] width2axsize ( input type_scr1_mem_width_e width ); logic [2:0] axsize; begin case (width) SCR1_MEM_WIDTH_BYTE : axsize = 3'b000; SCR1_MEM_WIDTH_HWORD: axsize = 3'b001; SCR1_MEM_WIDTH_WORD : axsize = 3'b010; default: axsize = 'x; endcase return axsize; end endfunction: width2axsize typedef struct packed { type_scr1_mem_width_e axi_width; logic [SCR1_ADDR_WIDTH-1:0] axi_addr; logic [31:0] axi_wdata; } type_scr1_request_s; typedef struct packed { logic req_write; logic req_addr; logic req_data; logic req_resp; } type_scr1_req_status_s; type_scr1_request_s [SCR1_REQ_BUF_SIZE-1:0] req_fifo; type_scr1_req_status_s [SCR1_REQ_BUF_SIZE-1:0] req_status; type_scr1_req_status_s [SCR1_REQ_BUF_SIZE-1:0] req_status_new; logic [SCR1_REQ_BUF_SIZE-1:0] req_status_en; logic [$clog2(SCR1_REQ_BUF_SIZE)-1:0] req_aval_ptr; logic [$clog2(SCR1_REQ_BUF_SIZE)-1:0] req_proc_ptr; logic [$clog2(SCR1_REQ_BUF_SIZE)-1:0] req_done_ptr; logic rresp_err; logic [31:0] rcvd_rdata; type_scr1_mem_resp_e rcvd_resp; logic force_read; logic force_write; assign core_req_ack = ~axi_reinit & ~req_status[req_aval_ptr].req_resp & core_resp!=SCR1_MEM_RESP_RDY_ER; assign rready = ~req_status[req_done_ptr].req_write; assign bready = req_status[req_done_ptr].req_write; assign force_read = bit'(SCR1_AXI_REQ_BP) & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_RD; assign force_write = bit'(SCR1_AXI_REQ_BP) & core_req & core_req_ack & req_aval_ptr==req_proc_ptr & core_cmd==SCR1_MEM_CMD_WR; always_comb begin: idle_status core_idle = 1'b1; for (int unsigned i=0; i