// SPDX-License-Identifier: CERN-OHL-S-2.0 // A basic valid-ready ram, default 32KiB `default_nettype none `timescale 1ps/1ps // The core initiates a transfer by asserting valid, which stays high until the // peer asserts ready. All core outputs are stable over the valid period. module mem ( input logic clk_i, input soc_pkg::mem_in_t core_i, output soc_pkg::mem_out_t core_o ); logic [63:0] memory [0:soc_pkg::MEM_WORDS-1]; always_ff @(posedge clk_i) begin core_o.ready <= '0; if (core_i.valid) begin MemAddrFitsIntoPhys: assert(core_i.addr < (8*soc_pkg::MEM_WORDS)); core_o.rdata <= memory[core_i.addr]; core_o.ready <= 1'b1; if (core_i.wen[0]) memory[core_i.addr][ 7: 0] <= core_i.wdata[ 7: 0]; if (core_i.wen[1]) memory[core_i.addr][15: 8] <= core_i.wdata[15: 8]; if (core_i.wen[2]) memory[core_i.addr][23:16] <= core_i.wdata[23:16]; if (core_i.wen[3]) memory[core_i.addr][31:24] <= core_i.wdata[31:24]; end end `ifndef SYNTHESIS logic [200:0] mem_file; initial begin if ($value$plusargs("mem", mem_file)) begin $display("[%0t] Initializing memory\n", $time); $readmemh(mem_file, memory); end end `endif endmodule