| `default_nettype none | |
| module mem_wb ( | |
| `ifdef USE_POWER_PINS | |
| input VPWR, | |
| input VGND, | |
| `endif | |
| input wb_clk_i, | |
| input wb_rst_i, | |
| input [31:0] wb_adr_i, | |
| input [31:0] wb_dat_i, | |
| input [3:0] wb_sel_i, | |
| input wb_we_i, | |
| input wb_cyc_i, | |
| input wb_stb_i, | |
| output wb_ack_o, | |
| output [31:0] wb_dat_o | |
| ); | |
| localparam ADR_WIDTH = $clog2(`MEM_WORDS); | |
| wire valid; | |
| wire ram_wen; | |
| wire [3:0] wen; // write enable | |
| assign valid = wb_cyc_i & wb_stb_i; | |
| assign ram_wen = wb_we_i && valid; | |
| assign wen = wb_sel_i & {4{ram_wen}} ; | |
| /* | |
| Ack Generation | |
| - write transaction: asserted upon receiving adr_i & dat_i | |
| - read transaction : asserted one clock cycle after receiving the adr_i & dat_i | |
| */ | |
| reg wb_ack_read; | |
| reg wb_ack_o; | |
| always @(posedge wb_clk_i) begin | |
| if (wb_rst_i == 1'b 1) begin | |
| wb_ack_read <= 1'b0; | |
| wb_ack_o <= 1'b0; | |
| end else begin | |
| // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]}; | |
| wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read; | |
| wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read; | |
| end | |
| end | |
| soc_mem | |
| `ifndef USE_OPENRAM | |
| #( | |
| .WORDS(`MEM_WORDS), | |
| .ADR_WIDTH(ADR_WIDTH) | |
| ) | |
| `endif | |
| mem ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .clk(wb_clk_i), | |
| .ena(valid), | |
| .wen(wen), | |
| .addr(wb_adr_i[ADR_WIDTH+1:2]), | |
| .wdata(wb_dat_i), | |
| .rdata(wb_dat_o) | |
| ); | |
| endmodule | |
| module soc_mem | |
| `ifndef USE_OPENRAM | |
| #( | |
| parameter integer WORDS = 256, | |
| parameter ADR_WIDTH = 8 | |
| ) | |
| `endif | |
| ( | |
| `ifdef USE_POWER_PINS | |
| input VPWR, | |
| input VGND, | |
| `endif | |
| input clk, | |
| input ena, | |
| input [3:0] wen, | |
| input [ADR_WIDTH-1:0] addr, | |
| input [31:0] wdata, | |
| output[31:0] rdata | |
| ); | |
| `ifndef USE_OPENRAM | |
| DFFRAM #(.COLS(`COLS)) SRAM ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .CLK(clk), | |
| .WE(wen), | |
| .EN(ena), | |
| .Di(wdata), | |
| .Do(rdata), | |
| // 8-bit address if using the default custom DFF RAM | |
| .A(addr) | |
| ); | |
| `else | |
| /* Using Port 0 Only - Size: 1KB, 256x32 bits */ | |
| //sram_1rw1r_32_256_8_scn4m_subm | |
| sram_1rw1r_32_256_8_sky130 SRAM( | |
| .clk0(clk), | |
| .csb0(~ena), | |
| .web0(~|wen), | |
| .wmask0(wen), | |
| .addr0(addr[7:0]), | |
| .din0(wdata), | |
| .dout0(rdata) | |
| ); | |
| `endif | |
| endmodule |