11
11
`define MAX(a,b) (a > b ? a : b)
12
12
`define MIN(a,b) (a < b ? a : b)
13
13
14
- module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
14
+ module \$mem (RD_CLK, RD_EN, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
15
15
parameter MEMID = "" ;
16
16
parameter SIZE = 256 ;
17
17
parameter OFFSET = 0 ;
18
18
parameter ABITS = 8 ;
19
19
parameter WIDTH = 8 ;
20
- parameter INIT = 0 ;
21
-
20
+ parameter signed INIT = 1'bx ;
21
+
22
22
parameter RD_PORTS = 1 ;
23
23
parameter RD_CLK_ENABLE = 1'b1 ;
24
24
parameter RD_CLK_POLARITY = 1'b1 ;
25
25
parameter RD_TRANSPARENT = 1'b1 ;
26
-
26
+
27
27
parameter WR_PORTS = 1 ;
28
28
parameter WR_CLK_ENABLE = 1'b1 ;
29
29
parameter WR_CLK_POLARITY = 1'b1 ;
30
-
30
+
31
31
input [RD_PORTS- 1 :0 ] RD_CLK;
32
+ input [RD_PORTS- 1 :0 ] RD_EN;
32
33
input [RD_PORTS* ABITS- 1 :0 ] RD_ADDR;
33
34
output reg [RD_PORTS* WIDTH- 1 :0 ] RD_DATA;
34
-
35
+
35
36
input [WR_PORTS- 1 :0 ] WR_CLK;
37
+ input [WR_PORTS* WIDTH- 1 :0 ] WR_EN;
36
38
input [WR_PORTS* ABITS- 1 :0 ] WR_ADDR;
37
- input [WR_PORTS* WIDTH- 1 :0 ] WR_DATA, WR_EN ;
38
-
39
+ input [WR_PORTS* WIDTH- 1 :0 ] WR_DATA;
40
+
39
41
wire [1023 :0 ] _TECHMAP_DO_ = "proc; clean" ;
40
42
41
43
parameter _TECHMAP_CONNMAP_RD_CLK_ = 0 ;
42
44
parameter _TECHMAP_CONNMAP_WR_CLK_ = 0 ;
45
+
43
46
parameter _TECHMAP_CONNMAP_RD_ADDR_ = 0 ;
44
47
parameter _TECHMAP_CONNMAP_WR_ADDR_ = 0 ;
48
+
45
49
parameter _TECHMAP_CONNMAP_WR_EN_ = 0 ;
50
+ parameter _TECHMAP_CONSTVAL_RD_EN_ = 0 ;
51
+
46
52
parameter _TECHMAP_BITS_CONNMAP_ = 0 ;
47
53
// parameter _TECHMAP_CONNMAP_RD_PORTS_ = 0;
48
54
// parameter _TECHMAP_CONNMAP_WR_PORTS_ = 0;
@@ -55,6 +61,10 @@ module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
55
61
if (RD_PORTS > 2 || WR_PORTS > 2 )
56
62
_TECHMAP_FAIL_ <= 1 ;
57
63
64
+ // read enable must not be constant low
65
+ if (_TECHMAP_CONSTVAL_RD_EN_[0 ] == 1'b0 )
66
+ _TECHMAP_FAIL_ <= 1 ;
67
+
58
68
// we expect positive read clock and non-transparent reads
59
69
if (RD_TRANSPARENT || ! RD_CLK_ENABLE || ! RD_CLK_POLARITY)
60
70
_TECHMAP_FAIL_ <= 1 ;
@@ -78,16 +88,18 @@ module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
78
88
initial begin
79
89
// check each pair of read and write port are the same
80
90
if (RD_PORTS >= i && WR_PORTS >= i) begin
81
- if (_TECHMAP_CONNMAP_RD_ADDR_[ABITS* _TECHMAP_BITS_CONNMAP_* (i+ 1 )- 1 :ABITS* _TECHMAP_BITS_CONNMAP_* i] != _TECHMAP_CONNMAP_WR_ADDR_[ABITS* _TECHMAP_BITS_CONNMAP_* (i+ 1 )- 1 :ABITS* _TECHMAP_BITS_CONNMAP_* i])
82
- _TECHMAP_FAIL_ <= 1 ;
91
+ if (_TECHMAP_CONNMAP_RD_ADDR_[i* ABITS* _TECHMAP_BITS_CONNMAP_ + : ABITS* _TECHMAP_BITS_CONNMAP_] !=
92
+ _TECHMAP_CONNMAP_WR_ADDR_[i* ABITS* _TECHMAP_BITS_CONNMAP_ + : ABITS* _TECHMAP_BITS_CONNMAP_])
93
+ _TECHMAP_FAIL_ <= 1 ;
83
94
end
84
95
end
85
96
// check all bits of write enable are the same
86
97
if (i < WR_PORTS) begin
87
98
genvar j;
88
99
for (j = 1 ; j < WIDTH; j = j+ 1 ) begin
89
100
initial begin
90
- if (_TECHMAP_CONNMAP_WR_EN_[(WIDTH* i+ j+ 1 )* _TECHMAP_BITS_CONNMAP_- 1 :(WIDTH* i+ j)* _TECHMAP_BITS_CONNMAP_] != _TECHMAP_CONNMAP_WR_EN_[(WIDTH* i+ 1 )* _TECHMAP_BITS_CONNMAP_- 1 :(WIDTH* i)* _TECHMAP_BITS_CONNMAP_])
101
+ if (_TECHMAP_CONNMAP_WR_EN_[0 + : _TECHMAP_BITS_CONNMAP_] !=
102
+ _TECHMAP_CONNMAP_WR_EN_[j* _TECHMAP_BITS_CONNMAP_ + : _TECHMAP_BITS_CONNMAP_])
91
103
_TECHMAP_FAIL_ <= 1 ;
92
104
end
93
105
end
@@ -101,6 +113,7 @@ module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
101
113
.WR_PORTS(WR_PORTS), .WR_CLK_ENABLE(WR_CLK_ENABLE), .WR_CLK_POLARITY(WR_CLK_POLARITY)
102
114
) _TECHMAP_REPLACE_ (
103
115
.RD_CLK(RD_CLK),
116
+ .RD_EN(RD_EN),
104
117
.RD_ADDR(RD_ADDR),
105
118
.RD_DATA(RD_DATA),
106
119
.WR_CLK(WR_CLK),
@@ -110,29 +123,32 @@ module \$mem (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
110
123
);
111
124
endmodule
112
125
113
- module \$__mem_gen (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
126
+ module \$__mem_gen (RD_CLK, RD_EN, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
114
127
parameter MEMID = "" ;
115
128
parameter SIZE = 256 ;
116
129
parameter OFFSET = 0 ;
117
130
parameter ABITS = 8 ;
118
131
parameter WIDTH = 8 ;
119
-
132
+ parameter signed INIT = 1'bx ;
133
+
120
134
parameter RD_PORTS = 1 ;
121
135
parameter RD_CLK_ENABLE = 1'b1 ;
122
136
parameter RD_CLK_POLARITY = 1'b1 ;
123
137
parameter RD_TRANSPARENT = 1'b1 ;
124
-
138
+
125
139
parameter WR_PORTS = 1 ;
126
140
parameter WR_CLK_ENABLE = 1'b1 ;
127
141
parameter WR_CLK_POLARITY = 1'b1 ;
128
-
142
+
129
143
input [RD_PORTS- 1 :0 ] RD_CLK;
144
+ input [RD_PORTS- 1 :0 ] RD_EN;
130
145
input [RD_PORTS* ABITS- 1 :0 ] RD_ADDR;
131
146
output reg [RD_PORTS* WIDTH- 1 :0 ] RD_DATA;
132
-
147
+
133
148
input [WR_PORTS- 1 :0 ] WR_CLK;
149
+ input [WR_PORTS* WIDTH- 1 :0 ] WR_EN;
134
150
input [WR_PORTS* ABITS- 1 :0 ] WR_ADDR;
135
- input [WR_PORTS* WIDTH- 1 :0 ] WR_DATA, WR_EN ;
151
+ input [WR_PORTS* WIDTH- 1 :0 ] WR_DATA;
136
152
137
153
wire [1023 :0 ] _TECHMAP_DO_ = "proc; clean" ;
138
154
@@ -158,6 +174,7 @@ module \$__mem_gen (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
158
174
.WR_PORTS(WR_PORTS), .WR_CLK_ENABLE(WR_CLK_ENABLE), .WR_CLK_POLARITY(WR_CLK_POLARITY)
159
175
) mem_hi (
160
176
.RD_CLK(RD_CLK),
177
+ .RD_EN(RD_EN),
161
178
.RD_ADDR(rd_addr_new),
162
179
.RD_DATA(rd_data_hi),
163
180
.WR_CLK(WR_CLK),
@@ -176,6 +193,7 @@ module \$__mem_gen (RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA);
176
193
.WR_PORTS(WR_PORTS), .WR_CLK_ENABLE(WR_CLK_ENABLE), .WR_CLK_POLARITY(WR_CLK_POLARITY)
177
194
) mem_lo (
178
195
.RD_CLK(RD_CLK),
196
+ .RD_EN(RD_EN),
179
197
.RD_ADDR(rd_addr_new),
180
198
.RD_DATA(rd_data_lo),
181
199
.WR_CLK(WR_CLK),
0 commit comments