blob: bacf52ca0ef644f2d0803b2b6554b88a16420290 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001module mem_wb # (
2 parameter integer MEM_WORDS = 256
3) (
4 input wb_clk_i,
5 input wb_rst_i,
6
7 input [31:0] wb_adr_i,
8 input [31:0] wb_dat_i,
9 input [3:0] wb_sel_i,
10 input wb_we_i,
11 input wb_cyc_i,
12 input wb_stb_i,
13
14 output wb_ack_o,
15 output [31:0] wb_dat_o
16
17);
18 wire valid;
19 wire ram_wen;
20 wire [3:0] wen; // write enable
21
22 assign valid = wb_cyc_i & wb_stb_i;
23 assign ram_wen = wb_we_i && valid;
24
25 assign wen = wb_sel_i & {4{ram_wen}} ;
26
27`ifndef USE_OPENRAM
28 assign wb_ack_o = valid;
29`else
30
31 /*
32 Ack Generation
33 - write transaction: asserted upon receiving adr_i & dat_i
34 - read transaction : asserted one clock cycle after receiving the adr_i & dat_i
35 */
36
shalan0d14e6e2020-08-31 16:50:48 +020037 reg wb_ack_read;
38 reg wb_ack_o;
shalanfd13eb52020-08-21 16:48:07 +020039
40 always @(posedge wb_clk_i) begin
41 if (wb_rst_i == 1'b 1) begin
shalan0d14e6e2020-08-31 16:50:48 +020042 wb_ack_read <= 1'b0;
43 wb_ack_o <= 1'b0;
shalanfd13eb52020-08-21 16:48:07 +020044 end else begin
shalan0d14e6e2020-08-31 16:50:48 +020045 // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]};
46 wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
47 wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
shalanfd13eb52020-08-21 16:48:07 +020048 end
49 end
50
51`endif
52
53 soc_mem mem(
54 .clk(wb_clk_i),
55 .ena(valid),
56 .wen(wen),
57 .addr(wb_adr_i[23:2]),
58 .wdata(wb_dat_i),
59 .rdata(wb_dat_o)
60 );
61
62endmodule
63
64module soc_mem
65`ifndef USE_OPENRAM
66#(
shalan0d14e6e2020-08-31 16:50:48 +020067 parameter integer WORDS = 8192
shalanfd13eb52020-08-21 16:48:07 +020068)
69`endif
70 (
71 input clk,
72 input ena,
73 input [3:0] wen,
74 input [21:0] addr,
75 input [31:0] wdata,
76 output[31:0] rdata
77);
78
79`ifndef USE_OPENRAM
80 reg [31:0] rdata;
81 reg [31:0] mem [0:WORDS-1];
82
83 always @(posedge clk) begin
84 if (ena == 1'b1) begin
85 rdata <= mem[addr];
86 if (wen[0]) mem[addr][ 7: 0] <= wdata[ 7: 0];
87 if (wen[1]) mem[addr][15: 8] <= wdata[15: 8];
88 if (wen[2]) mem[addr][23:16] <= wdata[23:16];
89 if (wen[3]) mem[addr][31:24] <= wdata[31:24];
90 end
91 end
92`else
93
94 /* Using Port 0 Only - Size: 1KB, 256x32 bits */
95 //sram_1rw1r_32_256_8_scn4m_subm
shalan0d14e6e2020-08-31 16:50:48 +020096 sram_1rw1r_32_8192_8_sky130 SRAM(
shalanfd13eb52020-08-21 16:48:07 +020097 .clk0(clk),
98 .csb0(~ena),
99 .web0(~|wen),
100 .wmask0(wen),
shalan0d14e6e2020-08-31 16:50:48 +0200101 .addr0(addr[12:0]),
shalanfd13eb52020-08-21 16:48:07 +0200102 .din0(wdata),
103 .dout0(rdata)
104 );
105
106`endif
107
108endmodule