blob: ae8ccc26578be8aa861086c453d984f25d6e8ff9 [file] [log] [blame]
Sylvain Munaut21b03ba2020-09-14 10:01:45 +02001/*
2 * soc_bram.v
3 *
4 * vim: ts=4 sw=4
5 *
6 * Copyright (C) 2020 Sylvain Munaut <tnt@246tNt.com>
7 * SPDX-License-Identifier: CERN-OHL-P-2.0
8 */
9
10`default_nettype none
11
12module soc_bram #(
13 parameter integer AW = 8,
14 parameter INIT_FILE = ""
15)(
16 input wire [AW-1:0] addr,
17 output reg [31:0] rdata,
18 input wire [31:0] wdata,
19 input wire [ 3:0] wmsk,
20 input wire we,
21 input wire clk
22);
23
Sylvain Munautc7566442022-10-04 21:34:56 +020024 (* no_rw_check *)
Sylvain Munaut21b03ba2020-09-14 10:01:45 +020025 reg [31:0] mem [0:(1<<AW)-1];
26
27 initial
28 if (INIT_FILE != "")
29 $readmemh(INIT_FILE, mem);
30
31 always @(posedge clk) begin
32 rdata <= mem[addr];
33 if (we & ~wmsk[0]) mem[addr][ 7: 0] <= wdata[ 7: 0];
34 if (we & ~wmsk[1]) mem[addr][15: 8] <= wdata[15: 8];
35 if (we & ~wmsk[2]) mem[addr][23:16] <= wdata[23:16];
36 if (we & ~wmsk[3]) mem[addr][31:24] <= wdata[31:24];
37 end
38
39endmodule // soc_bram