blob: f9cfd62d28841a1fefe3af6984f8e1b067e9e2ba [file] [log] [blame]
Ahmed Ghazy22d29d62020-10-28 03:42:02 +02001module mem_wb (
shalanfd13eb52020-08-21 16:48:07 +02002 input wb_clk_i,
3 input wb_rst_i,
4
5 input [31:0] wb_adr_i,
6 input [31:0] wb_dat_i,
7 input [3:0] wb_sel_i,
8 input wb_we_i,
9 input wb_cyc_i,
10 input wb_stb_i,
11
12 output wb_ack_o,
13 output [31:0] wb_dat_o
14
15);
16 wire valid;
17 wire ram_wen;
18 wire [3:0] wen; // write enable
19
20 assign valid = wb_cyc_i & wb_stb_i;
21 assign ram_wen = wb_we_i && valid;
22
23 assign wen = wb_sel_i & {4{ram_wen}} ;
24
25`ifndef USE_OPENRAM
26 assign wb_ack_o = valid;
27`else
28
29 /*
30 Ack Generation
31 - write transaction: asserted upon receiving adr_i & dat_i
32 - read transaction : asserted one clock cycle after receiving the adr_i & dat_i
33 */
34
shalan0d14e6e2020-08-31 16:50:48 +020035 reg wb_ack_read;
36 reg wb_ack_o;
shalanfd13eb52020-08-21 16:48:07 +020037
38 always @(posedge wb_clk_i) begin
39 if (wb_rst_i == 1'b 1) begin
shalan0d14e6e2020-08-31 16:50:48 +020040 wb_ack_read <= 1'b0;
41 wb_ack_o <= 1'b0;
shalanfd13eb52020-08-21 16:48:07 +020042 end else begin
shalan0d14e6e2020-08-31 16:50:48 +020043 // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]};
44 wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
45 wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
shalanfd13eb52020-08-21 16:48:07 +020046 end
47 end
48
49`endif
50
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020051 soc_mem
52`ifndef USE_OPENRAM
53 #(.WORDS(`MEM_WORDS))
54`endif
55 mem (
shalanfd13eb52020-08-21 16:48:07 +020056 .clk(wb_clk_i),
57 .ena(valid),
58 .wen(wen),
59 .addr(wb_adr_i[23:2]),
60 .wdata(wb_dat_i),
61 .rdata(wb_dat_o)
62 );
63
64endmodule
65
66module soc_mem
67`ifndef USE_OPENRAM
68#(
shalan0d14e6e2020-08-31 16:50:48 +020069 parameter integer WORDS = 8192
shalanfd13eb52020-08-21 16:48:07 +020070)
71`endif
72 (
73 input clk,
74 input ena,
75 input [3:0] wen,
76 input [21:0] addr,
77 input [31:0] wdata,
78 output[31:0] rdata
79);
80
81`ifndef USE_OPENRAM
82 reg [31:0] rdata;
83 reg [31:0] mem [0:WORDS-1];
84
85 always @(posedge clk) begin
86 if (ena == 1'b1) begin
87 rdata <= mem[addr];
88 if (wen[0]) mem[addr][ 7: 0] <= wdata[ 7: 0];
89 if (wen[1]) mem[addr][15: 8] <= wdata[15: 8];
90 if (wen[2]) mem[addr][23:16] <= wdata[23:16];
91 if (wen[3]) mem[addr][31:24] <= wdata[31:24];
92 end
93 end
94`else
95
96 /* Using Port 0 Only - Size: 1KB, 256x32 bits */
97 //sram_1rw1r_32_256_8_scn4m_subm
Manar14d35ac2020-10-21 22:47:15 +020098 sram_1rw1r_32_256_8_sky130 SRAM(
shalanfd13eb52020-08-21 16:48:07 +020099 .clk0(clk),
100 .csb0(~ena),
101 .web0(~|wen),
102 .wmask0(wen),
Manar14d35ac2020-10-21 22:47:15 +0200103 .addr0(addr[7:0]),
shalanfd13eb52020-08-21 16:48:07 +0200104 .din0(wdata),
105 .dout0(rdata)
106 );
107
108`endif
109
110endmodule