| `default_nettype none | |
| `ifndef USE_CUSTOM_DFFRAM | |
| module DFFRAM( | |
| `ifdef USE_POWER_PINS | |
| input VPWR, | |
| input VGND, | |
| `endif | |
| input CLK, | |
| input [3:0] WE, | |
| input EN, | |
| input [31:0] Di, | |
| output reg [31:0] Do, | |
| input [7:0] A | |
| ); | |
| reg [31:0] mem [0:`MEM_WORDS-1]; | |
| always @(posedge CLK) begin | |
| if (EN == 1'b1) begin | |
| Do <= mem[A]; | |
| if (WE[0]) mem[A][ 7: 0] <= Di[ 7: 0]; | |
| if (WE[1]) mem[A][15: 8] <= Di[15: 8]; | |
| if (WE[2]) mem[A][23:16] <= Di[23:16]; | |
| if (WE[3]) mem[A][31:24] <= Di[31:24]; | |
| end | |
| end | |
| endmodule | |
| `else | |
| module DFFRAM #( parameter COLS=1) | |
| ( | |
| `ifdef USE_POWER_PINS | |
| VPWR, | |
| VGND, | |
| `endif | |
| CLK, | |
| WE, | |
| EN, | |
| Di, | |
| Do, | |
| A | |
| ); | |
| input CLK; | |
| input [3:0] WE; | |
| input EN; | |
| input [31:0] Di; | |
| output [31:0] Do; | |
| input [7+$clog2(COLS):0] A; | |
| `ifdef USE_POWER_PINS | |
| input VPWR; | |
| input VGND; | |
| `endif | |
| wire [31:0] DOUT [COLS-1:0]; | |
| wire [31:0] Do_pre; | |
| wire [COLS-1:0] EN_lines; | |
| generate | |
| genvar i; | |
| for (i=0; i<COLS; i=i+1) begin : COLUMN | |
| DFFRAM_COL4 RAMCOLS ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .CLK(CLK), | |
| .WE(WE), | |
| .EN(EN_lines[i]), | |
| .Di(Di), | |
| .Do(DOUT[i]), | |
| .A(A[7:0]) | |
| ); | |
| end | |
| if(COLS==4) begin | |
| MUX4x1_32 MUX ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .A0(DOUT[0]), | |
| .A1(DOUT[1]), | |
| .A2(DOUT[2]), | |
| .A3(DOUT[3]), | |
| .S(A[9:8]), | |
| .X(Do_pre) | |
| ); | |
| DEC2x4 DEC ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .EN(EN), | |
| .A(A[9:8]), | |
| .SEL(EN_lines) | |
| ); | |
| end | |
| else if(COLS==2) begin | |
| MUX2x1_32 MUX ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .A0(DOUT[0]), | |
| .A1(DOUT[1]), | |
| .S(A[8]), | |
| .X(Do_pre) | |
| ); | |
| //sky130_fd_sc_hd__inv_4 DEC0 ( .Y(EN_lines[0]), .A(A[8]) ); | |
| //sky130_fd_sc_hd__clkbuf_4 DEC1 (.X(EN_lines[1]), .A(A[8]) ); | |
| DEC1x2 DEC ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .EN(EN), | |
| .A(A[8]), | |
| .SEL(EN_lines[1:0]) | |
| ); | |
| end | |
| else begin | |
| PASS MUX ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| `endif | |
| .A(DOUT[0]), | |
| .X(Do_pre) | |
| ); | |
| sky130_fd_sc_hd__clkbuf_4 ENBUF ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| .VPB(VPWR), | |
| .VNB(VGND), | |
| `endif | |
| .X(EN_lines[0]), | |
| .A(EN) | |
| ); | |
| end | |
| endgenerate | |
| sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] ( | |
| `ifdef USE_POWER_PINS | |
| .VPWR(VPWR), | |
| .VGND(VGND), | |
| .VPB(VPWR), | |
| .VNB(VGND), | |
| `endif | |
| .X(Do), | |
| .A(Do_pre) | |
| ); | |
| endmodule | |
| `endif |