blob: 866217a64bbc9cb1bd717c2e666230b3b7595b99 [file] [log] [blame]
// 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