2 module \$mem (RD_CLK, RD_EN, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
8 parameter signed INIT = 1'bx;
10 parameter RD_PORTS = 1;
11 parameter RD_CLK_ENABLE = 1'b1;
12 parameter RD_CLK_POLARITY = 1'b1;
13 parameter RD_TRANSPARENT = 1'b1;
15 parameter WR_PORTS = 1;
16 parameter WR_CLK_ENABLE = 1'b1;
17 parameter WR_CLK_POLARITY = 1'b1;
19 input [RD_PORTS-1:0] RD_CLK;
20 input [RD_PORTS-1:0] RD_EN;
21 input [RD_PORTS*ABITS-1:0] RD_ADDR;
22 output reg [RD_PORTS*WIDTH-1:0] RD_DATA;
24 input [WR_PORTS-1:0] WR_CLK;
25 input [WR_PORTS*WIDTH-1:0] WR_EN;
26 input [WR_PORTS*ABITS-1:0] WR_ADDR;
27 input [WR_PORTS*WIDTH-1:0] WR_DATA;
29 wire [1023:0] _TECHMAP_DO_ = "proc; clean";
31 parameter _TECHMAP_CONNMAP_RD_CLK_ = 0;
32 parameter _TECHMAP_CONNMAP_WR_CLK_ = 0;
34 parameter _TECHMAP_CONSTVAL_RD_EN_ = 0;
36 parameter _TECHMAP_BITS_CONNMAP_ = 0;
37 parameter _TECHMAP_CONNMAP_WR_EN_ = 0;
44 // no initialized memories
48 // only map cells with only one read and one write port
49 if (RD_PORTS > 1 || WR_PORTS > 1)
52 // read enable must be constant high
53 if (_TECHMAP_CONSTVAL_RD_EN_[0] !== 1'b1)
56 // we expect positive read clock and non-transparent reads
57 if (RD_TRANSPARENT || !RD_CLK_ENABLE || !RD_CLK_POLARITY)
60 // we expect positive write clock
61 if (!WR_CLK_ENABLE || !WR_CLK_POLARITY)
64 // only one global write enable bit is supported
65 for (k = 1; k < WR_PORTS*WIDTH; k = k+1)
66 if (_TECHMAP_CONNMAP_WR_EN_[0 +: _TECHMAP_BITS_CONNMAP_] !=
67 _TECHMAP_CONNMAP_WR_EN_[k*_TECHMAP_BITS_CONNMAP_ +: _TECHMAP_BITS_CONNMAP_])
70 // read and write must be in same clock domain
71 if (_TECHMAP_CONNMAP_RD_CLK_ != _TECHMAP_CONNMAP_WR_CLK_)
74 // we don't do small memories or memories with offsets
75 if (OFFSET != 0 || ABITS < 4 || SIZE < 16)
81 for (i = 0; i < WIDTH; i=i+1) begin:slice
82 \$__mem_4x1_generator #(
97 module \$__mem_4x1_generator (CLK, RD_ADDR, RD_DATA, WR_ADDR, WR_DATA, WR_EN);
101 input CLK, WR_DATA, WR_EN;
102 input [ABITS-1:0] RD_ADDR, WR_ADDR;
105 wire [1023:0] _TECHMAP_DO_ = "proc; clean";
109 wire high_rd_data, low_rd_data;
110 if (SIZE > 2**(ABITS-1)) begin
111 \$__mem_4x1_generator #(
113 .SIZE(SIZE - 2**(ABITS-1))
116 .RD_ADDR(RD_ADDR[ABITS-2:0]),
117 .RD_DATA(high_rd_data),
118 .WR_ADDR(WR_ADDR[ABITS-2:0]),
120 .WR_EN(WR_EN && WR_ADDR[ABITS-1])
123 assign high_rd_data = 1'bx;
125 \$__mem_4x1_generator #(
127 .SIZE(SIZE > 2**(ABITS-1) ? 2**(ABITS-1) : SIZE)
130 .RD_ADDR(RD_ADDR[ABITS-2:0]),
131 .RD_DATA(low_rd_data),
132 .WR_ADDR(WR_ADDR[ABITS-2:0]),
134 .WR_EN(WR_EN && !WR_ADDR[ABITS-1])
137 always @(posedge CLK)
138 delayed_abit <= RD_ADDR[ABITS-1];
139 assign RD_DATA = delayed_abit ? high_rd_data : low_rd_data;
141 MEM4X1 _TECHMAP_REPLACE_ (