blob: 4f6891e6ec6294660031047b2e44ad2a914b2101 [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);
Manar6bedda92020-11-02 20:29:07 +020016
17 localparam ADR_WIDTH = $clog2(`MEM_WORDS);
18
shalanfd13eb52020-08-21 16:48:07 +020019 wire valid;
20 wire ram_wen;
21 wire [3:0] wen; // write enable
22
23 assign valid = wb_cyc_i & wb_stb_i;
24 assign ram_wen = wb_we_i && valid;
25
26 assign wen = wb_sel_i & {4{ram_wen}} ;
27
shalanfd13eb52020-08-21 16:48:07 +020028 /*
29 Ack Generation
30 - write transaction: asserted upon receiving adr_i & dat_i
31 - read transaction : asserted one clock cycle after receiving the adr_i & dat_i
32 */
33
shalan0d14e6e2020-08-31 16:50:48 +020034 reg wb_ack_read;
35 reg wb_ack_o;
shalanfd13eb52020-08-21 16:48:07 +020036
37 always @(posedge wb_clk_i) begin
38 if (wb_rst_i == 1'b 1) begin
shalan0d14e6e2020-08-31 16:50:48 +020039 wb_ack_read <= 1'b0;
40 wb_ack_o <= 1'b0;
shalanfd13eb52020-08-21 16:48:07 +020041 end else begin
shalan0d14e6e2020-08-31 16:50:48 +020042 // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]};
43 wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
44 wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
shalanfd13eb52020-08-21 16:48:07 +020045 end
46 end
47
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020048 soc_mem
49`ifndef USE_OPENRAM
Manar6bedda92020-11-02 20:29:07 +020050 #(
51 .WORDS(`MEM_WORDS),
52 .ADR_WIDTH(ADR_WIDTH)
53 )
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020054`endif
55 mem (
shalanfd13eb52020-08-21 16:48:07 +020056 .clk(wb_clk_i),
57 .ena(valid),
58 .wen(wen),
Manar6bedda92020-11-02 20:29:07 +020059 .addr(wb_adr_i[ADR_WIDTH+1:2]),
shalanfd13eb52020-08-21 16:48:07 +020060 .wdata(wb_dat_i),
61 .rdata(wb_dat_o)
62 );
63
64endmodule
65
66module soc_mem
67`ifndef USE_OPENRAM
68#(
Manar6bedda92020-11-02 20:29:07 +020069 parameter integer WORDS = 256,
70 parameter ADR_WIDTH = 8
shalanfd13eb52020-08-21 16:48:07 +020071)
72`endif
73 (
74 input clk,
75 input ena,
76 input [3:0] wen,
Manar6bedda92020-11-02 20:29:07 +020077 input [ADR_WIDTH-1:0] addr,
shalanfd13eb52020-08-21 16:48:07 +020078 input [31:0] wdata,
79 output[31:0] rdata
80);
81
82`ifndef USE_OPENRAM
Ahmed Ghazy5586f1b2020-11-06 21:34:43 +020083 DFFRAM SRAM (
84 .CLK(clk),
85 .WE(wen),
86 .EN(ena),
87 .Di(wdata),
88 .Do(rdata),
89 // 8-bit address if using the default custom DFF RAM
90 .A(addr)
91 );
shalanfd13eb52020-08-21 16:48:07 +020092`else
93
94 /* Using Port 0 Only - Size: 1KB, 256x32 bits */
95 //sram_1rw1r_32_256_8_scn4m_subm
Manar14d35ac2020-10-21 22:47:15 +020096 sram_1rw1r_32_256_8_sky130 SRAM(
shalanfd13eb52020-08-21 16:48:07 +020097 .clk0(clk),
98 .csb0(~ena),
99 .web0(~|wen),
100 .wmask0(wen),
Manar14d35ac2020-10-21 22:47:15 +0200101 .addr0(addr[7:0]),
shalanfd13eb52020-08-21 16:48:07 +0200102 .din0(wdata),
103 .dout0(rdata)
104 );
105
106`endif
107
Ahmed Ghazy5586f1b2020-11-06 21:34:43 +0200108endmodule