| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| // |
| // Dual-Port SRAM Wrapper |
| // |
| // Supported configurations: |
| // - ECC for 32b and 64b wide memories with no write mask |
| // (Width == 32 or Width == 64, DataBitsPerMask is ignored). |
| // - Byte parity if Width is a multiple of 8 bit and write masks have Byte |
| // granularity (DataBitsPerMask == 8). |
| // |
| // Note that the write mask needs to be per Byte if parity is enabled. If ECC is enabled, the write |
| // mask cannot be used and has to be tied to {Width{1'b1}}. |
| |
| `include "prim_assert.sv" |
| |
| module prim_ram_2p_adv import prim_ram_2p_pkg::*; #( |
| parameter int Depth = 512, |
| parameter int Width = 32, |
| parameter int DataBitsPerMask = 1, // Number of data bits per bit of write mask |
| parameter MemInitFile = "", // VMEM file to initialize the memory with |
| |
| // Configurations |
| parameter bit EnableECC = 0, // Enables per-word ECC |
| parameter bit EnableParity = 0, // Enables per-Byte Parity |
| parameter bit EnableInputPipeline = 0, // Adds an input register (read latency +1) |
| parameter bit EnableOutputPipeline = 0, // Adds an output register (read latency +1) |
| |
| // This switch allows to switch to standard Hamming ECC instead of the HSIAO ECC. |
| // It is recommended to leave this parameter at its default setting (HSIAO), |
| // since this results in a more compact and faster implementation. |
| parameter bit HammingECC = 0, |
| |
| localparam int Aw = prim_util_pkg::vbits(Depth) |
| ) ( |
| input clk_i, |
| input rst_ni, |
| |
| input a_req_i, |
| input a_write_i, |
| input [Aw-1:0] a_addr_i, |
| input [Width-1:0] a_wdata_i, |
| input [Width-1:0] a_wmask_i, // cannot be used with ECC, tie to 1 in that case |
| output logic [Width-1:0] a_rdata_o, |
| output logic a_rvalid_o, // read response (a_rdata_o) is valid |
| output logic [1:0] a_rerror_o, // Bit1: Uncorrectable, Bit0: Correctable |
| |
| input b_req_i, |
| input b_write_i, |
| input [Aw-1:0] b_addr_i, |
| input [Width-1:0] b_wdata_i, |
| input [Width-1:0] b_wmask_i, // cannot be used with ECC, tie to 1 in that case |
| output logic [Width-1:0] b_rdata_o, |
| output logic b_rvalid_o, // read response (b_rdata_o) is valid |
| output logic [1:0] b_rerror_o, // Bit1: Uncorrectable, Bit0: Correctable |
| |
| input ram_2p_cfg_t cfg_i |
| ); |
| |
| prim_ram_2p_async_adv #( |
| .Depth (Depth), |
| .Width (Width), |
| .DataBitsPerMask (DataBitsPerMask), |
| .MemInitFile (MemInitFile), |
| .EnableECC (EnableECC), |
| .EnableParity (EnableParity), |
| .EnableInputPipeline (EnableInputPipeline), |
| .EnableOutputPipeline(EnableOutputPipeline), |
| .HammingECC (HammingECC) |
| ) i_prim_ram_2p_async_adv ( |
| .clk_a_i(clk_i), |
| .rst_a_ni(rst_ni), |
| .clk_b_i(clk_i), |
| .rst_b_ni(rst_ni), |
| .a_req_i, |
| .a_write_i, |
| .a_addr_i, |
| .a_wdata_i, |
| .a_wmask_i, |
| .a_rdata_o, |
| .a_rvalid_o, |
| .a_rerror_o, |
| .b_req_i, |
| .b_write_i, |
| .b_addr_i, |
| .b_wdata_i, |
| .b_wmask_i, |
| .b_rdata_o, |
| .b_rvalid_o, |
| .b_rerror_o, |
| .cfg_i |
| ); |
| |
| endmodule : prim_ram_2p_adv |