yowasp-yosys 0.35.0.0.post605__py3-none-any.whl → 0.36.0.8.post623.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. yowasp_yosys/share/cmp2softlogic.v +117 -0
  2. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi.cc} +3 -3
  3. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi_vcd.cc} +3 -3
  4. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.h → runtime/cxxrtl/capi/cxxrtl_capi_vcd.h} +3 -3
  5. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl.h → runtime/cxxrtl/cxxrtl.h} +2 -1
  6. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd.h → runtime/cxxrtl/cxxrtl_vcd.h} +1 -1
  7. yowasp_yosys/share/include/kernel/rtlil.h +3 -0
  8. yowasp_yosys/share/nexus/brams_map.v +6 -6
  9. yowasp_yosys/share/python3/ywio.py +8 -2
  10. yowasp_yosys/share/quicklogic/{pp3_cells_sim.v → pp3/cells_sim.v} +77 -0
  11. yowasp_yosys/share/quicklogic/qlf_k6n10f/TDP18K_FIFO.v +344 -0
  12. yowasp_yosys/share/quicklogic/qlf_k6n10f/arith_map.v +99 -0
  13. yowasp_yosys/share/quicklogic/qlf_k6n10f/bram_types_sim.v +74035 -0
  14. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_map.v +4288 -0
  15. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_sim.v +10949 -0
  16. yowasp_yosys/share/quicklogic/qlf_k6n10f/cells_sim.v +375 -0
  17. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_final_map.v +265 -0
  18. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_map.v +102 -0
  19. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_sim.v +4527 -0
  20. yowasp_yosys/share/quicklogic/qlf_k6n10f/ffs_map.v +133 -0
  21. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams.txt +22 -0
  22. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams_map.v +483 -0
  23. yowasp_yosys/share/quicklogic/qlf_k6n10f/sram1024x18_mem.v +64 -0
  24. yowasp_yosys/share/quicklogic/qlf_k6n10f/ufifo_ctl.v +620 -0
  25. yowasp_yosys/smtbmc.py +99 -55
  26. yowasp_yosys/witness.py +16 -7
  27. yowasp_yosys/yosys.wasm +0 -0
  28. yowasp_yosys/ywio.py +8 -2
  29. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/METADATA +12 -12
  30. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/RECORD +42 -28
  31. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/WHEEL +1 -1
  32. yowasp_yosys/share/quicklogic/lut_sim.v +0 -76
  33. /yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.h → runtime/cxxrtl/capi/cxxrtl_capi.h} +0 -0
  34. /yowasp_yosys/share/quicklogic/{cells_sim.v → common/cells_sim.v} +0 -0
  35. /yowasp_yosys/share/quicklogic/{abc9_map.v → pp3/abc9_map.v} +0 -0
  36. /yowasp_yosys/share/quicklogic/{abc9_model.v → pp3/abc9_model.v} +0 -0
  37. /yowasp_yosys/share/quicklogic/{abc9_unmap.v → pp3/abc9_unmap.v} +0 -0
  38. /yowasp_yosys/share/quicklogic/{pp3_cells_map.v → pp3/cells_map.v} +0 -0
  39. /yowasp_yosys/share/quicklogic/{pp3_ffs_map.v → pp3/ffs_map.v} +0 -0
  40. /yowasp_yosys/share/quicklogic/{pp3_latches_map.v → pp3/latches_map.v} +0 -0
  41. /yowasp_yosys/share/quicklogic/{pp3_lut_map.v → pp3/lut_map.v} +0 -0
  42. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/entry_points.txt +0 -0
  43. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,4288 @@
1
+ // Copyright 2020-2022 F4PGA Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ module RAM_36K_BLK (
18
+ WEN_i,
19
+ REN_i,
20
+ WR_CLK_i,
21
+ RD_CLK_i,
22
+ WR_BE_i,
23
+ WR_ADDR_i,
24
+ RD_ADDR_i,
25
+ WDATA_i,
26
+ RDATA_o
27
+ );
28
+
29
+ parameter WR_ADDR_WIDTH = 10;
30
+ parameter RD_ADDR_WIDTH = 10;
31
+ parameter WR_DATA_WIDTH = 36;
32
+ parameter RD_DATA_WIDTH = 36;
33
+ parameter BE_WIDTH = 4;
34
+
35
+ parameter INIT = 0;
36
+
37
+ input wire WEN_i;
38
+ input wire REN_i;
39
+ input wire WR_CLK_i;
40
+ input wire RD_CLK_i;
41
+ input wire [BE_WIDTH-1:0] WR_BE_i;
42
+ input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
43
+ input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
44
+ input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
45
+ output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
46
+
47
+ // Fixed mode settings
48
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
49
+ localparam [ 0:0] FMODE1_i = 1'd0;
50
+ localparam [ 0:0] POWERDN1_i = 1'd0;
51
+ localparam [ 0:0] SLEEP1_i = 1'd0;
52
+ localparam [ 0:0] PROTECT1_i = 1'd0;
53
+ localparam [11:0] UPAE1_i = 12'd10;
54
+ localparam [11:0] UPAF1_i = 12'd10;
55
+
56
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
57
+ localparam [ 0:0] FMODE2_i = 1'd0;
58
+ localparam [ 0:0] POWERDN2_i = 1'd0;
59
+ localparam [ 0:0] SLEEP2_i = 1'd0;
60
+ localparam [ 0:0] PROTECT2_i = 1'd0;
61
+ localparam [10:0] UPAE2_i = 11'd10;
62
+ localparam [10:0] UPAF2_i = 11'd10;
63
+
64
+ // Width mode function
65
+ function [2:0] mode;
66
+ input integer width;
67
+ case (width)
68
+ 1: mode = 3'b101;
69
+ 2: mode = 3'b110;
70
+ 4: mode = 3'b100;
71
+ 8,9: mode = 3'b001;
72
+ 16, 18: mode = 3'b010;
73
+ 32, 36: mode = 3'b011;
74
+ default: mode = 3'b000;
75
+ endcase
76
+ endfunction
77
+
78
+ function integer rwmode;
79
+ input integer rwwidth;
80
+ case (rwwidth)
81
+ 1: rwmode = 1;
82
+ 2: rwmode = 2;
83
+ 4: rwmode = 4;
84
+ 8,9: rwmode = 9;
85
+ 16, 18: rwmode = 18;
86
+ 32, 36: rwmode = 36;
87
+ default: rwmode = 36;
88
+ endcase
89
+ endfunction
90
+
91
+ wire REN_A1_i;
92
+ wire REN_A2_i;
93
+
94
+ wire REN_B1_i;
95
+ wire REN_B2_i;
96
+
97
+ wire WEN_A1_i;
98
+ wire WEN_A2_i;
99
+
100
+ wire WEN_B1_i;
101
+ wire WEN_B2_i;
102
+
103
+ wire [1:0] BE_A1_i;
104
+ wire [1:0] BE_A2_i;
105
+
106
+ wire [1:0] BE_B1_i;
107
+ wire [1:0] BE_B2_i;
108
+
109
+ wire [14:0] ADDR_A1_i;
110
+ wire [13:0] ADDR_A2_i;
111
+
112
+ wire [14:0] ADDR_B1_i;
113
+ wire [13:0] ADDR_B2_i;
114
+
115
+ wire [17:0] WDATA_A1_i;
116
+ wire [17:0] WDATA_A2_i;
117
+
118
+ wire [17:0] WDATA_B1_i;
119
+ wire [17:0] WDATA_B2_i;
120
+
121
+ wire [17:0] RDATA_A1_o;
122
+ wire [17:0] RDATA_A2_o;
123
+
124
+ wire [17:0] RDATA_B1_o;
125
+ wire [17:0] RDATA_B2_o;
126
+
127
+ wire [3:0] WR_BE;
128
+
129
+ wire [35:0] PORT_B_RDATA;
130
+ wire [35:0] PORT_A_WDATA;
131
+
132
+ wire [14:0] WR_ADDR_INT;
133
+ wire [14:0] RD_ADDR_INT;
134
+
135
+ wire [14:0] PORT_A_ADDR;
136
+ wire [14:0] PORT_B_ADDR;
137
+
138
+ wire PORT_A_CLK;
139
+ wire PORT_B_CLK;
140
+
141
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
142
+ localparam [ 2:0] RMODE_A1_i = mode(WR_DATA_WIDTH);
143
+ localparam [ 2:0] WMODE_A1_i = mode(WR_DATA_WIDTH);
144
+ localparam [ 2:0] RMODE_A2_i = mode(WR_DATA_WIDTH);
145
+ localparam [ 2:0] WMODE_A2_i = mode(WR_DATA_WIDTH);
146
+
147
+ localparam [ 2:0] RMODE_B1_i = mode(RD_DATA_WIDTH);
148
+ localparam [ 2:0] WMODE_B1_i = mode(RD_DATA_WIDTH);
149
+ localparam [ 2:0] RMODE_B2_i = mode(RD_DATA_WIDTH);
150
+ localparam [ 2:0] WMODE_B2_i = mode(RD_DATA_WIDTH);
151
+
152
+ localparam PORT_A_WRWIDTH = rwmode(WR_DATA_WIDTH);
153
+ localparam PORT_B_WRWIDTH = rwmode(RD_DATA_WIDTH);
154
+
155
+ assign PORT_A_CLK = WR_CLK_i;
156
+ assign PORT_B_CLK = RD_CLK_i;
157
+
158
+ generate
159
+ if (WR_ADDR_WIDTH == 15) begin
160
+ assign WR_ADDR_INT = WR_ADDR_i;
161
+ end else begin
162
+ assign WR_ADDR_INT[14:WR_ADDR_WIDTH] = 0;
163
+ assign WR_ADDR_INT[WR_ADDR_WIDTH-1:0] = WR_ADDR_i;
164
+ end
165
+ endgenerate
166
+
167
+ case (WR_DATA_WIDTH)
168
+ 1: begin
169
+ assign PORT_A_ADDR = WR_ADDR_INT;
170
+ end
171
+ 2: begin
172
+ assign PORT_A_ADDR = WR_ADDR_INT << 1;
173
+ end
174
+ 4: begin
175
+ assign PORT_A_ADDR = WR_ADDR_INT << 2;
176
+ end
177
+ 8, 9: begin
178
+ assign PORT_A_ADDR = WR_ADDR_INT << 3;
179
+ end
180
+ 16, 18: begin
181
+ assign PORT_A_ADDR = WR_ADDR_INT << 4;
182
+ end
183
+ 32, 36: begin
184
+ assign PORT_A_ADDR = WR_ADDR_INT << 5;
185
+ end
186
+ default: begin
187
+ assign PORT_A_ADDR = WR_ADDR_INT;
188
+ end
189
+ endcase
190
+
191
+ generate
192
+ if (RD_ADDR_WIDTH == 15) begin
193
+ assign RD_ADDR_INT = RD_ADDR_i;
194
+ end else begin
195
+ assign RD_ADDR_INT[14:RD_ADDR_WIDTH] = 0;
196
+ assign RD_ADDR_INT[RD_ADDR_WIDTH-1:0] = RD_ADDR_i;
197
+ end
198
+ endgenerate
199
+
200
+ case (RD_DATA_WIDTH)
201
+ 1: begin
202
+ assign PORT_B_ADDR = RD_ADDR_INT;
203
+ end
204
+ 2: begin
205
+ assign PORT_B_ADDR = RD_ADDR_INT << 1;
206
+ end
207
+ 4: begin
208
+ assign PORT_B_ADDR = RD_ADDR_INT << 2;
209
+ end
210
+ 8, 9: begin
211
+ assign PORT_B_ADDR = RD_ADDR_INT << 3;
212
+ end
213
+ 16, 18: begin
214
+ assign PORT_B_ADDR = RD_ADDR_INT << 4;
215
+ end
216
+ 32, 36: begin
217
+ assign PORT_B_ADDR = RD_ADDR_INT << 5;
218
+ end
219
+ default: begin
220
+ assign PORT_B_ADDR = RD_ADDR_INT;
221
+ end
222
+ endcase
223
+
224
+ case (BE_WIDTH)
225
+ 4: begin
226
+ assign WR_BE = WR_BE_i[BE_WIDTH-1 :0];
227
+ end
228
+ default: begin
229
+ assign WR_BE[3:BE_WIDTH] = 0;
230
+ assign WR_BE[BE_WIDTH-1 :0] = WR_BE_i[BE_WIDTH-1 :0];
231
+ end
232
+ endcase
233
+
234
+ assign REN_A1_i = 1'b0;
235
+ assign WEN_A1_i = WEN_i;
236
+ assign {BE_A2_i, BE_A1_i} = WR_BE;
237
+
238
+ assign REN_B1_i = REN_i;
239
+ assign WEN_B1_i = 1'b0;
240
+ assign {BE_B2_i, BE_B1_i} = 4'h0;
241
+
242
+ generate
243
+ if (WR_DATA_WIDTH == 36) begin
244
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
245
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
246
+ assign PORT_A_WDATA[WR_DATA_WIDTH+1:18] = WDATA_i[WR_DATA_WIDTH-1:16];
247
+ assign PORT_A_WDATA[17:0] = {2'b00,WDATA_i[15:0]};
248
+ end else if (WR_DATA_WIDTH == 9) begin
249
+ assign PORT_A_WDATA = {19'h0, WDATA_i[8], 8'h0, WDATA_i[7:0]};
250
+ end else begin
251
+ assign PORT_A_WDATA[35:WR_DATA_WIDTH] = 0;
252
+ assign PORT_A_WDATA[WR_DATA_WIDTH-1:0] = WDATA_i[WR_DATA_WIDTH-1:0];
253
+ end
254
+ endgenerate
255
+
256
+ assign WDATA_A1_i = PORT_A_WDATA[17:0];
257
+ assign WDATA_A2_i = PORT_A_WDATA[35:18];
258
+
259
+ assign WDATA_B1_i = 18'h0;
260
+ assign WDATA_B2_i = 18'h0;
261
+
262
+ generate
263
+ if (RD_DATA_WIDTH == 36) begin
264
+ assign PORT_B_RDATA = {RDATA_B2_o, RDATA_B1_o};
265
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
266
+ assign PORT_B_RDATA = {2'b00,RDATA_B2_o[17:0],RDATA_B1_o[15:0]};
267
+ end else if (RD_DATA_WIDTH == 9) begin
268
+ assign PORT_B_RDATA = { 27'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
269
+ end else begin
270
+ assign PORT_B_RDATA = {18'h0, RDATA_B1_o};
271
+ end
272
+ endgenerate
273
+
274
+ assign RDATA_o = PORT_B_RDATA[RD_DATA_WIDTH-1:0];
275
+
276
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
277
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
278
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
279
+ };
280
+
281
+
282
+ (* is_inferred = 0 *)
283
+ (* is_split = 0 *)
284
+ (* is_fifo = 0 *)
285
+ (* port_a_dwidth = PORT_A_WRWIDTH *)
286
+ (* port_b_dwidth = PORT_B_WRWIDTH *)
287
+ TDP36K _TECHMAP_REPLACE_ (
288
+ .RESET_ni(1'b1),
289
+
290
+ .CLK_A1_i(PORT_A_CLK),
291
+ .ADDR_A1_i(PORT_A_ADDR),
292
+ .WEN_A1_i(WEN_A1_i),
293
+ .BE_A1_i(BE_A1_i),
294
+ .WDATA_A1_i(WDATA_A1_i),
295
+ .REN_A1_i(REN_A1_i),
296
+ .RDATA_A1_o(RDATA_A1_o),
297
+
298
+ .CLK_A2_i(PORT_A_CLK),
299
+ .ADDR_A2_i(PORT_A_ADDR[13:0]),
300
+ .WEN_A2_i(WEN_A1_i),
301
+ .BE_A2_i(BE_A2_i),
302
+ .WDATA_A2_i(WDATA_A2_i),
303
+ .REN_A2_i(REN_A1_i),
304
+ .RDATA_A2_o(RDATA_A2_o),
305
+
306
+ .CLK_B1_i(PORT_B_CLK),
307
+ .ADDR_B1_i(PORT_B_ADDR),
308
+ .WEN_B1_i(WEN_B1_i),
309
+ .BE_B1_i(BE_B1_i),
310
+ .WDATA_B1_i(WDATA_B1_i),
311
+ .REN_B1_i(REN_B1_i),
312
+ .RDATA_B1_o(RDATA_B1_o),
313
+
314
+ .CLK_B2_i(PORT_B_CLK),
315
+ .ADDR_B2_i(PORT_B_ADDR[13:0]),
316
+ .WEN_B2_i(WEN_B1_i),
317
+ .BE_B2_i(BE_B2_i),
318
+ .WDATA_B2_i(WDATA_B2_i),
319
+ .REN_B2_i(REN_B1_i),
320
+ .RDATA_B2_o(RDATA_B2_o),
321
+
322
+ .FLUSH1_i(1'b0),
323
+ .FLUSH2_i(1'b0)
324
+ );
325
+
326
+ endmodule
327
+
328
+ module RAM_18K_BLK (
329
+ WEN_i,
330
+ REN_i,
331
+ WR_CLK_i,
332
+ RD_CLK_i,
333
+ WR_BE_i,
334
+ WR_ADDR_i,
335
+ RD_ADDR_i,
336
+ WDATA_i,
337
+ RDATA_o
338
+ );
339
+
340
+ parameter WR_ADDR_WIDTH = 10;
341
+ parameter RD_ADDR_WIDTH = 10;
342
+ parameter WR_DATA_WIDTH = 18;
343
+ parameter RD_DATA_WIDTH = 18;
344
+ parameter BE_WIDTH = 2;
345
+
346
+ input wire WEN_i;
347
+ input wire REN_i;
348
+ input wire WR_CLK_i;
349
+ input wire RD_CLK_i;
350
+ input wire [BE_WIDTH-1:0] WR_BE_i;
351
+ input wire [WR_ADDR_WIDTH-1 :0] WR_ADDR_i;
352
+ input wire [RD_ADDR_WIDTH-1 :0] RD_ADDR_i;
353
+ input wire [WR_DATA_WIDTH-1 :0] WDATA_i;
354
+ output wire [RD_DATA_WIDTH-1 :0] RDATA_o;
355
+
356
+ (* is_inferred = 0 *)
357
+ (* is_split = 0 *)
358
+ (* is_fifo = 0 *)
359
+ BRAM2x18_SP #(
360
+ .WR1_ADDR_WIDTH(WR_ADDR_WIDTH),
361
+ .RD1_ADDR_WIDTH(RD_ADDR_WIDTH),
362
+ .WR1_DATA_WIDTH(WR_DATA_WIDTH),
363
+ .RD1_DATA_WIDTH(RD_DATA_WIDTH),
364
+ .BE1_WIDTH(BE_WIDTH),
365
+ .WR2_ADDR_WIDTH(),
366
+ .RD2_ADDR_WIDTH(),
367
+ .WR2_DATA_WIDTH(),
368
+ .RD2_DATA_WIDTH(),
369
+ .BE2_WIDTH()
370
+ ) U1
371
+ (
372
+ .RESET_ni(1'b1),
373
+
374
+ .WEN1_i(WEN_i),
375
+ .REN1_i(REN_i),
376
+ .WR1_CLK_i(WR_CLK_i),
377
+ .RD1_CLK_i(RD_CLK_i),
378
+ .WR1_BE_i(WR_BE_i),
379
+ .WR1_ADDR_i(WR_ADDR_i),
380
+ .RD1_ADDR_i(RD_ADDR_i),
381
+ .WDATA1_i(WDATA_i),
382
+ .RDATA1_o(RDATA_o),
383
+
384
+ .WEN2_i(1'b0),
385
+ .REN2_i(1'b0),
386
+ .WR2_CLK_i(1'b0),
387
+ .RD2_CLK_i(1'b0),
388
+ .WR2_BE_i(2'b00),
389
+ .WR2_ADDR_i(14'h0),
390
+ .RD2_ADDR_i(14'h0),
391
+ .WDATA2_i(18'h0),
392
+ .RDATA2_o()
393
+ );
394
+
395
+ endmodule
396
+
397
+ module RAM_18K_X2_BLK (
398
+ RESET_ni,
399
+
400
+ WEN1_i,
401
+ REN1_i,
402
+ WR1_CLK_i,
403
+ RD1_CLK_i,
404
+ WR1_BE_i,
405
+ WR1_ADDR_i,
406
+ RD1_ADDR_i,
407
+ WDATA1_i,
408
+ RDATA1_o,
409
+
410
+ WEN2_i,
411
+ REN2_i,
412
+ WR2_CLK_i,
413
+ RD2_CLK_i,
414
+ WR2_BE_i,
415
+ WR2_ADDR_i,
416
+ RD2_ADDR_i,
417
+ WDATA2_i,
418
+ RDATA2_o
419
+ );
420
+
421
+ parameter WR1_ADDR_WIDTH = 10;
422
+ parameter RD1_ADDR_WIDTH = 10;
423
+ parameter WR1_DATA_WIDTH = 18;
424
+ parameter RD1_DATA_WIDTH = 18;
425
+ parameter BE1_WIDTH = 2;
426
+
427
+ parameter WR2_ADDR_WIDTH = 10;
428
+ parameter RD2_ADDR_WIDTH = 10;
429
+ parameter WR2_DATA_WIDTH = 18;
430
+ parameter RD2_DATA_WIDTH = 18;
431
+ parameter BE2_WIDTH = 2;
432
+
433
+ input wire RESET_ni;
434
+
435
+ input wire WEN1_i;
436
+ input wire REN1_i;
437
+ input wire WR1_CLK_i;
438
+ input wire RD1_CLK_i;
439
+ input wire [BE1_WIDTH-1:0] WR1_BE_i;
440
+ input wire [WR1_ADDR_WIDTH-1 :0] WR1_ADDR_i;
441
+ input wire [RD1_ADDR_WIDTH-1 :0] RD1_ADDR_i;
442
+ input wire [WR1_DATA_WIDTH-1 :0] WDATA1_i;
443
+ output wire [RD1_DATA_WIDTH-1 :0] RDATA1_o;
444
+
445
+ input wire WEN2_i;
446
+ input wire REN2_i;
447
+ input wire WR2_CLK_i;
448
+ input wire RD2_CLK_i;
449
+ input wire [BE2_WIDTH-1:0] WR2_BE_i;
450
+ input wire [WR2_ADDR_WIDTH-1 :0] WR2_ADDR_i;
451
+ input wire [RD2_ADDR_WIDTH-1 :0] RD2_ADDR_i;
452
+ input wire [WR2_DATA_WIDTH-1 :0] WDATA2_i;
453
+ output wire [RD2_DATA_WIDTH-1 :0] RDATA2_o;
454
+
455
+ // Fixed mode settings
456
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
457
+ localparam [ 0:0] FMODE1_i = 1'd0;
458
+ localparam [ 0:0] POWERDN1_i = 1'd0;
459
+ localparam [ 0:0] SLEEP1_i = 1'd0;
460
+ localparam [ 0:0] PROTECT1_i = 1'd0;
461
+ localparam [11:0] UPAE1_i = 12'd10;
462
+ localparam [11:0] UPAF1_i = 12'd10;
463
+
464
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
465
+ localparam [ 0:0] FMODE2_i = 1'd0;
466
+ localparam [ 0:0] POWERDN2_i = 1'd0;
467
+ localparam [ 0:0] SLEEP2_i = 1'd0;
468
+ localparam [ 0:0] PROTECT2_i = 1'd0;
469
+ localparam [10:0] UPAE2_i = 11'd10;
470
+ localparam [10:0] UPAF2_i = 11'd10;
471
+
472
+ // Width mode function
473
+ function [2:0] mode;
474
+ input integer width;
475
+ case (width)
476
+ 1: mode = 3'b101;
477
+ 2: mode = 3'b110;
478
+ 4: mode = 3'b100;
479
+ 8,9: mode = 3'b001;
480
+ 16, 18: mode = 3'b010;
481
+ 32, 36: mode = 3'b011;
482
+ default: mode = 3'b000;
483
+ endcase
484
+ endfunction
485
+
486
+ function integer rwmode;
487
+ input integer rwwidth;
488
+ case (rwwidth)
489
+ 1: rwmode = 1;
490
+ 2: rwmode = 2;
491
+ 4: rwmode = 4;
492
+ 8,9: rwmode = 9;
493
+ 16, 18: rwmode = 18;
494
+ default: rwmode = 18;
495
+ endcase
496
+ endfunction
497
+
498
+ wire REN_A1_i;
499
+ wire REN_A2_i;
500
+
501
+ wire REN_B1_i;
502
+ wire REN_B2_i;
503
+
504
+ wire WEN_A1_i;
505
+ wire WEN_A2_i;
506
+
507
+ wire WEN_B1_i;
508
+ wire WEN_B2_i;
509
+
510
+ wire [1:0] BE_A1_i;
511
+ wire [1:0] BE_A2_i;
512
+
513
+ wire [1:0] BE_B1_i;
514
+ wire [1:0] BE_B2_i;
515
+
516
+ wire [14:0] ADDR_A1_i;
517
+ wire [13:0] ADDR_A2_i;
518
+
519
+ wire [14:0] ADDR_B1_i;
520
+ wire [13:0] ADDR_B2_i;
521
+
522
+ wire [17:0] WDATA_A1_i;
523
+ wire [17:0] WDATA_A2_i;
524
+
525
+ wire [17:0] WDATA_B1_i;
526
+ wire [17:0] WDATA_B2_i;
527
+
528
+ wire [17:0] RDATA_A1_o;
529
+ wire [17:0] RDATA_A2_o;
530
+
531
+ wire [17:0] RDATA_B1_o;
532
+ wire [17:0] RDATA_B2_o;
533
+
534
+ wire [1:0] WR1_BE;
535
+ wire [1:0] WR2_BE;
536
+
537
+ wire [17:0] PORT_B1_RDATA;
538
+ wire [17:0] PORT_A1_WDATA;
539
+
540
+ wire [17:0] PORT_B2_RDATA;
541
+ wire [17:0] PORT_A2_WDATA;
542
+
543
+ wire [13:0] WR1_ADDR_INT;
544
+ wire [13:0] RD1_ADDR_INT;
545
+
546
+ wire [13:0] WR2_ADDR_INT;
547
+ wire [13:0] RD2_ADDR_INT;
548
+
549
+ wire [13:0] PORT_A1_ADDR;
550
+ wire [13:0] PORT_B1_ADDR;
551
+
552
+ wire [13:0] PORT_A2_ADDR;
553
+ wire [13:0] PORT_B2_ADDR;
554
+
555
+
556
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
557
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
558
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
559
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
560
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
561
+
562
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
563
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
564
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
565
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
566
+
567
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
568
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
569
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
570
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
571
+
572
+ generate
573
+ if (WR1_ADDR_WIDTH == 14) begin
574
+ assign WR1_ADDR_INT = WR1_ADDR_i;
575
+ end else begin
576
+ assign WR1_ADDR_INT[13:WR1_ADDR_WIDTH] = 0;
577
+ assign WR1_ADDR_INT[WR1_ADDR_WIDTH-1:0] = WR1_ADDR_i;
578
+ end
579
+ endgenerate
580
+
581
+ case (WR1_DATA_WIDTH)
582
+ 1: begin
583
+ assign PORT_A1_ADDR = WR1_ADDR_INT;
584
+ end
585
+ 2: begin
586
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 1;
587
+ end
588
+ 4: begin
589
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 2;
590
+ end
591
+ 8, 9: begin
592
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 3;
593
+ end
594
+ 16, 18: begin
595
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 4;
596
+ end
597
+ default: begin
598
+ assign PORT_A1_ADDR = WR1_ADDR_INT;
599
+ end
600
+ endcase
601
+
602
+ generate
603
+ if (RD1_ADDR_WIDTH == 14) begin
604
+ assign RD1_ADDR_INT = RD1_ADDR_i;
605
+ end else begin
606
+ assign RD1_ADDR_INT[13:RD1_ADDR_WIDTH] = 0;
607
+ assign RD1_ADDR_INT[RD1_ADDR_WIDTH-1:0] = RD1_ADDR_i;
608
+ end
609
+ endgenerate
610
+
611
+ case (RD1_DATA_WIDTH)
612
+ 1: begin
613
+ assign PORT_B1_ADDR = RD1_ADDR_INT;
614
+ end
615
+ 2: begin
616
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 1;
617
+ end
618
+ 4: begin
619
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 2;
620
+ end
621
+ 8, 9: begin
622
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 3;
623
+ end
624
+ 16, 18: begin
625
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 4;
626
+ end
627
+ default: begin
628
+ assign PORT_B1_ADDR = RD1_ADDR_INT;
629
+ end
630
+ endcase
631
+
632
+ generate
633
+ if (WR2_ADDR_WIDTH == 14) begin
634
+ assign WR2_ADDR_INT = WR2_ADDR_i;
635
+ end else begin
636
+ assign WR2_ADDR_INT[13:WR2_ADDR_WIDTH] = 0;
637
+ assign WR2_ADDR_INT[WR2_ADDR_WIDTH-1:0] = WR2_ADDR_i;
638
+ end
639
+ endgenerate
640
+
641
+ case (WR2_DATA_WIDTH)
642
+ 1: begin
643
+ assign PORT_A2_ADDR = WR2_ADDR_INT;
644
+ end
645
+ 2: begin
646
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 1;
647
+ end
648
+ 4: begin
649
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 2;
650
+ end
651
+ 8, 9: begin
652
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 3;
653
+ end
654
+ 16, 18: begin
655
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 4;
656
+ end
657
+ default: begin
658
+ assign PORT_A2_ADDR = WR2_ADDR_INT;
659
+ end
660
+ endcase
661
+
662
+ generate
663
+ if (RD2_ADDR_WIDTH == 14) begin
664
+ assign RD2_ADDR_INT = RD2_ADDR_i;
665
+ end else begin
666
+ assign RD2_ADDR_INT[13:RD2_ADDR_WIDTH] = 0;
667
+ assign RD2_ADDR_INT[RD2_ADDR_WIDTH-1:0] = RD2_ADDR_i;
668
+ end
669
+ endgenerate
670
+
671
+ case (RD2_DATA_WIDTH)
672
+ 1: begin
673
+ assign PORT_B2_ADDR = RD2_ADDR_INT;
674
+ end
675
+ 2: begin
676
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 1;
677
+ end
678
+ 4: begin
679
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 2;
680
+ end
681
+ 8, 9: begin
682
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 3;
683
+ end
684
+ 16, 18: begin
685
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 4;
686
+ end
687
+ default: begin
688
+ assign PORT_B2_ADDR = RD2_ADDR_INT;
689
+ end
690
+ endcase
691
+
692
+ case (BE1_WIDTH)
693
+ 2: begin
694
+ assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
695
+ end
696
+ default: begin
697
+ assign WR1_BE[1:BE1_WIDTH] = 0;
698
+ assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
699
+ end
700
+ endcase
701
+
702
+ case (BE2_WIDTH)
703
+ 2: begin
704
+ assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
705
+ end
706
+ default: begin
707
+ assign WR2_BE[1:BE2_WIDTH] = 0;
708
+ assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
709
+ end
710
+ endcase
711
+
712
+ assign REN_A1_i = 1'b0;
713
+ assign WEN_A1_i = WEN1_i;
714
+ assign BE_A1_i = WR1_BE;
715
+ assign REN_A2_i = 1'b0;
716
+ assign WEN_A2_i = WEN2_i;
717
+ assign BE_A2_i = WR2_BE;
718
+
719
+ assign REN_B1_i = REN1_i;
720
+ assign WEN_B1_i = 1'b0;
721
+ assign BE_B1_i = 4'h0;
722
+ assign REN_B2_i = REN2_i;
723
+ assign WEN_B2_i = 1'b0;
724
+ assign BE_B2_i = 4'h0;
725
+
726
+ generate
727
+ if (WR1_DATA_WIDTH == 18) begin
728
+ assign PORT_A1_WDATA[WR1_DATA_WIDTH-1:0] = WDATA1_i[WR1_DATA_WIDTH-1:0];
729
+ end else if (WR1_DATA_WIDTH == 9) begin
730
+ assign PORT_A1_WDATA = {1'b0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
731
+ end else begin
732
+ assign PORT_A1_WDATA[17:WR1_DATA_WIDTH] = 0;
733
+ assign PORT_A1_WDATA[WR1_DATA_WIDTH-1:0] = WDATA1_i[WR1_DATA_WIDTH-1:0];
734
+ end
735
+ endgenerate
736
+
737
+ assign WDATA_A1_i = PORT_A1_WDATA[17:0];
738
+ assign WDATA_B1_i = 18'h0;
739
+
740
+ generate
741
+ if (RD1_DATA_WIDTH == 9) begin
742
+ assign PORT_B1_RDATA = { 9'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
743
+ end else begin
744
+ assign PORT_B1_RDATA = RDATA_B1_o;
745
+ end
746
+ endgenerate
747
+
748
+ assign RDATA1_o = PORT_B1_RDATA[RD1_DATA_WIDTH-1:0];
749
+
750
+ generate
751
+ if (WR2_DATA_WIDTH == 18) begin
752
+ assign PORT_A2_WDATA[WR2_DATA_WIDTH-1:0] = WDATA2_i[WR2_DATA_WIDTH-1:0];
753
+ end else if (WR2_DATA_WIDTH == 9) begin
754
+ assign PORT_A2_WDATA = {1'b0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
755
+ end else begin
756
+ assign PORT_A2_WDATA[17:WR2_DATA_WIDTH] = 0;
757
+ assign PORT_A2_WDATA[WR2_DATA_WIDTH-1:0] = WDATA2_i[WR2_DATA_WIDTH-1:0];
758
+ end
759
+ endgenerate
760
+
761
+ assign WDATA_A2_i = PORT_A2_WDATA[17:0];
762
+ assign WDATA_B2_i = 18'h0;
763
+
764
+ generate
765
+ if (RD2_DATA_WIDTH == 9) begin
766
+ assign PORT_B2_RDATA = { 9'h0, RDATA_B2_o[16], RDATA_B2_o[7:0]};
767
+ end else begin
768
+ assign PORT_B2_RDATA = RDATA_B2_o;
769
+ end
770
+ endgenerate
771
+
772
+ assign RDATA2_o = PORT_B2_RDATA[RD2_DATA_WIDTH-1:0];
773
+
774
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
775
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
776
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
777
+ };
778
+
779
+ (* is_inferred = 0 *)
780
+ (* is_split = 1 *)
781
+ (* is_fifo = 0 *)
782
+ (* port_a1_dwidth = PORT_A1_WRWIDTH *)
783
+ (* port_a2_dwidth = PORT_A2_WRWIDTH *)
784
+ (* port_b1_dwidth = PORT_B1_WRWIDTH *)
785
+ (* port_b2_dwidth = PORT_B2_WRWIDTH *)
786
+ TDP36K _TECHMAP_REPLACE_ (
787
+ .RESET_ni(1'b1),
788
+
789
+ .CLK_A1_i(WR1_CLK_i),
790
+ .ADDR_A1_i({1'b0,PORT_A1_ADDR}),
791
+ .WEN_A1_i(WEN_A1_i),
792
+ .BE_A1_i(BE_A1_i),
793
+ .WDATA_A1_i(WDATA_A1_i),
794
+ .REN_A1_i(REN_A1_i),
795
+ .RDATA_A1_o(RDATA_A1_o),
796
+
797
+ .CLK_A2_i(WR2_CLK_i),
798
+ .ADDR_A2_i(PORT_A2_ADDR),
799
+ .WEN_A2_i(WEN_A2_i),
800
+ .BE_A2_i(BE_A2_i),
801
+ .WDATA_A2_i(WDATA_A2_i),
802
+ .REN_A2_i(REN_A2_i),
803
+ .RDATA_A2_o(RDATA_A2_o),
804
+
805
+ .CLK_B1_i(RD1_CLK_i),
806
+ .ADDR_B1_i({1'b0,PORT_B1_ADDR}),
807
+ .WEN_B1_i(WEN_B1_i),
808
+ .BE_B1_i(BE_B1_i),
809
+ .WDATA_B1_i(WDATA_B1_i),
810
+ .REN_B1_i(REN_B1_i),
811
+ .RDATA_B1_o(RDATA_B1_o),
812
+
813
+ .CLK_B2_i(RD2_CLK_i),
814
+ .ADDR_B2_i(PORT_B2_ADDR),
815
+ .WEN_B2_i(WEN_B2_i),
816
+ .BE_B2_i(BE_B2_i),
817
+ .WDATA_B2_i(WDATA_B2_i),
818
+ .REN_B2_i(REN_B2_i),
819
+ .RDATA_B2_o(RDATA_B2_o),
820
+
821
+ .FLUSH1_i(1'b0),
822
+ .FLUSH2_i(1'b0)
823
+ );
824
+
825
+ endmodule
826
+
827
+ module DPRAM_36K_BLK (
828
+ PORT_A_CLK_i,
829
+ PORT_A_WEN_i,
830
+ PORT_A_WR_BE_i,
831
+ PORT_A_REN_i,
832
+ PORT_A_ADDR_i,
833
+ PORT_A_WR_DATA_i,
834
+ PORT_A_RD_DATA_o,
835
+
836
+ PORT_B_CLK_i,
837
+ PORT_B_WEN_i,
838
+ PORT_B_WR_BE_i,
839
+ PORT_B_REN_i,
840
+ PORT_B_ADDR_i,
841
+ PORT_B_WR_DATA_i,
842
+ PORT_B_RD_DATA_o
843
+ );
844
+
845
+ parameter PORT_A_AWIDTH = 10;
846
+ parameter PORT_A_DWIDTH = 36;
847
+ parameter PORT_A_WR_BE_WIDTH = 4;
848
+
849
+ parameter PORT_B_AWIDTH = 10;
850
+ parameter PORT_B_DWIDTH = 36;
851
+ parameter PORT_B_WR_BE_WIDTH = 4;
852
+
853
+ input PORT_A_CLK_i;
854
+ input [PORT_A_AWIDTH-1:0] PORT_A_ADDR_i;
855
+ input [PORT_A_DWIDTH-1:0] PORT_A_WR_DATA_i;
856
+ input PORT_A_WEN_i;
857
+ input [PORT_A_WR_BE_WIDTH-1:0] PORT_A_WR_BE_i;
858
+ input PORT_A_REN_i;
859
+ output [PORT_A_DWIDTH-1:0] PORT_A_RD_DATA_o;
860
+
861
+ input PORT_B_CLK_i;
862
+ input [PORT_B_AWIDTH-1:0] PORT_B_ADDR_i;
863
+ input [PORT_B_DWIDTH-1:0] PORT_B_WR_DATA_i;
864
+ input PORT_B_WEN_i;
865
+ input [PORT_B_WR_BE_WIDTH-1:0] PORT_B_WR_BE_i;
866
+ input PORT_B_REN_i;
867
+ output [PORT_B_DWIDTH-1:0] PORT_B_RD_DATA_o;
868
+
869
+
870
+ // Fixed mode settings
871
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
872
+ localparam [ 0:0] FMODE1_i = 1'd0;
873
+ localparam [ 0:0] POWERDN1_i = 1'd0;
874
+ localparam [ 0:0] SLEEP1_i = 1'd0;
875
+ localparam [ 0:0] PROTECT1_i = 1'd0;
876
+ localparam [11:0] UPAE1_i = 12'd10;
877
+ localparam [11:0] UPAF1_i = 12'd10;
878
+
879
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
880
+ localparam [ 0:0] FMODE2_i = 1'd0;
881
+ localparam [ 0:0] POWERDN2_i = 1'd0;
882
+ localparam [ 0:0] SLEEP2_i = 1'd0;
883
+ localparam [ 0:0] PROTECT2_i = 1'd0;
884
+ localparam [10:0] UPAE2_i = 11'd10;
885
+ localparam [10:0] UPAF2_i = 11'd10;
886
+
887
+ // Width mode function
888
+ function [2:0] mode;
889
+ input integer width;
890
+ case (width)
891
+ 1: mode = 3'b101;
892
+ 2: mode = 3'b110;
893
+ 4: mode = 3'b100;
894
+ 8,9: mode = 3'b001;
895
+ 16, 18: mode = 3'b010;
896
+ 32, 36: mode = 3'b011;
897
+ default: mode = 3'b000;
898
+ endcase
899
+ endfunction
900
+
901
+ function integer rwmode;
902
+ input integer rwwidth;
903
+ case (rwwidth)
904
+ 1: rwmode = 1;
905
+ 2: rwmode = 2;
906
+ 4: rwmode = 4;
907
+ 8,9: rwmode = 9;
908
+ 16, 18: rwmode = 18;
909
+ 32, 36: rwmode = 36;
910
+ default: rwmode = 36;
911
+ endcase
912
+ endfunction
913
+
914
+ wire REN_A1_i;
915
+ wire REN_A2_i;
916
+
917
+ wire REN_B1_i;
918
+ wire REN_B2_i;
919
+
920
+ wire WEN_A1_i;
921
+ wire WEN_A2_i;
922
+
923
+ wire WEN_B1_i;
924
+ wire WEN_B2_i;
925
+
926
+ wire [1:0] BE_A1_i;
927
+ wire [1:0] BE_A2_i;
928
+
929
+ wire [1:0] BE_B1_i;
930
+ wire [1:0] BE_B2_i;
931
+
932
+ wire [14:0] ADDR_A1_i;
933
+ wire [13:0] ADDR_A2_i;
934
+
935
+ wire [14:0] ADDR_B1_i;
936
+ wire [13:0] ADDR_B2_i;
937
+
938
+ wire [17:0] WDATA_A1_i;
939
+ wire [17:0] WDATA_A2_i;
940
+
941
+ wire [17:0] WDATA_B1_i;
942
+ wire [17:0] WDATA_B2_i;
943
+
944
+ wire [17:0] RDATA_A1_o;
945
+ wire [17:0] RDATA_A2_o;
946
+
947
+ wire [17:0] RDATA_B1_o;
948
+ wire [17:0] RDATA_B2_o;
949
+
950
+ wire [3:0] PORT_A_WR_BE;
951
+ wire [3:0] PORT_B_WR_BE;
952
+
953
+ wire [35:0] PORT_B_WDATA;
954
+ wire [35:0] PORT_B_RDATA;
955
+ wire [35:0] PORT_A_WDATA;
956
+ wire [35:0] PORT_A_RDATA;
957
+
958
+ wire [14:0] PORT_A_ADDR_INT;
959
+ wire [14:0] PORT_B_ADDR_INT;
960
+
961
+ wire [14:0] PORT_A_ADDR;
962
+ wire [14:0] PORT_B_ADDR;
963
+
964
+ wire PORT_A_CLK;
965
+ wire PORT_B_CLK;
966
+
967
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
968
+ localparam [ 2:0] RMODE_A1_i = mode(PORT_A_DWIDTH);
969
+ localparam [ 2:0] WMODE_A1_i = mode(PORT_A_DWIDTH);
970
+ localparam [ 2:0] RMODE_A2_i = mode(PORT_A_DWIDTH);
971
+ localparam [ 2:0] WMODE_A2_i = mode(PORT_A_DWIDTH);
972
+
973
+ localparam [ 2:0] RMODE_B1_i = mode(PORT_B_DWIDTH);
974
+ localparam [ 2:0] WMODE_B1_i = mode(PORT_B_DWIDTH);
975
+ localparam [ 2:0] RMODE_B2_i = mode(PORT_B_DWIDTH);
976
+ localparam [ 2:0] WMODE_B2_i = mode(PORT_B_DWIDTH);
977
+
978
+ localparam PORT_A_WRWIDTH = rwmode(PORT_A_DWIDTH);
979
+ localparam PORT_B_WRWIDTH = rwmode(PORT_B_DWIDTH);
980
+
981
+ assign PORT_A_CLK = PORT_A_CLK_i;
982
+ assign PORT_B_CLK = PORT_B_CLK_i;
983
+
984
+ generate
985
+ if (PORT_A_AWIDTH == 15) begin
986
+ assign PORT_A_ADDR_INT = PORT_A_ADDR_i;
987
+ end else begin
988
+ assign PORT_A_ADDR_INT[14:PORT_A_AWIDTH] = 0;
989
+ assign PORT_A_ADDR_INT[PORT_A_AWIDTH-1:0] = PORT_A_ADDR_i;
990
+ end
991
+ endgenerate
992
+
993
+ case (PORT_A_DWIDTH)
994
+ 1: begin
995
+ assign PORT_A_ADDR = PORT_A_ADDR_INT;
996
+ end
997
+ 2: begin
998
+ assign PORT_A_ADDR = PORT_A_ADDR_INT << 1;
999
+ end
1000
+ 4: begin
1001
+ assign PORT_A_ADDR = PORT_A_ADDR_INT << 2;
1002
+ end
1003
+ 8, 9: begin
1004
+ assign PORT_A_ADDR = PORT_A_ADDR_INT << 3;
1005
+ end
1006
+ 16, 18: begin
1007
+ assign PORT_A_ADDR = PORT_A_ADDR_INT << 4;
1008
+ end
1009
+ 32, 36: begin
1010
+ assign PORT_A_ADDR = PORT_A_ADDR_INT << 5;
1011
+ end
1012
+ default: begin
1013
+ assign PORT_A_ADDR = PORT_A_ADDR_INT;
1014
+ end
1015
+ endcase
1016
+
1017
+ generate
1018
+ if (PORT_B_AWIDTH == 15) begin
1019
+ assign PORT_B_ADDR_INT = PORT_B_ADDR_i;
1020
+ end else begin
1021
+ assign PORT_B_ADDR_INT[14:PORT_B_AWIDTH] = 0;
1022
+ assign PORT_B_ADDR_INT[PORT_B_AWIDTH-1:0] = PORT_B_ADDR_i;
1023
+ end
1024
+ endgenerate
1025
+
1026
+ case (PORT_B_DWIDTH)
1027
+ 1: begin
1028
+ assign PORT_B_ADDR = PORT_B_ADDR_INT;
1029
+ end
1030
+ 2: begin
1031
+ assign PORT_B_ADDR = PORT_B_ADDR_INT << 1;
1032
+ end
1033
+ 4: begin
1034
+ assign PORT_B_ADDR = PORT_B_ADDR_INT << 2;
1035
+ end
1036
+ 8, 9: begin
1037
+ assign PORT_B_ADDR = PORT_B_ADDR_INT << 3;
1038
+ end
1039
+ 16, 18: begin
1040
+ assign PORT_B_ADDR = PORT_B_ADDR_INT << 4;
1041
+ end
1042
+ 32, 36: begin
1043
+ assign PORT_B_ADDR = PORT_B_ADDR_INT << 5;
1044
+ end
1045
+ default: begin
1046
+ assign PORT_B_ADDR = PORT_B_ADDR_INT;
1047
+ end
1048
+ endcase
1049
+
1050
+ case (PORT_A_WR_BE_WIDTH)
1051
+ 4: begin
1052
+ assign PORT_A_WR_BE = PORT_A_WR_BE_i[PORT_A_WR_BE_WIDTH-1 :0];
1053
+ end
1054
+ default: begin
1055
+ assign PORT_A_WR_BE[3:PORT_A_WR_BE_WIDTH] = 0;
1056
+ assign PORT_A_WR_BE[PORT_A_WR_BE_WIDTH-1 :0] = PORT_A_WR_BE_i[PORT_A_WR_BE_WIDTH-1 :0];
1057
+ end
1058
+ endcase
1059
+
1060
+ case (PORT_B_WR_BE_WIDTH)
1061
+ 4: begin
1062
+ assign PORT_B_WR_BE = PORT_B_WR_BE_i[PORT_B_WR_BE_WIDTH-1 :0];
1063
+ end
1064
+ default: begin
1065
+ assign PORT_B_WR_BE[3:PORT_B_WR_BE_WIDTH] = 0;
1066
+ assign PORT_B_WR_BE[PORT_B_WR_BE_WIDTH-1 :0] = PORT_B_WR_BE_i[PORT_B_WR_BE_WIDTH-1 :0];
1067
+ end
1068
+ endcase
1069
+
1070
+ assign REN_A1_i = PORT_A_REN_i;
1071
+ assign WEN_A1_i = PORT_A_WEN_i;
1072
+ assign {BE_A2_i, BE_A1_i} = PORT_A_WR_BE;
1073
+
1074
+ assign REN_B1_i = PORT_B_REN_i;
1075
+ assign WEN_B1_i = PORT_B_WEN_i;
1076
+ assign {BE_B2_i, BE_B1_i} = PORT_B_WR_BE;
1077
+
1078
+ generate
1079
+ if (PORT_A_DWIDTH == 36) begin
1080
+ assign PORT_A_WDATA[PORT_A_DWIDTH-1:0] = PORT_A_WR_DATA_i[PORT_A_DWIDTH-1:0];
1081
+ end else if (PORT_A_DWIDTH > 18 && PORT_A_DWIDTH < 36) begin
1082
+ assign PORT_A_WDATA[PORT_A_DWIDTH+1:18] = PORT_A_WR_DATA_i[PORT_A_DWIDTH-1:16];
1083
+ assign PORT_A_WDATA[17:0] = {2'b00,PORT_A_WR_DATA_i[15:0]};
1084
+ end else if (PORT_A_DWIDTH == 9) begin
1085
+ assign PORT_A_WDATA = {19'h0, PORT_A_WR_DATA_i[8], 8'h0, PORT_A_WR_DATA_i[7:0]};
1086
+ end else begin
1087
+ assign PORT_A_WDATA[35:PORT_A_DWIDTH] = 0;
1088
+ assign PORT_A_WDATA[PORT_A_DWIDTH-1:0] = PORT_A_WR_DATA_i[PORT_A_DWIDTH-1:0];
1089
+ end
1090
+ endgenerate
1091
+
1092
+ assign WDATA_A1_i = PORT_A_WDATA[17:0];
1093
+ assign WDATA_A2_i = PORT_A_WDATA[35:18];
1094
+
1095
+ generate
1096
+ if (PORT_A_DWIDTH == 36) begin
1097
+ assign PORT_A_RDATA = {RDATA_A2_o, RDATA_A1_o};
1098
+ end else if (PORT_A_DWIDTH > 18 && PORT_A_DWIDTH < 36) begin
1099
+ assign PORT_A_RDATA = {2'b00,RDATA_A2_o[17:0],RDATA_A1_o[15:0]};
1100
+ end else if (PORT_A_DWIDTH == 9) begin
1101
+ assign PORT_A_RDATA = { 27'h0, RDATA_A1_o[16], RDATA_A1_o[7:0]};
1102
+ end else begin
1103
+ assign PORT_A_RDATA = {18'h0, RDATA_A1_o};
1104
+ end
1105
+ endgenerate
1106
+
1107
+ assign PORT_A_RD_DATA_o = PORT_A_RDATA[PORT_A_DWIDTH-1:0];
1108
+
1109
+ generate
1110
+ if (PORT_B_DWIDTH == 36) begin
1111
+ assign PORT_B_WDATA[PORT_B_DWIDTH-1:0] = PORT_B_WR_DATA_i[PORT_B_DWIDTH-1:0];
1112
+ end else if (PORT_B_DWIDTH > 18 && PORT_B_DWIDTH < 36) begin
1113
+ assign PORT_B_WDATA[PORT_B_DWIDTH+1:18] = PORT_B_WR_DATA_i[PORT_B_DWIDTH-1:16];
1114
+ assign PORT_B_WDATA[17:0] = {2'b00,PORT_B_WR_DATA_i[15:0]};
1115
+ end else if (PORT_B_DWIDTH == 9) begin
1116
+ assign PORT_B_WDATA = {19'h0, PORT_B_WR_DATA_i[8], 8'h0, PORT_B_WR_DATA_i[7:0]};
1117
+ end else begin
1118
+ assign PORT_B_WDATA[35:PORT_B_DWIDTH] = 0;
1119
+ assign PORT_B_WDATA[PORT_B_DWIDTH-1:0] = PORT_B_WR_DATA_i[PORT_B_DWIDTH-1:0];
1120
+ end
1121
+ endgenerate
1122
+
1123
+ assign WDATA_B1_i = PORT_B_WDATA[17:0];
1124
+ assign WDATA_B2_i = PORT_B_WDATA[35:18];
1125
+
1126
+ generate
1127
+ if (PORT_B_DWIDTH == 36) begin
1128
+ assign PORT_B_RDATA = {RDATA_B2_o, RDATA_B1_o};
1129
+ end else if (PORT_B_DWIDTH > 18 && PORT_B_DWIDTH < 36) begin
1130
+ assign PORT_B_RDATA = {2'b00,RDATA_B2_o[17:0],RDATA_B1_o[15:0]};
1131
+ end else if (PORT_B_DWIDTH == 9) begin
1132
+ assign PORT_B_RDATA = { 27'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
1133
+ end else begin
1134
+ assign PORT_B_RDATA = {18'h0, RDATA_B1_o};
1135
+ end
1136
+ endgenerate
1137
+
1138
+ assign PORT_B_RD_DATA_o = PORT_B_RDATA[PORT_B_DWIDTH-1:0];
1139
+
1140
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
1141
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
1142
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
1143
+ };
1144
+
1145
+ (* is_inferred = 0 *)
1146
+ (* is_split = 0 *)
1147
+ (* is_fifo = 0 *)
1148
+ (* port_a_dwidth = PORT_A_WRWIDTH *)
1149
+ (* port_b_dwidth = PORT_B_WRWIDTH *)
1150
+ TDP36K _TECHMAP_REPLACE_ (
1151
+ .RESET_ni(1'b1),
1152
+
1153
+ .CLK_A1_i(PORT_A_CLK),
1154
+ .ADDR_A1_i(PORT_A_ADDR),
1155
+ .WEN_A1_i(WEN_A1_i),
1156
+ .BE_A1_i(BE_A1_i),
1157
+ .WDATA_A1_i(WDATA_A1_i),
1158
+ .REN_A1_i(REN_A1_i),
1159
+ .RDATA_A1_o(RDATA_A1_o),
1160
+
1161
+ .CLK_A2_i(PORT_A_CLK),
1162
+ .ADDR_A2_i(PORT_A_ADDR[13:0]),
1163
+ .WEN_A2_i(WEN_A1_i),
1164
+ .BE_A2_i(BE_A2_i),
1165
+ .WDATA_A2_i(WDATA_A2_i),
1166
+ .REN_A2_i(REN_A1_i),
1167
+ .RDATA_A2_o(RDATA_A2_o),
1168
+
1169
+ .CLK_B1_i(PORT_B_CLK),
1170
+ .ADDR_B1_i(PORT_B_ADDR),
1171
+ .WEN_B1_i(WEN_B1_i),
1172
+ .BE_B1_i(BE_B1_i),
1173
+ .WDATA_B1_i(WDATA_B1_i),
1174
+ .REN_B1_i(REN_B1_i),
1175
+ .RDATA_B1_o(RDATA_B1_o),
1176
+
1177
+ .CLK_B2_i(PORT_B_CLK),
1178
+ .ADDR_B2_i(PORT_B_ADDR[13:0]),
1179
+ .WEN_B2_i(WEN_B1_i),
1180
+ .BE_B2_i(BE_B2_i),
1181
+ .WDATA_B2_i(WDATA_B2_i),
1182
+ .REN_B2_i(REN_B1_i),
1183
+ .RDATA_B2_o(RDATA_B2_o),
1184
+
1185
+ .FLUSH1_i(1'b0),
1186
+ .FLUSH2_i(1'b0)
1187
+ );
1188
+
1189
+ endmodule
1190
+
1191
+ module DPRAM_18K_BLK (
1192
+ PORT_A_CLK_i,
1193
+ PORT_A_WEN_i,
1194
+ PORT_A_WR_BE_i,
1195
+ PORT_A_REN_i,
1196
+ PORT_A_ADDR_i,
1197
+ PORT_A_WR_DATA_i,
1198
+ PORT_A_RD_DATA_o,
1199
+
1200
+ PORT_B_CLK_i,
1201
+ PORT_B_WEN_i,
1202
+ PORT_B_WR_BE_i,
1203
+ PORT_B_REN_i,
1204
+ PORT_B_ADDR_i,
1205
+ PORT_B_WR_DATA_i,
1206
+ PORT_B_RD_DATA_o
1207
+ );
1208
+
1209
+ parameter PORT_A_AWIDTH = 10;
1210
+ parameter PORT_A_DWIDTH = 36;
1211
+ parameter PORT_A_WR_BE_WIDTH = 4;
1212
+
1213
+ parameter PORT_B_AWIDTH = 10;
1214
+ parameter PORT_B_DWIDTH = 36;
1215
+ parameter PORT_B_WR_BE_WIDTH = 4;
1216
+
1217
+ input PORT_A_CLK_i;
1218
+ input [PORT_A_AWIDTH-1:0] PORT_A_ADDR_i;
1219
+ input [PORT_A_DWIDTH-1:0] PORT_A_WR_DATA_i;
1220
+ input PORT_A_WEN_i;
1221
+ input [PORT_A_WR_BE_WIDTH-1:0] PORT_A_WR_BE_i;
1222
+ input PORT_A_REN_i;
1223
+ output [PORT_A_DWIDTH-1:0] PORT_A_RD_DATA_o;
1224
+
1225
+ input PORT_B_CLK_i;
1226
+ input [PORT_B_AWIDTH-1:0] PORT_B_ADDR_i;
1227
+ input [PORT_B_DWIDTH-1:0] PORT_B_WR_DATA_i;
1228
+ input PORT_B_WEN_i;
1229
+ input [PORT_B_WR_BE_WIDTH-1:0] PORT_B_WR_BE_i;
1230
+ input PORT_B_REN_i;
1231
+ output [PORT_B_DWIDTH-1:0] PORT_B_RD_DATA_o;
1232
+
1233
+
1234
+ (* is_inferred = 0 *)
1235
+ (* is_split = 0 *)
1236
+ (* is_fifo = 0 *)
1237
+ BRAM2x18_dP #(
1238
+ .PORT_A1_AWIDTH(PORT_A_AWIDTH),
1239
+ .PORT_A1_DWIDTH(PORT_A_DWIDTH),
1240
+ .PORT_A1_WR_BE_WIDTH(PORT_A_WR_BE_WIDTH),
1241
+ .PORT_B1_AWIDTH(PORT_B_AWIDTH),
1242
+ .PORT_B1_DWIDTH(PORT_B_DWIDTH),
1243
+ .PORT_B1_WR_BE_WIDTH(PORT_B_WR_BE_WIDTH),
1244
+ .PORT_A2_AWIDTH(),
1245
+ .PORT_A2_DWIDTH(),
1246
+ .PORT_A2_WR_BE_WIDTH(),
1247
+ .PORT_B2_AWIDTH(),
1248
+ .PORT_B2_DWIDTH(),
1249
+ .PORT_B2_WR_BE_WIDTH()
1250
+ ) U1 (
1251
+ .PORT_A1_CLK_i(PORT_A_CLK_i),
1252
+ .PORT_A1_WEN_i(PORT_A_WEN_i),
1253
+ .PORT_A1_WR_BE_i(PORT_A_WR_BE_i),
1254
+ .PORT_A1_REN_i(PORT_A_REN_i),
1255
+ .PORT_A1_ADDR_i(PORT_A_ADDR_i),
1256
+ .PORT_A1_WR_DATA_i(PORT_A_WR_DATA_i),
1257
+ .PORT_A1_RD_DATA_o(PORT_A_RD_DATA_o),
1258
+
1259
+ .PORT_B1_CLK_i(PORT_B_CLK_i),
1260
+ .PORT_B1_WEN_i(PORT_B_WEN_i),
1261
+ .PORT_B1_WR_BE_i(PORT_B_WR_BE_i),
1262
+ .PORT_B1_REN_i(PORT_B_REN_i),
1263
+ .PORT_B1_ADDR_i(PORT_B_ADDR_i),
1264
+ .PORT_B1_WR_DATA_i(PORT_B_WR_DATA_i),
1265
+ .PORT_B1_RD_DATA_o(PORT_B_RD_DATA_o),
1266
+
1267
+ .PORT_A2_CLK_i(1'b0),
1268
+ .PORT_A2_WEN_i(1'b0),
1269
+ .PORT_A2_WR_BE_i(2'b00),
1270
+ .PORT_A2_REN_i(1'b0),
1271
+ .PORT_A2_ADDR_i(14'h0),
1272
+ .PORT_A2_WR_DATA_i(18'h0),
1273
+ .PORT_A2_RD_DATA_o(),
1274
+
1275
+ .PORT_B2_CLK_i(1'b0),
1276
+ .PORT_B2_WEN_i(1'b0),
1277
+ .PORT_B2_WR_BE_i(2'b00),
1278
+ .PORT_B2_REN_i(1'b0),
1279
+ .PORT_B2_ADDR_i(14'h0),
1280
+ .PORT_B2_WR_DATA_i(18'h0),
1281
+ .PORT_B2_RD_DATA_o()
1282
+ );
1283
+
1284
+ endmodule
1285
+
1286
+
1287
+ module DPRAM_18K_X2_BLK (
1288
+ PORT_A1_CLK_i,
1289
+ PORT_A1_WEN_i,
1290
+ PORT_A1_WR_BE_i,
1291
+ PORT_A1_REN_i,
1292
+ PORT_A1_ADDR_i,
1293
+ PORT_A1_WR_DATA_i,
1294
+ PORT_A1_RD_DATA_o,
1295
+
1296
+ PORT_B1_CLK_i,
1297
+ PORT_B1_WEN_i,
1298
+ PORT_B1_WR_BE_i,
1299
+ PORT_B1_REN_i,
1300
+ PORT_B1_ADDR_i,
1301
+ PORT_B1_WR_DATA_i,
1302
+ PORT_B1_RD_DATA_o,
1303
+
1304
+ PORT_A2_CLK_i,
1305
+ PORT_A2_WEN_i,
1306
+ PORT_A2_WR_BE_i,
1307
+ PORT_A2_REN_i,
1308
+ PORT_A2_ADDR_i,
1309
+ PORT_A2_WR_DATA_i,
1310
+ PORT_A2_RD_DATA_o,
1311
+
1312
+ PORT_B2_CLK_i,
1313
+ PORT_B2_WEN_i,
1314
+ PORT_B2_WR_BE_i,
1315
+ PORT_B2_REN_i,
1316
+ PORT_B2_ADDR_i,
1317
+ PORT_B2_WR_DATA_i,
1318
+ PORT_B2_RD_DATA_o
1319
+ );
1320
+
1321
+ parameter PORT_A1_AWIDTH = 10;
1322
+ parameter PORT_A1_DWIDTH = 18;
1323
+ parameter PORT_A1_WR_BE_WIDTH = 2;
1324
+
1325
+ parameter PORT_B1_AWIDTH = 10;
1326
+ parameter PORT_B1_DWIDTH = 18;
1327
+ parameter PORT_B1_WR_BE_WIDTH = 2;
1328
+
1329
+ parameter PORT_A2_AWIDTH = 10;
1330
+ parameter PORT_A2_DWIDTH = 18;
1331
+ parameter PORT_A2_WR_BE_WIDTH = 2;
1332
+
1333
+ parameter PORT_B2_AWIDTH = 10;
1334
+ parameter PORT_B2_DWIDTH = 18;
1335
+ parameter PORT_B2_WR_BE_WIDTH = 2;
1336
+
1337
+
1338
+ input PORT_A1_CLK_i;
1339
+ input [PORT_A1_AWIDTH-1:0] PORT_A1_ADDR_i;
1340
+ input [PORT_A1_DWIDTH-1:0] PORT_A1_WR_DATA_i;
1341
+ input PORT_A1_WEN_i;
1342
+ input [PORT_A1_WR_BE_WIDTH-1:0] PORT_A1_WR_BE_i;
1343
+ input PORT_A1_REN_i;
1344
+ output [PORT_A1_DWIDTH-1:0] PORT_A1_RD_DATA_o;
1345
+
1346
+ input PORT_B1_CLK_i;
1347
+ input [PORT_B1_AWIDTH-1:0] PORT_B1_ADDR_i;
1348
+ input [PORT_B1_DWIDTH-1:0] PORT_B1_WR_DATA_i;
1349
+ input PORT_B1_WEN_i;
1350
+ input [PORT_B1_WR_BE_WIDTH-1:0] PORT_B1_WR_BE_i;
1351
+ input PORT_B1_REN_i;
1352
+ output [PORT_B1_DWIDTH-1:0] PORT_B1_RD_DATA_o;
1353
+
1354
+ input PORT_A2_CLK_i;
1355
+ input [PORT_A2_AWIDTH-1:0] PORT_A2_ADDR_i;
1356
+ input [PORT_A2_DWIDTH-1:0] PORT_A2_WR_DATA_i;
1357
+ input PORT_A2_WEN_i;
1358
+ input [PORT_A2_WR_BE_WIDTH-1:0] PORT_A2_WR_BE_i;
1359
+ input PORT_A2_REN_i;
1360
+ output [PORT_A2_DWIDTH-1:0] PORT_A2_RD_DATA_o;
1361
+
1362
+ input PORT_B2_CLK_i;
1363
+ input [PORT_B2_AWIDTH-1:0] PORT_B2_ADDR_i;
1364
+ input [PORT_B2_DWIDTH-1:0] PORT_B2_WR_DATA_i;
1365
+ input PORT_B2_WEN_i;
1366
+ input [PORT_B2_WR_BE_WIDTH-1:0] PORT_B2_WR_BE_i;
1367
+ input PORT_B2_REN_i;
1368
+ output [PORT_B2_DWIDTH-1:0] PORT_B2_RD_DATA_o;
1369
+
1370
+
1371
+ // Fixed mode settings
1372
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
1373
+ localparam [ 0:0] FMODE1_i = 1'd0;
1374
+ localparam [ 0:0] POWERDN1_i = 1'd0;
1375
+ localparam [ 0:0] SLEEP1_i = 1'd0;
1376
+ localparam [ 0:0] PROTECT1_i = 1'd0;
1377
+ localparam [11:0] UPAE1_i = 12'd10;
1378
+ localparam [11:0] UPAF1_i = 12'd10;
1379
+
1380
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
1381
+ localparam [ 0:0] FMODE2_i = 1'd0;
1382
+ localparam [ 0:0] POWERDN2_i = 1'd0;
1383
+ localparam [ 0:0] SLEEP2_i = 1'd0;
1384
+ localparam [ 0:0] PROTECT2_i = 1'd0;
1385
+ localparam [10:0] UPAE2_i = 11'd10;
1386
+ localparam [10:0] UPAF2_i = 11'd10;
1387
+
1388
+ // Width mode function
1389
+ function [2:0] mode;
1390
+ input integer width;
1391
+ case (width)
1392
+ 1: mode = 3'b101;
1393
+ 2: mode = 3'b110;
1394
+ 4: mode = 3'b100;
1395
+ 8,9: mode = 3'b001;
1396
+ 16, 18: mode = 3'b010;
1397
+ 32, 36: mode = 3'b011;
1398
+ default: mode = 3'b000;
1399
+ endcase
1400
+ endfunction
1401
+
1402
+ function integer rwmode;
1403
+ input integer rwwidth;
1404
+ case (rwwidth)
1405
+ 1: rwmode = 1;
1406
+ 2: rwmode = 2;
1407
+ 4: rwmode = 4;
1408
+ 8,9: rwmode = 9;
1409
+ 16, 18: rwmode = 18;
1410
+ default: rwmode = 18;
1411
+ endcase
1412
+ endfunction
1413
+
1414
+ wire REN_A1_i;
1415
+ wire REN_A2_i;
1416
+
1417
+ wire REN_B1_i;
1418
+ wire REN_B2_i;
1419
+
1420
+ wire WEN_A1_i;
1421
+ wire WEN_A2_i;
1422
+
1423
+ wire WEN_B1_i;
1424
+ wire WEN_B2_i;
1425
+
1426
+ wire [1:0] BE_A1_i;
1427
+ wire [1:0] BE_A2_i;
1428
+
1429
+ wire [1:0] BE_B1_i;
1430
+ wire [1:0] BE_B2_i;
1431
+
1432
+ wire [14:0] ADDR_A1_i;
1433
+ wire [13:0] ADDR_A2_i;
1434
+
1435
+ wire [14:0] ADDR_B1_i;
1436
+ wire [13:0] ADDR_B2_i;
1437
+
1438
+ wire [17:0] WDATA_A1_i;
1439
+ wire [17:0] WDATA_A2_i;
1440
+
1441
+ wire [17:0] WDATA_B1_i;
1442
+ wire [17:0] WDATA_B2_i;
1443
+
1444
+ wire [17:0] RDATA_A1_o;
1445
+ wire [17:0] RDATA_A2_o;
1446
+
1447
+ wire [17:0] RDATA_B1_o;
1448
+ wire [17:0] RDATA_B2_o;
1449
+
1450
+ wire [1:0] PORT_A1_WR_BE;
1451
+ wire [1:0] PORT_B1_WR_BE;
1452
+
1453
+ wire [1:0] PORT_A2_WR_BE;
1454
+ wire [1:0] PORT_B2_WR_BE;
1455
+
1456
+ wire [17:0] PORT_B1_WDATA;
1457
+ wire [17:0] PORT_B1_RDATA;
1458
+ wire [17:0] PORT_A1_WDATA;
1459
+ wire [17:0] PORT_A1_RDATA;
1460
+
1461
+ wire [17:0] PORT_B2_WDATA;
1462
+ wire [17:0] PORT_B2_RDATA;
1463
+ wire [17:0] PORT_A2_WDATA;
1464
+ wire [17:0] PORT_A2_RDATA;
1465
+
1466
+ wire [13:0] PORT_A1_ADDR_INT;
1467
+ wire [13:0] PORT_B1_ADDR_INT;
1468
+
1469
+ wire [13:0] PORT_A2_ADDR_INT;
1470
+ wire [13:0] PORT_B2_ADDR_INT;
1471
+
1472
+ wire [13:0] PORT_A1_ADDR;
1473
+ wire [13:0] PORT_B1_ADDR;
1474
+
1475
+ wire [13:0] PORT_A2_ADDR;
1476
+ wire [13:0] PORT_B2_ADDR;
1477
+
1478
+ wire PORT_A1_CLK;
1479
+ wire PORT_B1_CLK;
1480
+
1481
+ wire PORT_A2_CLK;
1482
+ wire PORT_B2_CLK;
1483
+
1484
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
1485
+ localparam [ 2:0] RMODE_A1_i = mode(PORT_A1_DWIDTH);
1486
+ localparam [ 2:0] WMODE_A1_i = mode(PORT_A1_DWIDTH);
1487
+ localparam [ 2:0] RMODE_A2_i = mode(PORT_A2_DWIDTH);
1488
+ localparam [ 2:0] WMODE_A2_i = mode(PORT_A2_DWIDTH);
1489
+
1490
+ localparam [ 2:0] RMODE_B1_i = mode(PORT_B1_DWIDTH);
1491
+ localparam [ 2:0] WMODE_B1_i = mode(PORT_B1_DWIDTH);
1492
+ localparam [ 2:0] RMODE_B2_i = mode(PORT_B2_DWIDTH);
1493
+ localparam [ 2:0] WMODE_B2_i = mode(PORT_B2_DWIDTH);
1494
+
1495
+ localparam PORT_A1_WRWIDTH = rwmode(PORT_A1_DWIDTH);
1496
+ localparam PORT_B1_WRWIDTH = rwmode(PORT_B1_DWIDTH);
1497
+ localparam PORT_A2_WRWIDTH = rwmode(PORT_A2_DWIDTH);
1498
+ localparam PORT_B2_WRWIDTH = rwmode(PORT_B2_DWIDTH);
1499
+
1500
+ assign PORT_A1_CLK = PORT_A1_CLK_i;
1501
+ assign PORT_B1_CLK = PORT_B1_CLK_i;
1502
+
1503
+ assign PORT_A2_CLK = PORT_A2_CLK_i;
1504
+ assign PORT_B2_CLK = PORT_B2_CLK_i;
1505
+
1506
+ generate
1507
+ if (PORT_A1_AWIDTH == 14) begin
1508
+ assign PORT_A1_ADDR_INT = PORT_A1_ADDR_i;
1509
+ end else begin
1510
+ assign PORT_A1_ADDR_INT[13:PORT_A1_AWIDTH] = 0;
1511
+ assign PORT_A1_ADDR_INT[PORT_A1_AWIDTH-1:0] = PORT_A1_ADDR_i;
1512
+ end
1513
+ endgenerate
1514
+
1515
+ case (PORT_A1_DWIDTH)
1516
+ 1: begin
1517
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT;
1518
+ end
1519
+ 2: begin
1520
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 1;
1521
+ end
1522
+ 4: begin
1523
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 2;
1524
+ end
1525
+ 8, 9: begin
1526
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 3;
1527
+ end
1528
+ 16, 18: begin
1529
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 4;
1530
+ end
1531
+ default: begin
1532
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT;
1533
+ end
1534
+ endcase
1535
+
1536
+ generate
1537
+ if (PORT_B1_AWIDTH == 14) begin
1538
+ assign PORT_B1_ADDR_INT = PORT_B1_ADDR_i;
1539
+ end else begin
1540
+ assign PORT_B1_ADDR_INT[13:PORT_B1_AWIDTH] = 0;
1541
+ assign PORT_B1_ADDR_INT[PORT_B1_AWIDTH-1:0] = PORT_B1_ADDR_i;
1542
+ end
1543
+ endgenerate
1544
+
1545
+ case (PORT_B1_DWIDTH)
1546
+ 1: begin
1547
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT;
1548
+ end
1549
+ 2: begin
1550
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 1;
1551
+ end
1552
+ 4: begin
1553
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 2;
1554
+ end
1555
+ 8, 9: begin
1556
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 3;
1557
+ end
1558
+ 16, 18: begin
1559
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 4;
1560
+ end
1561
+ default: begin
1562
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT;
1563
+ end
1564
+ endcase
1565
+
1566
+ generate
1567
+ if (PORT_A2_AWIDTH == 14) begin
1568
+ assign PORT_A2_ADDR_INT = PORT_A2_ADDR_i;
1569
+ end else begin
1570
+ assign PORT_A2_ADDR_INT[13:PORT_A2_AWIDTH] = 0;
1571
+ assign PORT_A2_ADDR_INT[PORT_A2_AWIDTH-1:0] = PORT_A2_ADDR_i;
1572
+ end
1573
+ endgenerate
1574
+
1575
+ case (PORT_A2_DWIDTH)
1576
+ 1: begin
1577
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT;
1578
+ end
1579
+ 2: begin
1580
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 1;
1581
+ end
1582
+ 4: begin
1583
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 2;
1584
+ end
1585
+ 8, 9: begin
1586
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 3;
1587
+ end
1588
+ 16, 18: begin
1589
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 4;
1590
+ end
1591
+ default: begin
1592
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT;
1593
+ end
1594
+ endcase
1595
+
1596
+ generate
1597
+ if (PORT_B2_AWIDTH == 14) begin
1598
+ assign PORT_B2_ADDR_INT = PORT_B2_ADDR_i;
1599
+ end else begin
1600
+ assign PORT_B2_ADDR_INT[13:PORT_B2_AWIDTH] = 0;
1601
+ assign PORT_B2_ADDR_INT[PORT_B2_AWIDTH-1:0] = PORT_B2_ADDR_i;
1602
+ end
1603
+ endgenerate
1604
+
1605
+ case (PORT_B2_DWIDTH)
1606
+ 1: begin
1607
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT;
1608
+ end
1609
+ 2: begin
1610
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 1;
1611
+ end
1612
+ 4: begin
1613
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 2;
1614
+ end
1615
+ 8, 9: begin
1616
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 3;
1617
+ end
1618
+ 16, 18: begin
1619
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 4;
1620
+ end
1621
+ default: begin
1622
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT;
1623
+ end
1624
+ endcase
1625
+
1626
+ case (PORT_A1_WR_BE_WIDTH)
1627
+ 2: begin
1628
+ assign PORT_A1_WR_BE = PORT_A1_WR_BE_i[PORT_A1_WR_BE_WIDTH-1 :0];
1629
+ end
1630
+ default: begin
1631
+ assign PORT_A1_WR_BE[1:PORT_A1_WR_BE_WIDTH] = 0;
1632
+ assign PORT_A1_WR_BE[PORT_A1_WR_BE_WIDTH-1 :0] = PORT_A1_WR_BE_i[PORT_A1_WR_BE_WIDTH-1 :0];
1633
+ end
1634
+ endcase
1635
+
1636
+ case (PORT_B1_WR_BE_WIDTH)
1637
+ 2: begin
1638
+ assign PORT_B1_WR_BE = PORT_B1_WR_BE_i[PORT_B1_WR_BE_WIDTH-1 :0];
1639
+ end
1640
+ default: begin
1641
+ assign PORT_B1_WR_BE[1:PORT_B1_WR_BE_WIDTH] = 0;
1642
+ assign PORT_B1_WR_BE[PORT_B1_WR_BE_WIDTH-1 :0] = PORT_B1_WR_BE_i[PORT_B1_WR_BE_WIDTH-1 :0];
1643
+ end
1644
+ endcase
1645
+
1646
+ case (PORT_A2_WR_BE_WIDTH)
1647
+ 2: begin
1648
+ assign PORT_A2_WR_BE = PORT_A2_WR_BE_i[PORT_A2_WR_BE_WIDTH-1 :0];
1649
+ end
1650
+ default: begin
1651
+ assign PORT_A2_WR_BE[1:PORT_A2_WR_BE_WIDTH] = 0;
1652
+ assign PORT_A2_WR_BE[PORT_A2_WR_BE_WIDTH-1 :0] = PORT_A2_WR_BE_i[PORT_A2_WR_BE_WIDTH-1 :0];
1653
+ end
1654
+ endcase
1655
+
1656
+ case (PORT_B2_WR_BE_WIDTH)
1657
+ 2: begin
1658
+ assign PORT_B2_WR_BE = PORT_B2_WR_BE_i[PORT_B2_WR_BE_WIDTH-1 :0];
1659
+ end
1660
+ default: begin
1661
+ assign PORT_B2_WR_BE[1:PORT_B2_WR_BE_WIDTH] = 0;
1662
+ assign PORT_B2_WR_BE[PORT_B2_WR_BE_WIDTH-1 :0] = PORT_B2_WR_BE_i[PORT_B2_WR_BE_WIDTH-1 :0];
1663
+ end
1664
+ endcase
1665
+
1666
+ assign REN_A1_i = PORT_A1_REN_i;
1667
+ assign WEN_A1_i = PORT_A1_WEN_i;
1668
+ assign BE_A1_i = PORT_A1_WR_BE;
1669
+
1670
+ assign REN_A2_i = PORT_A2_REN_i;
1671
+ assign WEN_A2_i = PORT_A2_WEN_i;
1672
+ assign BE_A2_i = PORT_A2_WR_BE;
1673
+
1674
+ assign REN_B1_i = PORT_B1_REN_i;
1675
+ assign WEN_B1_i = PORT_B1_WEN_i;
1676
+ assign BE_B1_i = PORT_B1_WR_BE;
1677
+
1678
+ assign REN_B2_i = PORT_B2_REN_i;
1679
+ assign WEN_B2_i = PORT_B2_WEN_i;
1680
+ assign BE_B2_i = PORT_B2_WR_BE;
1681
+
1682
+ generate
1683
+ if (PORT_A1_DWIDTH == 18) begin
1684
+ assign PORT_A1_WDATA[PORT_A1_DWIDTH-1:0] = PORT_A1_WR_DATA_i[PORT_A1_DWIDTH-1:0];
1685
+ end else if (PORT_A1_DWIDTH == 9) begin
1686
+ assign PORT_A1_WDATA = {1'b0, PORT_A1_WR_DATA_i[8], 8'h0, PORT_A1_WR_DATA_i[7:0]};
1687
+ end else begin
1688
+ assign PORT_A1_WDATA[17:PORT_A1_DWIDTH] = 0;
1689
+ assign PORT_A1_WDATA[PORT_A1_DWIDTH-1:0] = PORT_A1_WR_DATA_i[PORT_A1_DWIDTH-1:0];
1690
+ end
1691
+ endgenerate
1692
+
1693
+ assign WDATA_A1_i = PORT_A1_WDATA;
1694
+
1695
+ generate
1696
+ if (PORT_A2_DWIDTH == 18) begin
1697
+ assign PORT_A2_WDATA[PORT_A2_DWIDTH-1:0] = PORT_A2_WR_DATA_i[PORT_A2_DWIDTH-1:0];
1698
+ end else if (PORT_A2_DWIDTH == 9) begin
1699
+ assign PORT_A2_WDATA = {1'b0, PORT_A2_WR_DATA_i[8], 8'h0, PORT_A2_WR_DATA_i[7:0]};
1700
+ end else begin
1701
+ assign PORT_A2_WDATA[17:PORT_A2_DWIDTH] = 0;
1702
+ assign PORT_A2_WDATA[PORT_A2_DWIDTH-1:0] = PORT_A2_WR_DATA_i[PORT_A2_DWIDTH-1:0];
1703
+ end
1704
+ endgenerate
1705
+
1706
+ assign WDATA_A2_i = PORT_A2_WDATA;
1707
+
1708
+ generate
1709
+ if (PORT_A1_DWIDTH == 9) begin
1710
+ assign PORT_A1_RDATA = { 9'h0, RDATA_A1_o[16], RDATA_A1_o[7:0]};
1711
+ end else begin
1712
+ assign PORT_A1_RDATA = RDATA_A1_o;
1713
+ end
1714
+ endgenerate
1715
+
1716
+ assign PORT_A1_RD_DATA_o = PORT_A1_RDATA[PORT_A1_DWIDTH-1:0];
1717
+
1718
+ generate
1719
+ if (PORT_A2_DWIDTH == 9) begin
1720
+ assign PORT_A2_RDATA = { 9'h0, RDATA_A2_o[16], RDATA_A2_o[7:0]};
1721
+ end else begin
1722
+ assign PORT_A2_RDATA = RDATA_A2_o;
1723
+ end
1724
+ endgenerate
1725
+
1726
+ assign PORT_A2_RD_DATA_o = PORT_A2_RDATA[PORT_A2_DWIDTH-1:0];
1727
+
1728
+ generate
1729
+ if (PORT_B1_DWIDTH == 18) begin
1730
+ assign PORT_B1_WDATA[PORT_B1_DWIDTH-1:0] = PORT_B1_WR_DATA_i[PORT_B1_DWIDTH-1:0];
1731
+ end else if (PORT_B1_DWIDTH == 9) begin
1732
+ assign PORT_B1_WDATA = {1'b0, PORT_B1_WR_DATA_i[8], 8'h0, PORT_B1_WR_DATA_i[7:0]};
1733
+ end else begin
1734
+ assign PORT_B1_WDATA[17:PORT_B1_DWIDTH] = 0;
1735
+ assign PORT_B1_WDATA[PORT_B1_DWIDTH-1:0] = PORT_B1_WR_DATA_i[PORT_B1_DWIDTH-1:0];
1736
+ end
1737
+ endgenerate
1738
+
1739
+ assign WDATA_B1_i = PORT_B1_WDATA;
1740
+
1741
+ generate
1742
+ if (PORT_B2_DWIDTH == 18) begin
1743
+ assign PORT_B2_WDATA[PORT_B2_DWIDTH-1:0] = PORT_B2_WR_DATA_i[PORT_B2_DWIDTH-1:0];
1744
+ end else if (PORT_B2_DWIDTH == 9) begin
1745
+ assign PORT_B2_WDATA = {1'b0, PORT_B2_WR_DATA_i[8], 8'h0, PORT_B2_WR_DATA_i[7:0]};
1746
+ end else begin
1747
+ assign PORT_B2_WDATA[17:PORT_B2_DWIDTH] = 0;
1748
+ assign PORT_B2_WDATA[PORT_B2_DWIDTH-1:0] = PORT_B2_WR_DATA_i[PORT_B2_DWIDTH-1:0];
1749
+ end
1750
+ endgenerate
1751
+
1752
+ assign WDATA_B2_i = PORT_B2_WDATA;
1753
+
1754
+ generate
1755
+ if (PORT_B1_DWIDTH == 9) begin
1756
+ assign PORT_B1_RDATA = { 9'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
1757
+ end else begin
1758
+ assign PORT_B1_RDATA = RDATA_B1_o;
1759
+ end
1760
+ endgenerate
1761
+
1762
+ assign PORT_B1_RD_DATA_o = PORT_B1_RDATA[PORT_B1_DWIDTH-1:0];
1763
+
1764
+ generate
1765
+ if (PORT_B2_DWIDTH == 9) begin
1766
+ assign PORT_B2_RDATA = { 9'h0, RDATA_B2_o[16], RDATA_B2_o[7:0]};
1767
+ end else begin
1768
+ assign PORT_B2_RDATA = RDATA_B2_o;
1769
+ end
1770
+ endgenerate
1771
+
1772
+ assign PORT_B2_RD_DATA_o = PORT_B2_RDATA[PORT_B2_DWIDTH-1:0];
1773
+
1774
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
1775
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
1776
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
1777
+ };
1778
+
1779
+ (* is_inferred = 0 *)
1780
+ (* is_split = 1 *)
1781
+ (* is_fifo = 0 *)
1782
+ (* port_a1_dwidth = PORT_A1_WRWIDTH *)
1783
+ (* port_a2_dwidth = PORT_A2_WRWIDTH *)
1784
+ (* port_b1_dwidth = PORT_B1_WRWIDTH *)
1785
+ (* port_b2_dwidth = PORT_B2_WRWIDTH *)
1786
+ TDP36K _TECHMAP_REPLACE_ (
1787
+ .RESET_ni(1'b1),
1788
+
1789
+ .CLK_A1_i(PORT_A1_CLK),
1790
+ .ADDR_A1_i({1'b0,PORT_A1_ADDR}),
1791
+ .WEN_A1_i(WEN_A1_i),
1792
+ .BE_A1_i(BE_A1_i),
1793
+ .WDATA_A1_i(WDATA_A1_i),
1794
+ .REN_A1_i(REN_A1_i),
1795
+ .RDATA_A1_o(RDATA_A1_o),
1796
+
1797
+ .CLK_A2_i(PORT_A2_CLK),
1798
+ .ADDR_A2_i(PORT_A2_ADDR),
1799
+ .WEN_A2_i(WEN_A2_i),
1800
+ .BE_A2_i(BE_A2_i),
1801
+ .WDATA_A2_i(WDATA_A2_i),
1802
+ .REN_A2_i(REN_A2_i),
1803
+ .RDATA_A2_o(RDATA_A2_o),
1804
+
1805
+ .CLK_B1_i(PORT_B1_CLK),
1806
+ .ADDR_B1_i({1'b0,PORT_B1_ADDR}),
1807
+ .WEN_B1_i(WEN_B1_i),
1808
+ .BE_B1_i(BE_B1_i),
1809
+ .WDATA_B1_i(WDATA_B1_i),
1810
+ .REN_B1_i(REN_B1_i),
1811
+ .RDATA_B1_o(RDATA_B1_o),
1812
+
1813
+ .CLK_B2_i(PORT_B2_CLK),
1814
+ .ADDR_B2_i(PORT_B2_ADDR),
1815
+ .WEN_B2_i(WEN_B2_i),
1816
+ .BE_B2_i(BE_B2_i),
1817
+ .WDATA_B2_i(WDATA_B2_i),
1818
+ .REN_B2_i(REN_B2_i),
1819
+ .RDATA_B2_o(RDATA_B2_o),
1820
+
1821
+ .FLUSH1_i(1'b0),
1822
+ .FLUSH2_i(1'b0)
1823
+ );
1824
+
1825
+ endmodule
1826
+
1827
+ module SFIFO_36K_BLK (
1828
+ DIN,
1829
+ PUSH,
1830
+ POP,
1831
+ CLK,
1832
+ Async_Flush,
1833
+ Overrun_Error,
1834
+ Full_Watermark,
1835
+ Almost_Full,
1836
+ Full,
1837
+ Underrun_Error,
1838
+ Empty_Watermark,
1839
+ Almost_Empty,
1840
+ Empty,
1841
+ DOUT
1842
+ );
1843
+
1844
+ parameter WR_DATA_WIDTH = 36;
1845
+ parameter RD_DATA_WIDTH = 36;
1846
+ parameter UPAE_DBITS = 12'd10;
1847
+ parameter UPAF_DBITS = 12'd10;
1848
+
1849
+ input wire CLK;
1850
+ input wire PUSH, POP;
1851
+ input wire [WR_DATA_WIDTH-1:0] DIN;
1852
+ input wire Async_Flush;
1853
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
1854
+ output wire Almost_Full, Almost_Empty;
1855
+ output wire Full, Empty;
1856
+ output wire Full_Watermark, Empty_Watermark;
1857
+ output wire Overrun_Error, Underrun_Error;
1858
+
1859
+ // Fixed mode settings
1860
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd1;
1861
+ localparam [ 0:0] FMODE1_i = 1'd1;
1862
+ localparam [ 0:0] POWERDN1_i = 1'd0;
1863
+ localparam [ 0:0] SLEEP1_i = 1'd0;
1864
+ localparam [ 0:0] PROTECT1_i = 1'd0;
1865
+ localparam [11:0] UPAE1_i = UPAE_DBITS;
1866
+ localparam [11:0] UPAF1_i = UPAF_DBITS;
1867
+
1868
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
1869
+ localparam [ 0:0] FMODE2_i = 1'd0;
1870
+ localparam [ 0:0] POWERDN2_i = 1'd0;
1871
+ localparam [ 0:0] SLEEP2_i = 1'd0;
1872
+ localparam [ 0:0] PROTECT2_i = 1'd0;
1873
+ localparam [10:0] UPAE2_i = 11'd10;
1874
+ localparam [10:0] UPAF2_i = 11'd10;
1875
+
1876
+ // Width mode function
1877
+ function [2:0] mode;
1878
+ input integer width;
1879
+ case (width)
1880
+ 1: mode = 3'b101;
1881
+ 2: mode = 3'b110;
1882
+ 4: mode = 3'b100;
1883
+ 8,9: mode = 3'b001;
1884
+ 16, 18: mode = 3'b010;
1885
+ 32, 36: mode = 3'b011;
1886
+ default: mode = 3'b000;
1887
+ endcase
1888
+ endfunction
1889
+
1890
+ function integer rwmode;
1891
+ input integer rwwidth;
1892
+ case (rwwidth)
1893
+ 1: rwmode = 1;
1894
+ 2: rwmode = 2;
1895
+ 4: rwmode = 4;
1896
+ 8,9: rwmode = 9;
1897
+ 16, 18: rwmode = 18;
1898
+ 32, 36: rwmode = 36;
1899
+ default: rwmode = 36;
1900
+ endcase
1901
+ endfunction
1902
+
1903
+ wire [35:0] in_reg;
1904
+ wire [35:0] out_reg;
1905
+ wire [17:0] fifo_flags;
1906
+
1907
+ wire [35:0] RD_DATA_INT;
1908
+
1909
+ wire Push_Clk, Pop_Clk;
1910
+
1911
+ assign Push_Clk = CLK;
1912
+ assign Pop_Clk = CLK;
1913
+
1914
+ assign Overrun_Error = fifo_flags[0];
1915
+ assign Full_Watermark = fifo_flags[1];
1916
+ assign Almost_Full = fifo_flags[2];
1917
+ assign Full = fifo_flags[3];
1918
+ assign Underrun_Error = fifo_flags[4];
1919
+ assign Empty_Watermark = fifo_flags[5];
1920
+ assign Almost_Empty = fifo_flags[6];
1921
+ assign Empty = fifo_flags[7];
1922
+
1923
+ localparam [ 2:0] RMODE_A1_i = mode(WR_DATA_WIDTH);
1924
+ localparam [ 2:0] WMODE_A1_i = mode(WR_DATA_WIDTH);
1925
+ localparam [ 2:0] RMODE_A2_i = mode(WR_DATA_WIDTH);
1926
+ localparam [ 2:0] WMODE_A2_i = mode(WR_DATA_WIDTH);
1927
+
1928
+ localparam [ 2:0] RMODE_B1_i = mode(RD_DATA_WIDTH);
1929
+ localparam [ 2:0] WMODE_B1_i = mode(RD_DATA_WIDTH);
1930
+ localparam [ 2:0] RMODE_B2_i = mode(RD_DATA_WIDTH);
1931
+ localparam [ 2:0] WMODE_B2_i = mode(RD_DATA_WIDTH);
1932
+
1933
+ localparam PORT_A_WRWIDTH = rwmode(WR_DATA_WIDTH);
1934
+ localparam PORT_B_WRWIDTH = rwmode(RD_DATA_WIDTH);
1935
+
1936
+ generate
1937
+ if (WR_DATA_WIDTH == 36) begin
1938
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
1939
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
1940
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
1941
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
1942
+ end else if (WR_DATA_WIDTH == 9) begin
1943
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
1944
+ end else begin
1945
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
1946
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
1947
+ end
1948
+ endgenerate
1949
+
1950
+ generate
1951
+ if (RD_DATA_WIDTH == 36) begin
1952
+ assign RD_DATA_INT = out_reg;
1953
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
1954
+ assign RD_DATA_INT = {2'b00,out_reg[35:18],out_reg[15:0]};
1955
+ end else if (RD_DATA_WIDTH == 9) begin
1956
+ assign RD_DATA_INT = { 27'h0, out_reg[16], out_reg[7:0]};
1957
+ end else begin
1958
+ assign RD_DATA_INT = {18'h0, out_reg[17:0]};
1959
+ end
1960
+ endgenerate
1961
+
1962
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_INT[RD_DATA_WIDTH-1 : 0];
1963
+
1964
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
1965
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
1966
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
1967
+ };
1968
+
1969
+ (* is_fifo = 1 *)
1970
+ (* sync_fifo = 1 *)
1971
+ (* is_inferred = 0 *)
1972
+ (* is_split = 0 *)
1973
+ (* port_a_dwidth = PORT_A_WRWIDTH *)
1974
+ (* port_b_dwidth = PORT_B_WRWIDTH *)
1975
+ TDP36K _TECHMAP_REPLACE_ (
1976
+ .RESET_ni(1'b1),
1977
+ .WDATA_A1_i(in_reg[17:0]),
1978
+ .WDATA_A2_i(in_reg[35:18]),
1979
+ .RDATA_A1_o(fifo_flags),
1980
+ .RDATA_A2_o(),
1981
+ .ADDR_A1_i(14'h0),
1982
+ .ADDR_A2_i(14'h0),
1983
+ .CLK_A1_i(Push_Clk),
1984
+ .CLK_A2_i(1'b0),
1985
+ .REN_A1_i(1'b1),
1986
+ .REN_A2_i(1'b0),
1987
+ .WEN_A1_i(PUSH),
1988
+ .WEN_A2_i(1'b0),
1989
+ .BE_A1_i(2'b11),
1990
+ .BE_A2_i(2'b11),
1991
+
1992
+ .WDATA_B1_i(18'h0),
1993
+ .WDATA_B2_i(18'h0),
1994
+ .RDATA_B1_o(out_reg[17:0]),
1995
+ .RDATA_B2_o(out_reg[35:18]),
1996
+ .ADDR_B1_i(14'h0),
1997
+ .ADDR_B2_i(14'h0),
1998
+ .CLK_B1_i(Pop_Clk),
1999
+ .CLK_B2_i(1'b0),
2000
+ .REN_B1_i(POP),
2001
+ .REN_B2_i(1'b0),
2002
+ .WEN_B1_i(1'b0),
2003
+ .WEN_B2_i(1'b0),
2004
+ .BE_B1_i(2'b11),
2005
+ .BE_B2_i(2'b11),
2006
+
2007
+ .FLUSH1_i(Async_Flush),
2008
+ .FLUSH2_i(1'b0)
2009
+ );
2010
+
2011
+
2012
+
2013
+ endmodule
2014
+
2015
+ module AFIFO_36K_BLK (
2016
+ DIN,
2017
+ PUSH,
2018
+ POP,
2019
+ Push_Clk,
2020
+ Pop_Clk,
2021
+ Async_Flush,
2022
+ Overrun_Error,
2023
+ Full_Watermark,
2024
+ Almost_Full,
2025
+ Full,
2026
+ Underrun_Error,
2027
+ Empty_Watermark,
2028
+ Almost_Empty,
2029
+ Empty,
2030
+ DOUT
2031
+ );
2032
+
2033
+ parameter WR_DATA_WIDTH = 36;
2034
+ parameter RD_DATA_WIDTH = 36;
2035
+ parameter UPAE_DBITS = 12'd10;
2036
+ parameter UPAF_DBITS = 12'd10;
2037
+
2038
+ input wire Push_Clk, Pop_Clk;
2039
+ input wire PUSH, POP;
2040
+ input wire [WR_DATA_WIDTH-1:0] DIN;
2041
+ input wire Async_Flush;
2042
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
2043
+ output wire Almost_Full, Almost_Empty;
2044
+ output wire Full, Empty;
2045
+ output wire Full_Watermark, Empty_Watermark;
2046
+ output wire Overrun_Error, Underrun_Error;
2047
+
2048
+ // Fixed mode settings
2049
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
2050
+ localparam [ 0:0] FMODE1_i = 1'd1;
2051
+ localparam [ 0:0] POWERDN1_i = 1'd0;
2052
+ localparam [ 0:0] SLEEP1_i = 1'd0;
2053
+ localparam [ 0:0] PROTECT1_i = 1'd0;
2054
+ localparam [11:0] UPAE1_i = UPAE_DBITS;
2055
+ localparam [11:0] UPAF1_i = UPAF_DBITS;
2056
+
2057
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
2058
+ localparam [ 0:0] FMODE2_i = 1'd0;
2059
+ localparam [ 0:0] POWERDN2_i = 1'd0;
2060
+ localparam [ 0:0] SLEEP2_i = 1'd0;
2061
+ localparam [ 0:0] PROTECT2_i = 1'd0;
2062
+ localparam [10:0] UPAE2_i = 11'd10;
2063
+ localparam [10:0] UPAF2_i = 11'd10;
2064
+
2065
+ // Width mode function
2066
+ function [2:0] mode;
2067
+ input integer width;
2068
+ case (width)
2069
+ 1: mode = 3'b101;
2070
+ 2: mode = 3'b110;
2071
+ 4: mode = 3'b100;
2072
+ 8,9: mode = 3'b001;
2073
+ 16, 18: mode = 3'b010;
2074
+ 32, 36: mode = 3'b011;
2075
+ default: mode = 3'b000;
2076
+ endcase
2077
+ endfunction
2078
+
2079
+ function integer rwmode;
2080
+ input integer rwwidth;
2081
+ case (rwwidth)
2082
+ 1: rwmode = 1;
2083
+ 2: rwmode = 2;
2084
+ 4: rwmode = 4;
2085
+ 8,9: rwmode = 9;
2086
+ 16, 18: rwmode = 18;
2087
+ 32, 36: rwmode = 36;
2088
+ default: rwmode = 36;
2089
+ endcase
2090
+ endfunction
2091
+
2092
+ wire [35:0] in_reg;
2093
+ wire [35:0] out_reg;
2094
+ wire [17:0] fifo_flags;
2095
+
2096
+ wire [35:0] RD_DATA_INT;
2097
+ wire [35:WR_DATA_WIDTH] WR_DATA_CMPL;
2098
+
2099
+ assign Overrun_Error = fifo_flags[0];
2100
+ assign Full_Watermark = fifo_flags[1];
2101
+ assign Almost_Full = fifo_flags[2];
2102
+ assign Full = fifo_flags[3];
2103
+ assign Underrun_Error = fifo_flags[4];
2104
+ assign Empty_Watermark = fifo_flags[5];
2105
+ assign Almost_Empty = fifo_flags[6];
2106
+ assign Empty = fifo_flags[7];
2107
+
2108
+ localparam [ 2:0] RMODE_A1_i = mode(WR_DATA_WIDTH);
2109
+ localparam [ 2:0] WMODE_A1_i = mode(WR_DATA_WIDTH);
2110
+ localparam [ 2:0] RMODE_A2_i = mode(WR_DATA_WIDTH);
2111
+ localparam [ 2:0] WMODE_A2_i = mode(WR_DATA_WIDTH);
2112
+
2113
+ localparam [ 2:0] RMODE_B1_i = mode(RD_DATA_WIDTH);
2114
+ localparam [ 2:0] WMODE_B1_i = mode(RD_DATA_WIDTH);
2115
+ localparam [ 2:0] RMODE_B2_i = mode(RD_DATA_WIDTH);
2116
+ localparam [ 2:0] WMODE_B2_i = mode(RD_DATA_WIDTH);
2117
+
2118
+ localparam PORT_A_WRWIDTH = rwmode(WR_DATA_WIDTH);
2119
+ localparam PORT_B_WRWIDTH = rwmode(RD_DATA_WIDTH);
2120
+
2121
+ generate
2122
+ if (WR_DATA_WIDTH == 36) begin
2123
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
2124
+ end else if (WR_DATA_WIDTH > 18 && WR_DATA_WIDTH < 36) begin
2125
+ assign in_reg[WR_DATA_WIDTH+1:18] = DIN[WR_DATA_WIDTH-1:16];
2126
+ assign in_reg[17:0] = {2'b00,DIN[15:0]};
2127
+ end else if (WR_DATA_WIDTH == 9) begin
2128
+ assign in_reg[35:0] = {19'h0, DIN[8], 8'h0, DIN[7:0]};
2129
+ end else begin
2130
+ assign in_reg[35:WR_DATA_WIDTH] = 0;
2131
+ assign in_reg[WR_DATA_WIDTH-1:0] = DIN[WR_DATA_WIDTH-1:0];
2132
+ end
2133
+ endgenerate
2134
+
2135
+ generate
2136
+ if (RD_DATA_WIDTH == 36) begin
2137
+ assign RD_DATA_INT = out_reg;
2138
+ end else if (RD_DATA_WIDTH > 18 && RD_DATA_WIDTH < 36) begin
2139
+ assign RD_DATA_INT = {2'b00,out_reg[35:18],out_reg[15:0]};
2140
+ end else if (RD_DATA_WIDTH == 9) begin
2141
+ assign RD_DATA_INT = { 27'h0, out_reg[16], out_reg[7:0]};
2142
+ end else begin
2143
+ assign RD_DATA_INT = {18'h0, out_reg[17:0]};
2144
+ end
2145
+ endgenerate
2146
+
2147
+ assign DOUT[RD_DATA_WIDTH-1 : 0] = RD_DATA_INT[RD_DATA_WIDTH-1 : 0];
2148
+
2149
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
2150
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
2151
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
2152
+ };
2153
+
2154
+ (* is_fifo = 1 *)
2155
+ (* sync_fifo = 0 *)
2156
+ (* is_inferred = 0 *)
2157
+ (* is_split = 0 *)
2158
+ (* port_a_dwidth = PORT_A_WRWIDTH *)
2159
+ (* port_b_dwidth = PORT_B_WRWIDTH *)
2160
+ TDP36K _TECHMAP_REPLACE_ (
2161
+ .RESET_ni(1'b1),
2162
+ .WDATA_A1_i(in_reg[17:0]),
2163
+ .WDATA_A2_i(in_reg[35:18]),
2164
+ .RDATA_A1_o(fifo_flags),
2165
+ .RDATA_A2_o(),
2166
+ .ADDR_A1_i(14'h0),
2167
+ .ADDR_A2_i(14'h0),
2168
+ .CLK_A1_i(Push_Clk),
2169
+ .CLK_A2_i(1'b0),
2170
+ .REN_A1_i(1'b1),
2171
+ .REN_A2_i(1'b0),
2172
+ .WEN_A1_i(PUSH),
2173
+ .WEN_A2_i(1'b0),
2174
+ .BE_A1_i(2'b11),
2175
+ .BE_A2_i(2'b11),
2176
+
2177
+ .WDATA_B1_i(18'h0),
2178
+ .WDATA_B2_i(18'h0),
2179
+ .RDATA_B1_o(out_reg[17:0]),
2180
+ .RDATA_B2_o(out_reg[35:18]),
2181
+ .ADDR_B1_i(14'h0),
2182
+ .ADDR_B2_i(14'h0),
2183
+ .CLK_B1_i(Pop_Clk),
2184
+ .CLK_B2_i(1'b0),
2185
+ .REN_B1_i(POP),
2186
+ .REN_B2_i(1'b0),
2187
+ .WEN_B1_i(1'b0),
2188
+ .WEN_B2_i(1'b0),
2189
+ .BE_B1_i(2'b11),
2190
+ .BE_B2_i(2'b11),
2191
+
2192
+ .FLUSH1_i(Async_Flush),
2193
+ .FLUSH2_i(1'b0)
2194
+ );
2195
+
2196
+
2197
+
2198
+ endmodule
2199
+
2200
+ module SFIFO_18K_BLK (
2201
+ DIN,
2202
+ PUSH,
2203
+ POP,
2204
+ CLK,
2205
+ Async_Flush,
2206
+ Overrun_Error,
2207
+ Full_Watermark,
2208
+ Almost_Full,
2209
+ Full,
2210
+ Underrun_Error,
2211
+ Empty_Watermark,
2212
+ Almost_Empty,
2213
+ Empty,
2214
+ DOUT
2215
+ );
2216
+
2217
+ parameter WR_DATA_WIDTH = 18;
2218
+ parameter RD_DATA_WIDTH = 18;
2219
+ parameter UPAE_DBITS = 11'd10;
2220
+ parameter UPAF_DBITS = 11'd10;
2221
+
2222
+ input wire CLK;
2223
+ input wire PUSH, POP;
2224
+ input wire [WR_DATA_WIDTH-1:0] DIN;
2225
+ input wire Async_Flush;
2226
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
2227
+ output wire Almost_Full, Almost_Empty;
2228
+ output wire Full, Empty;
2229
+ output wire Full_Watermark, Empty_Watermark;
2230
+ output wire Overrun_Error, Underrun_Error;
2231
+
2232
+ BRAM2x18_SFIFO #(
2233
+ .WR1_DATA_WIDTH(WR_DATA_WIDTH),
2234
+ .RD1_DATA_WIDTH(RD_DATA_WIDTH),
2235
+ .UPAE_DBITS1(UPAE_DBITS),
2236
+ .UPAF_DBITS1(UPAF_DBITS),
2237
+ .WR2_DATA_WIDTH(),
2238
+ .RD2_DATA_WIDTH(),
2239
+ .UPAE_DBITS2(),
2240
+ .UPAF_DBITS2()
2241
+ ) U1
2242
+ (
2243
+ .DIN1(DIN),
2244
+ .PUSH1(PUSH),
2245
+ .POP1(POP),
2246
+ .CLK1(CLK),
2247
+ .Async_Flush1(Async_Flush),
2248
+ .Overrun_Error1(Overrun_Error),
2249
+ .Full_Watermark1(Full_Watermark),
2250
+ .Almost_Full1(Almost_Full),
2251
+ .Full1(Full),
2252
+ .Underrun_Error1(Underrun_Error),
2253
+ .Empty_Watermark1(Empty_Watermark),
2254
+ .Almost_Empty1(Almost_Empty),
2255
+ .Empty1(Empty),
2256
+ .DOUT1(DOUT),
2257
+
2258
+ .DIN2(18'h0),
2259
+ .PUSH2(1'b0),
2260
+ .POP2(1'b0),
2261
+ .CLK2(1'b0),
2262
+ .Async_Flush2(1'b0),
2263
+ .Overrun_Error2(),
2264
+ .Full_Watermark2(),
2265
+ .Almost_Full2(),
2266
+ .Full2(),
2267
+ .Underrun_Error2(),
2268
+ .Empty_Watermark2(),
2269
+ .Almost_Empty2(),
2270
+ .Empty2(),
2271
+ .DOUT2()
2272
+ );
2273
+
2274
+ endmodule
2275
+
2276
+ module SFIFO_18K_X2_BLK (
2277
+ DIN1,
2278
+ PUSH1,
2279
+ POP1,
2280
+ CLK1,
2281
+ Async_Flush1,
2282
+ Overrun_Error1,
2283
+ Full_Watermark1,
2284
+ Almost_Full1,
2285
+ Full1,
2286
+ Underrun_Error1,
2287
+ Empty_Watermark1,
2288
+ Almost_Empty1,
2289
+ Empty1,
2290
+ DOUT1,
2291
+
2292
+ DIN2,
2293
+ PUSH2,
2294
+ POP2,
2295
+ CLK2,
2296
+ Async_Flush2,
2297
+ Overrun_Error2,
2298
+ Full_Watermark2,
2299
+ Almost_Full2,
2300
+ Full2,
2301
+ Underrun_Error2,
2302
+ Empty_Watermark2,
2303
+ Almost_Empty2,
2304
+ Empty2,
2305
+ DOUT2
2306
+ );
2307
+
2308
+ parameter WR1_DATA_WIDTH = 18;
2309
+ parameter RD1_DATA_WIDTH = 18;
2310
+
2311
+ parameter WR2_DATA_WIDTH = 18;
2312
+ parameter RD2_DATA_WIDTH = 18;
2313
+
2314
+ parameter UPAE_DBITS1 = 12'd10;
2315
+ parameter UPAF_DBITS1 = 12'd10;
2316
+
2317
+ parameter UPAE_DBITS2 = 11'd10;
2318
+ parameter UPAF_DBITS2 = 11'd10;
2319
+
2320
+ input CLK1;
2321
+ input PUSH1, POP1;
2322
+ input [WR1_DATA_WIDTH-1:0] DIN1;
2323
+ input Async_Flush1;
2324
+ output [RD1_DATA_WIDTH-1:0] DOUT1;
2325
+ output Almost_Full1, Almost_Empty1;
2326
+ output Full1, Empty1;
2327
+ output Full_Watermark1, Empty_Watermark1;
2328
+ output Overrun_Error1, Underrun_Error1;
2329
+
2330
+ input CLK2;
2331
+ input PUSH2, POP2;
2332
+ input [WR2_DATA_WIDTH-1:0] DIN2;
2333
+ input Async_Flush2;
2334
+ output [RD2_DATA_WIDTH-1:0] DOUT2;
2335
+ output Almost_Full2, Almost_Empty2;
2336
+ output Full2, Empty2;
2337
+ output Full_Watermark2, Empty_Watermark2;
2338
+ output Overrun_Error2, Underrun_Error2;
2339
+
2340
+ // Fixed mode settings
2341
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd1;
2342
+ localparam [ 0:0] FMODE1_i = 1'd1;
2343
+ localparam [ 0:0] POWERDN1_i = 1'd0;
2344
+ localparam [ 0:0] SLEEP1_i = 1'd0;
2345
+ localparam [ 0:0] PROTECT1_i = 1'd0;
2346
+ localparam [11:0] UPAE1_i = UPAE_DBITS1;
2347
+ localparam [11:0] UPAF1_i = UPAF_DBITS1;
2348
+
2349
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd1;
2350
+ localparam [ 0:0] FMODE2_i = 1'd1;
2351
+ localparam [ 0:0] POWERDN2_i = 1'd0;
2352
+ localparam [ 0:0] SLEEP2_i = 1'd0;
2353
+ localparam [ 0:0] PROTECT2_i = 1'd0;
2354
+ localparam [10:0] UPAE2_i = UPAE_DBITS2;
2355
+ localparam [10:0] UPAF2_i = UPAF_DBITS2;
2356
+
2357
+ // Width mode function
2358
+ function [2:0] mode;
2359
+ input integer width;
2360
+ case (width)
2361
+ 1: mode = 3'b101;
2362
+ 2: mode = 3'b110;
2363
+ 4: mode = 3'b100;
2364
+ 8,9: mode = 3'b001;
2365
+ 16, 18: mode = 3'b010;
2366
+ 32, 36: mode = 3'b011;
2367
+ default: mode = 3'b000;
2368
+ endcase
2369
+ endfunction
2370
+
2371
+ function integer rwmode;
2372
+ input integer rwwidth;
2373
+ case (rwwidth)
2374
+ 1: rwmode = 1;
2375
+ 2: rwmode = 2;
2376
+ 4: rwmode = 4;
2377
+ 8,9: rwmode = 9;
2378
+ 16, 18: rwmode = 18;
2379
+ default: rwmode = 18;
2380
+ endcase
2381
+ endfunction
2382
+
2383
+ wire [17:0] in_reg1;
2384
+ wire [17:0] out_reg1;
2385
+ wire [17:0] fifo1_flags;
2386
+
2387
+ wire [17:0] in_reg2;
2388
+ wire [17:0] out_reg2;
2389
+ wire [17:0] fifo2_flags;
2390
+
2391
+ wire Push_Clk1, Pop_Clk1;
2392
+ wire Push_Clk2, Pop_Clk2;
2393
+ assign Push_Clk1 = CLK1;
2394
+ assign Pop_Clk1 = CLK1;
2395
+ assign Push_Clk2 = CLK2;
2396
+ assign Pop_Clk2 = CLK2;
2397
+
2398
+ assign Overrun_Error1 = fifo1_flags[0];
2399
+ assign Full_Watermark1 = fifo1_flags[1];
2400
+ assign Almost_Full1 = fifo1_flags[2];
2401
+ assign Full1 = fifo1_flags[3];
2402
+ assign Underrun_Error1 = fifo1_flags[4];
2403
+ assign Empty_Watermark1 = fifo1_flags[5];
2404
+ assign Almost_Empty1 = fifo1_flags[6];
2405
+ assign Empty1 = fifo1_flags[7];
2406
+
2407
+ assign Overrun_Error2 = fifo2_flags[0];
2408
+ assign Full_Watermark2 = fifo2_flags[1];
2409
+ assign Almost_Full2 = fifo2_flags[2];
2410
+ assign Full2 = fifo2_flags[3];
2411
+ assign Underrun_Error2 = fifo2_flags[4];
2412
+ assign Empty_Watermark2 = fifo2_flags[5];
2413
+ assign Almost_Empty2 = fifo2_flags[6];
2414
+ assign Empty2 = fifo2_flags[7];
2415
+
2416
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
2417
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
2418
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
2419
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
2420
+
2421
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
2422
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
2423
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
2424
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
2425
+
2426
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
2427
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
2428
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
2429
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
2430
+
2431
+ generate
2432
+ if (WR1_DATA_WIDTH == 18) begin
2433
+ assign in_reg1[17:0] = DIN1[17:0];
2434
+ end else if (WR1_DATA_WIDTH == 9) begin
2435
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
2436
+ end else begin
2437
+ assign in_reg1[17:WR1_DATA_WIDTH] = 0;
2438
+ assign in_reg1[WR1_DATA_WIDTH-1:0] = DIN1[WR1_DATA_WIDTH-1:0];
2439
+ end
2440
+ endgenerate
2441
+
2442
+ generate
2443
+ if (RD1_DATA_WIDTH == 9) begin
2444
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
2445
+ end else begin
2446
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = out_reg1[RD1_DATA_WIDTH-1:0];
2447
+ end
2448
+ endgenerate
2449
+
2450
+ generate
2451
+ if (WR2_DATA_WIDTH == 18) begin
2452
+ assign in_reg2[17:0] = DIN2[17:0];
2453
+ end else if (WR2_DATA_WIDTH == 9) begin
2454
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
2455
+ end else begin
2456
+ assign in_reg2[17:WR2_DATA_WIDTH] = 0;
2457
+ assign in_reg2[WR2_DATA_WIDTH-1:0] = DIN2[WR2_DATA_WIDTH-1:0];
2458
+ end
2459
+ endgenerate
2460
+
2461
+ generate
2462
+ if (RD2_DATA_WIDTH == 9) begin
2463
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
2464
+ end else begin
2465
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = out_reg2[RD2_DATA_WIDTH-1:0];
2466
+ end
2467
+ endgenerate
2468
+
2469
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
2470
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
2471
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
2472
+ };
2473
+
2474
+ (* is_fifo = 1 *)
2475
+ (* sync_fifo = 1 *)
2476
+ (* is_split = 1 *)
2477
+ (* is_inferred = 0 *)
2478
+ (* port_a1_dwidth = PORT_A1_WRWIDTH *)
2479
+ (* port_a2_dwidth = PORT_A2_WRWIDTH *)
2480
+ (* port_b1_dwidth = PORT_B1_WRWIDTH *)
2481
+ (* port_b2_dwidth = PORT_B2_WRWIDTH *)
2482
+ TDP36K _TECHMAP_REPLACE_ (
2483
+ .RESET_ni(1'b1),
2484
+ .WDATA_A1_i(in_reg1[17:0]),
2485
+ .WDATA_A2_i(in_reg2[17:0]),
2486
+ .RDATA_A1_o(fifo1_flags),
2487
+ .RDATA_A2_o(fifo2_flags),
2488
+ .ADDR_A1_i(14'h0),
2489
+ .ADDR_A2_i(14'h0),
2490
+ .CLK_A1_i(Push_Clk1),
2491
+ .CLK_A2_i(Push_Clk2),
2492
+ .REN_A1_i(1'b1),
2493
+ .REN_A2_i(1'b1),
2494
+ .WEN_A1_i(PUSH1),
2495
+ .WEN_A2_i(PUSH2),
2496
+ .BE_A1_i(2'b11),
2497
+ .BE_A2_i(2'b11),
2498
+
2499
+ .WDATA_B1_i(18'h0),
2500
+ .WDATA_B2_i(18'h0),
2501
+ .RDATA_B1_o(out_reg1[17:0]),
2502
+ .RDATA_B2_o(out_reg2[17:0]),
2503
+ .ADDR_B1_i(14'h0),
2504
+ .ADDR_B2_i(14'h0),
2505
+ .CLK_B1_i(Pop_Clk1),
2506
+ .CLK_B2_i(Pop_Clk2),
2507
+ .REN_B1_i(POP1),
2508
+ .REN_B2_i(POP2),
2509
+ .WEN_B1_i(1'b0),
2510
+ .WEN_B2_i(1'b0),
2511
+ .BE_B1_i(2'b11),
2512
+ .BE_B2_i(2'b11),
2513
+
2514
+ .FLUSH1_i(Async_Flush1),
2515
+ .FLUSH2_i(Async_Flush2)
2516
+ );
2517
+
2518
+ endmodule
2519
+
2520
+ module AFIFO_18K_BLK (
2521
+ DIN,
2522
+ PUSH,
2523
+ POP,
2524
+ Push_Clk,
2525
+ Pop_Clk,
2526
+ Async_Flush,
2527
+ Overrun_Error,
2528
+ Full_Watermark,
2529
+ Almost_Full,
2530
+ Full,
2531
+ Underrun_Error,
2532
+ Empty_Watermark,
2533
+ Almost_Empty,
2534
+ Empty,
2535
+ DOUT
2536
+ );
2537
+
2538
+ parameter WR_DATA_WIDTH = 18;
2539
+ parameter RD_DATA_WIDTH = 18;
2540
+ parameter UPAE_DBITS = 11'd10;
2541
+ parameter UPAF_DBITS = 11'd10;
2542
+
2543
+ input wire Push_Clk, Pop_Clk;
2544
+ input wire PUSH, POP;
2545
+ input wire [WR_DATA_WIDTH-1:0] DIN;
2546
+ input wire Async_Flush;
2547
+ output wire [RD_DATA_WIDTH-1:0] DOUT;
2548
+ output wire Almost_Full, Almost_Empty;
2549
+ output wire Full, Empty;
2550
+ output wire Full_Watermark, Empty_Watermark;
2551
+ output wire Overrun_Error, Underrun_Error;
2552
+
2553
+ BRAM2x18_AFIFO #(
2554
+ .WR1_DATA_WIDTH(WR_DATA_WIDTH),
2555
+ .RD1_DATA_WIDTH(RD_DATA_WIDTH),
2556
+ .UPAE_DBITS1(UPAE_DBITS),
2557
+ .UPAF_DBITS1(UPAF_DBITS),
2558
+ .WR2_DATA_WIDTH(),
2559
+ .RD2_DATA_WIDTH(),
2560
+ .UPAE_DBITS2(),
2561
+ .UPAF_DBITS2()
2562
+ ) U1
2563
+ (
2564
+ .DIN1(DIN),
2565
+ .PUSH1(PUSH),
2566
+ .POP1(POP),
2567
+ .Push_Clk1(Push_Clk),
2568
+ .Pop_Clk1(Pop_Clk),
2569
+ .Async_Flush1(Async_Flush),
2570
+ .Overrun_Error1(Overrun_Error),
2571
+ .Full_Watermark1(Full_Watermark),
2572
+ .Almost_Full1(Almost_Full),
2573
+ .Full1(Full),
2574
+ .Underrun_Error1(Underrun_Error),
2575
+ .Empty_Watermark1(Empty_Watermark),
2576
+ .Almost_Empty1(Almost_Empty),
2577
+ .Empty1(Empty),
2578
+ .DOUT1(DOUT),
2579
+
2580
+ .DIN2(18'h0),
2581
+ .PUSH2(1'b0),
2582
+ .POP2(1'b0),
2583
+ .Push_Clk2(1'b0),
2584
+ .Pop_Clk2(1'b0),
2585
+ .Async_Flush2(1'b0),
2586
+ .Overrun_Error2(),
2587
+ .Full_Watermark2(),
2588
+ .Almost_Full2(),
2589
+ .Full2(),
2590
+ .Underrun_Error2(),
2591
+ .Empty_Watermark2(),
2592
+ .Almost_Empty2(),
2593
+ .Empty2(),
2594
+ .DOUT2()
2595
+ );
2596
+
2597
+ endmodule
2598
+
2599
+ module AFIFO_18K_X2_BLK (
2600
+ DIN1,
2601
+ PUSH1,
2602
+ POP1,
2603
+ Push_Clk1,
2604
+ Pop_Clk1,
2605
+ Async_Flush1,
2606
+ Overrun_Error1,
2607
+ Full_Watermark1,
2608
+ Almost_Full1,
2609
+ Full1,
2610
+ Underrun_Error1,
2611
+ Empty_Watermark1,
2612
+ Almost_Empty1,
2613
+ Empty1,
2614
+ DOUT1,
2615
+
2616
+ DIN2,
2617
+ PUSH2,
2618
+ POP2,
2619
+ Push_Clk2,
2620
+ Pop_Clk2,
2621
+ Async_Flush2,
2622
+ Overrun_Error2,
2623
+ Full_Watermark2,
2624
+ Almost_Full2,
2625
+ Full2,
2626
+ Underrun_Error2,
2627
+ Empty_Watermark2,
2628
+ Almost_Empty2,
2629
+ Empty2,
2630
+ DOUT2
2631
+ );
2632
+
2633
+ parameter WR1_DATA_WIDTH = 18;
2634
+ parameter RD1_DATA_WIDTH = 18;
2635
+
2636
+ parameter WR2_DATA_WIDTH = 18;
2637
+ parameter RD2_DATA_WIDTH = 18;
2638
+
2639
+ parameter UPAE_DBITS1 = 12'd10;
2640
+ parameter UPAF_DBITS1 = 12'd10;
2641
+
2642
+ parameter UPAE_DBITS2 = 11'd10;
2643
+ parameter UPAF_DBITS2 = 11'd10;
2644
+
2645
+ input Push_Clk1, Pop_Clk1;
2646
+ input PUSH1, POP1;
2647
+ input [WR1_DATA_WIDTH-1:0] DIN1;
2648
+ input Async_Flush1;
2649
+ output [RD1_DATA_WIDTH-1:0] DOUT1;
2650
+ output Almost_Full1, Almost_Empty1;
2651
+ output Full1, Empty1;
2652
+ output Full_Watermark1, Empty_Watermark1;
2653
+ output Overrun_Error1, Underrun_Error1;
2654
+
2655
+ input Push_Clk2, Pop_Clk2;
2656
+ input PUSH2, POP2;
2657
+ input [WR2_DATA_WIDTH-1:0] DIN2;
2658
+ input Async_Flush2;
2659
+ output [RD2_DATA_WIDTH-1:0] DOUT2;
2660
+ output Almost_Full2, Almost_Empty2;
2661
+ output Full2, Empty2;
2662
+ output Full_Watermark2, Empty_Watermark2;
2663
+ output Overrun_Error2, Underrun_Error2;
2664
+
2665
+ // Fixed mode settings
2666
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
2667
+ localparam [ 0:0] FMODE1_i = 1'd1;
2668
+ localparam [ 0:0] POWERDN1_i = 1'd0;
2669
+ localparam [ 0:0] SLEEP1_i = 1'd0;
2670
+ localparam [ 0:0] PROTECT1_i = 1'd0;
2671
+ localparam [11:0] UPAE1_i = UPAE_DBITS1;
2672
+ localparam [11:0] UPAF1_i = UPAF_DBITS1;
2673
+
2674
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
2675
+ localparam [ 0:0] FMODE2_i = 1'd1;
2676
+ localparam [ 0:0] POWERDN2_i = 1'd0;
2677
+ localparam [ 0:0] SLEEP2_i = 1'd0;
2678
+ localparam [ 0:0] PROTECT2_i = 1'd0;
2679
+ localparam [10:0] UPAE2_i = UPAE_DBITS2;
2680
+ localparam [10:0] UPAF2_i = UPAF_DBITS2;
2681
+
2682
+ // Width mode function
2683
+ function [2:0] mode;
2684
+ input integer width;
2685
+ case (width)
2686
+ 1: mode = 3'b101;
2687
+ 2: mode = 3'b110;
2688
+ 4: mode = 3'b100;
2689
+ 8,9: mode = 3'b001;
2690
+ 16, 18: mode = 3'b010;
2691
+ 32, 36: mode = 3'b011;
2692
+ default: mode = 3'b000;
2693
+ endcase
2694
+ endfunction
2695
+
2696
+ function integer rwmode;
2697
+ input integer rwwidth;
2698
+ case (rwwidth)
2699
+ 1: rwmode = 1;
2700
+ 2: rwmode = 2;
2701
+ 4: rwmode = 4;
2702
+ 8,9: rwmode = 9;
2703
+ 16, 18: rwmode = 18;
2704
+ default: rwmode = 18;
2705
+ endcase
2706
+ endfunction
2707
+
2708
+ wire [17:0] in_reg1;
2709
+ wire [17:0] out_reg1;
2710
+ wire [17:0] fifo1_flags;
2711
+
2712
+ wire [17:0] in_reg2;
2713
+ wire [17:0] out_reg2;
2714
+ wire [17:0] fifo2_flags;
2715
+
2716
+ wire Push_Clk1, Pop_Clk1;
2717
+ wire Push_Clk2, Pop_Clk2;
2718
+
2719
+ assign Overrun_Error1 = fifo1_flags[0];
2720
+ assign Full_Watermark1 = fifo1_flags[1];
2721
+ assign Almost_Full1 = fifo1_flags[2];
2722
+ assign Full1 = fifo1_flags[3];
2723
+ assign Underrun_Error1 = fifo1_flags[4];
2724
+ assign Empty_Watermark1 = fifo1_flags[5];
2725
+ assign Almost_Empty1 = fifo1_flags[6];
2726
+ assign Empty1 = fifo1_flags[7];
2727
+
2728
+ assign Overrun_Error2 = fifo2_flags[0];
2729
+ assign Full_Watermark2 = fifo2_flags[1];
2730
+ assign Almost_Full2 = fifo2_flags[2];
2731
+ assign Full2 = fifo2_flags[3];
2732
+ assign Underrun_Error2 = fifo2_flags[4];
2733
+ assign Empty_Watermark2 = fifo2_flags[5];
2734
+ assign Almost_Empty2 = fifo2_flags[6];
2735
+ assign Empty2 = fifo2_flags[7];
2736
+
2737
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
2738
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
2739
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
2740
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
2741
+
2742
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
2743
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
2744
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
2745
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
2746
+
2747
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
2748
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
2749
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
2750
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
2751
+
2752
+ generate
2753
+ if (WR1_DATA_WIDTH == 18) begin
2754
+ assign in_reg1[17:0] = DIN1[17:0];
2755
+ end else if (WR1_DATA_WIDTH == 9) begin
2756
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
2757
+ end else begin
2758
+ assign in_reg1[17:WR1_DATA_WIDTH] = 0;
2759
+ assign in_reg1[WR1_DATA_WIDTH-1:0] = DIN1[WR1_DATA_WIDTH-1:0];
2760
+ end
2761
+ endgenerate
2762
+
2763
+ generate
2764
+ if (RD1_DATA_WIDTH == 9) begin
2765
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
2766
+ end else begin
2767
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = out_reg1[RD1_DATA_WIDTH-1:0];
2768
+ end
2769
+ endgenerate
2770
+
2771
+ generate
2772
+ if (WR2_DATA_WIDTH == 18) begin
2773
+ assign in_reg2[17:0] = DIN2[17:0];
2774
+ end else if (WR2_DATA_WIDTH == 9) begin
2775
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
2776
+ end else begin
2777
+ assign in_reg2[17:WR2_DATA_WIDTH] = 0;
2778
+ assign in_reg2[WR2_DATA_WIDTH-1:0] = DIN2[WR2_DATA_WIDTH-1:0];
2779
+ end
2780
+ endgenerate
2781
+
2782
+ generate
2783
+ if (RD2_DATA_WIDTH == 9) begin
2784
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
2785
+ end else begin
2786
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = out_reg2[RD2_DATA_WIDTH-1:0];
2787
+ end
2788
+ endgenerate
2789
+
2790
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
2791
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
2792
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
2793
+ };
2794
+
2795
+ (* is_fifo = 1 *)
2796
+ (* sync_fifo = 0 *)
2797
+ (* is_split = 1 *)
2798
+ (* is_inferred = 0 *)
2799
+ (* port_a1_dwidth = PORT_A1_WRWIDTH *)
2800
+ (* port_a2_dwidth = PORT_A2_WRWIDTH *)
2801
+ (* port_b1_dwidth = PORT_B1_WRWIDTH *)
2802
+ (* port_b2_dwidth = PORT_B2_WRWIDTH *)
2803
+ TDP36K _TECHMAP_REPLACE_ (
2804
+ .RESET_ni(1'b1),
2805
+ .WDATA_A1_i(in_reg1[17:0]),
2806
+ .WDATA_A2_i(in_reg2[17:0]),
2807
+ .RDATA_A1_o(fifo1_flags),
2808
+ .RDATA_A2_o(fifo2_flags),
2809
+ .ADDR_A1_i(14'h0),
2810
+ .ADDR_A2_i(14'h0),
2811
+ .CLK_A1_i(Push_Clk1),
2812
+ .CLK_A2_i(Push_Clk2),
2813
+ .REN_A1_i(1'b1),
2814
+ .REN_A2_i(1'b1),
2815
+ .WEN_A1_i(PUSH1),
2816
+ .WEN_A2_i(PUSH2),
2817
+ .BE_A1_i(2'b11),
2818
+ .BE_A2_i(2'b11),
2819
+
2820
+ .WDATA_B1_i(18'h0),
2821
+ .WDATA_B2_i(18'h0),
2822
+ .RDATA_B1_o(out_reg1[17:0]),
2823
+ .RDATA_B2_o(out_reg2[17:0]),
2824
+ .ADDR_B1_i(14'h0),
2825
+ .ADDR_B2_i(14'h0),
2826
+ .CLK_B1_i(Pop_Clk1),
2827
+ .CLK_B2_i(Pop_Clk2),
2828
+ .REN_B1_i(POP1),
2829
+ .REN_B2_i(POP2),
2830
+ .WEN_B1_i(1'b0),
2831
+ .WEN_B2_i(1'b0),
2832
+ .BE_B1_i(2'b11),
2833
+ .BE_B2_i(2'b11),
2834
+
2835
+ .FLUSH1_i(Async_Flush1),
2836
+ .FLUSH2_i(Async_Flush2)
2837
+ );
2838
+
2839
+ endmodule
2840
+
2841
+ module BRAM2x18_SP (
2842
+ RESET_ni,
2843
+
2844
+ WEN1_i,
2845
+ REN1_i,
2846
+ WR1_CLK_i,
2847
+ RD1_CLK_i,
2848
+ WR1_BE_i,
2849
+ WR1_ADDR_i,
2850
+ RD1_ADDR_i,
2851
+ WDATA1_i,
2852
+ RDATA1_o,
2853
+
2854
+ WEN2_i,
2855
+ REN2_i,
2856
+ WR2_CLK_i,
2857
+ RD2_CLK_i,
2858
+ WR2_BE_i,
2859
+ WR2_ADDR_i,
2860
+ RD2_ADDR_i,
2861
+ WDATA2_i,
2862
+ RDATA2_o
2863
+ );
2864
+
2865
+ parameter WR1_ADDR_WIDTH = 10;
2866
+ parameter RD1_ADDR_WIDTH = 10;
2867
+ parameter WR1_DATA_WIDTH = 18;
2868
+ parameter RD1_DATA_WIDTH = 18;
2869
+ parameter BE1_WIDTH = 2;
2870
+
2871
+ parameter WR2_ADDR_WIDTH = 10;
2872
+ parameter RD2_ADDR_WIDTH = 10;
2873
+ parameter WR2_DATA_WIDTH = 18;
2874
+ parameter RD2_DATA_WIDTH = 18;
2875
+ parameter BE2_WIDTH = 2;
2876
+
2877
+ input wire RESET_ni;
2878
+
2879
+ input wire WEN1_i;
2880
+ input wire REN1_i;
2881
+ input wire WR1_CLK_i;
2882
+ input wire RD1_CLK_i;
2883
+ input wire [BE1_WIDTH-1:0] WR1_BE_i;
2884
+ input wire [WR1_ADDR_WIDTH-1 :0] WR1_ADDR_i;
2885
+ input wire [RD1_ADDR_WIDTH-1 :0] RD1_ADDR_i;
2886
+ input wire [WR1_DATA_WIDTH-1 :0] WDATA1_i;
2887
+ output wire [RD1_DATA_WIDTH-1 :0] RDATA1_o;
2888
+
2889
+ input wire WEN2_i;
2890
+ input wire REN2_i;
2891
+ input wire WR2_CLK_i;
2892
+ input wire RD2_CLK_i;
2893
+ input wire [BE2_WIDTH-1:0] WR2_BE_i;
2894
+ input wire [WR2_ADDR_WIDTH-1 :0] WR2_ADDR_i;
2895
+ input wire [RD2_ADDR_WIDTH-1 :0] RD2_ADDR_i;
2896
+ input wire [WR2_DATA_WIDTH-1 :0] WDATA2_i;
2897
+ output wire [RD2_DATA_WIDTH-1 :0] RDATA2_o;
2898
+
2899
+ // Fixed mode settings
2900
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
2901
+ localparam [ 0:0] FMODE1_i = 1'd0;
2902
+ localparam [ 0:0] POWERDN1_i = 1'd0;
2903
+ localparam [ 0:0] SLEEP1_i = 1'd0;
2904
+ localparam [ 0:0] PROTECT1_i = 1'd0;
2905
+ localparam [11:0] UPAE1_i = 12'd10;
2906
+ localparam [11:0] UPAF1_i = 12'd10;
2907
+
2908
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
2909
+ localparam [ 0:0] FMODE2_i = 1'd0;
2910
+ localparam [ 0:0] POWERDN2_i = 1'd0;
2911
+ localparam [ 0:0] SLEEP2_i = 1'd0;
2912
+ localparam [ 0:0] PROTECT2_i = 1'd0;
2913
+ localparam [10:0] UPAE2_i = 11'd10;
2914
+ localparam [10:0] UPAF2_i = 11'd10;
2915
+
2916
+ // Width mode function
2917
+ function [2:0] mode;
2918
+ input integer width;
2919
+ case (width)
2920
+ 1: mode = 3'b101;
2921
+ 2: mode = 3'b110;
2922
+ 4: mode = 3'b100;
2923
+ 8,9: mode = 3'b001;
2924
+ 16, 18: mode = 3'b010;
2925
+ 32, 36: mode = 3'b011;
2926
+ default: mode = 3'b000;
2927
+ endcase
2928
+ endfunction
2929
+
2930
+ function integer rwmode;
2931
+ input integer rwwidth;
2932
+ case (rwwidth)
2933
+ 1: rwmode = 1;
2934
+ 2: rwmode = 2;
2935
+ 4: rwmode = 4;
2936
+ 8,9: rwmode = 9;
2937
+ 16, 18: rwmode = 18;
2938
+ default: rwmode = 18;
2939
+ endcase
2940
+ endfunction
2941
+
2942
+ wire REN_A1_i;
2943
+ wire REN_A2_i;
2944
+
2945
+ wire REN_B1_i;
2946
+ wire REN_B2_i;
2947
+
2948
+ wire WEN_A1_i;
2949
+ wire WEN_A2_i;
2950
+
2951
+ wire WEN_B1_i;
2952
+ wire WEN_B2_i;
2953
+
2954
+ wire [1:0] BE_A1_i;
2955
+ wire [1:0] BE_A2_i;
2956
+
2957
+ wire [1:0] BE_B1_i;
2958
+ wire [1:0] BE_B2_i;
2959
+
2960
+ wire [14:0] ADDR_A1_i;
2961
+ wire [13:0] ADDR_A2_i;
2962
+
2963
+ wire [14:0] ADDR_B1_i;
2964
+ wire [13:0] ADDR_B2_i;
2965
+
2966
+ wire [17:0] WDATA_A1_i;
2967
+ wire [17:0] WDATA_A2_i;
2968
+
2969
+ wire [17:0] WDATA_B1_i;
2970
+ wire [17:0] WDATA_B2_i;
2971
+
2972
+ wire [17:0] RDATA_A1_o;
2973
+ wire [17:0] RDATA_A2_o;
2974
+
2975
+ wire [17:0] RDATA_B1_o;
2976
+ wire [17:0] RDATA_B2_o;
2977
+
2978
+ wire [1:0] WR1_BE;
2979
+ wire [1:0] WR2_BE;
2980
+
2981
+ wire [17:0] PORT_B1_RDATA;
2982
+ wire [17:0] PORT_A1_WDATA;
2983
+
2984
+ wire [17:0] PORT_B2_RDATA;
2985
+ wire [17:0] PORT_A2_WDATA;
2986
+
2987
+ wire [13:0] WR1_ADDR_INT;
2988
+ wire [13:0] RD1_ADDR_INT;
2989
+
2990
+ wire [13:0] WR2_ADDR_INT;
2991
+ wire [13:0] RD2_ADDR_INT;
2992
+
2993
+ wire [13:0] PORT_A1_ADDR;
2994
+ wire [13:0] PORT_B1_ADDR;
2995
+
2996
+ wire [13:0] PORT_A2_ADDR;
2997
+ wire [13:0] PORT_B2_ADDR;
2998
+
2999
+
3000
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
3001
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
3002
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
3003
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
3004
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
3005
+
3006
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
3007
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
3008
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
3009
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
3010
+
3011
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
3012
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
3013
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
3014
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
3015
+
3016
+ generate
3017
+ if (WR1_ADDR_WIDTH == 14) begin
3018
+ assign WR1_ADDR_INT = WR1_ADDR_i;
3019
+ end else begin
3020
+ assign WR1_ADDR_INT[13:WR1_ADDR_WIDTH] = 0;
3021
+ assign WR1_ADDR_INT[WR1_ADDR_WIDTH-1:0] = WR1_ADDR_i;
3022
+ end
3023
+ endgenerate
3024
+
3025
+ case (WR1_DATA_WIDTH)
3026
+ 1: begin
3027
+ assign PORT_A1_ADDR = WR1_ADDR_INT;
3028
+ end
3029
+ 2: begin
3030
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 1;
3031
+ end
3032
+ 4: begin
3033
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 2;
3034
+ end
3035
+ 8, 9: begin
3036
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 3;
3037
+ end
3038
+ 16, 18: begin
3039
+ assign PORT_A1_ADDR = WR1_ADDR_INT << 4;
3040
+ end
3041
+ default: begin
3042
+ assign PORT_A1_ADDR = WR1_ADDR_INT;
3043
+ end
3044
+ endcase
3045
+
3046
+ generate
3047
+ if (RD1_ADDR_WIDTH == 14) begin
3048
+ assign RD1_ADDR_INT = RD1_ADDR_i;
3049
+ end else begin
3050
+ assign RD1_ADDR_INT[13:RD1_ADDR_WIDTH] = 0;
3051
+ assign RD1_ADDR_INT[RD1_ADDR_WIDTH-1:0] = RD1_ADDR_i;
3052
+ end
3053
+ endgenerate
3054
+
3055
+ case (RD1_DATA_WIDTH)
3056
+ 1: begin
3057
+ assign PORT_B1_ADDR = RD1_ADDR_INT;
3058
+ end
3059
+ 2: begin
3060
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 1;
3061
+ end
3062
+ 4: begin
3063
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 2;
3064
+ end
3065
+ 8, 9: begin
3066
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 3;
3067
+ end
3068
+ 16, 18: begin
3069
+ assign PORT_B1_ADDR = RD1_ADDR_INT << 4;
3070
+ end
3071
+ default: begin
3072
+ assign PORT_B1_ADDR = RD1_ADDR_INT;
3073
+ end
3074
+ endcase
3075
+
3076
+ generate
3077
+ if (WR2_ADDR_WIDTH == 14) begin
3078
+ assign WR2_ADDR_INT = WR2_ADDR_i;
3079
+ end else begin
3080
+ assign WR2_ADDR_INT[13:WR2_ADDR_WIDTH] = 0;
3081
+ assign WR2_ADDR_INT[WR2_ADDR_WIDTH-1:0] = WR2_ADDR_i;
3082
+ end
3083
+ endgenerate
3084
+
3085
+ case (WR2_DATA_WIDTH)
3086
+ 1: begin
3087
+ assign PORT_A2_ADDR = WR2_ADDR_INT;
3088
+ end
3089
+ 2: begin
3090
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 1;
3091
+ end
3092
+ 4: begin
3093
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 2;
3094
+ end
3095
+ 8, 9: begin
3096
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 3;
3097
+ end
3098
+ 16, 18: begin
3099
+ assign PORT_A2_ADDR = WR2_ADDR_INT << 4;
3100
+ end
3101
+ default: begin
3102
+ assign PORT_A2_ADDR = WR2_ADDR_INT;
3103
+ end
3104
+ endcase
3105
+
3106
+ generate
3107
+ if (RD2_ADDR_WIDTH == 14) begin
3108
+ assign RD2_ADDR_INT = RD2_ADDR_i;
3109
+ end else begin
3110
+ assign RD2_ADDR_INT[13:RD2_ADDR_WIDTH] = 0;
3111
+ assign RD2_ADDR_INT[RD2_ADDR_WIDTH-1:0] = RD2_ADDR_i;
3112
+ end
3113
+ endgenerate
3114
+
3115
+ case (RD2_DATA_WIDTH)
3116
+ 1: begin
3117
+ assign PORT_B2_ADDR = RD2_ADDR_INT;
3118
+ end
3119
+ 2: begin
3120
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 1;
3121
+ end
3122
+ 4: begin
3123
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 2;
3124
+ end
3125
+ 8, 9: begin
3126
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 3;
3127
+ end
3128
+ 16, 18: begin
3129
+ assign PORT_B2_ADDR = RD2_ADDR_INT << 4;
3130
+ end
3131
+ default: begin
3132
+ assign PORT_B2_ADDR = RD2_ADDR_INT;
3133
+ end
3134
+ endcase
3135
+
3136
+ case (BE1_WIDTH)
3137
+ 2: begin
3138
+ assign WR1_BE = WR1_BE_i[BE1_WIDTH-1 :0];
3139
+ end
3140
+ default: begin
3141
+ assign WR1_BE[1:BE1_WIDTH] = 0;
3142
+ assign WR1_BE[BE1_WIDTH-1 :0] = WR1_BE_i[BE1_WIDTH-1 :0];
3143
+ end
3144
+ endcase
3145
+
3146
+ case (BE2_WIDTH)
3147
+ 2: begin
3148
+ assign WR2_BE = WR2_BE_i[BE2_WIDTH-1 :0];
3149
+ end
3150
+ default: begin
3151
+ assign WR2_BE[1:BE2_WIDTH] = 0;
3152
+ assign WR2_BE[BE2_WIDTH-1 :0] = WR2_BE_i[BE2_WIDTH-1 :0];
3153
+ end
3154
+ endcase
3155
+
3156
+ assign REN_A1_i = 1'b0;
3157
+ assign WEN_A1_i = WEN1_i;
3158
+ assign BE_A1_i = WR1_BE;
3159
+ assign REN_A2_i = 1'b0;
3160
+ assign WEN_A2_i = WEN2_i;
3161
+ assign BE_A2_i = WR2_BE;
3162
+
3163
+ assign REN_B1_i = REN1_i;
3164
+ assign WEN_B1_i = 1'b0;
3165
+ assign BE_B1_i = 4'h0;
3166
+ assign REN_B2_i = REN2_i;
3167
+ assign WEN_B2_i = 1'b0;
3168
+ assign BE_B2_i = 4'h0;
3169
+
3170
+ generate
3171
+ if (WR1_DATA_WIDTH == 18) begin
3172
+ assign PORT_A1_WDATA[WR1_DATA_WIDTH-1:0] = WDATA1_i[WR1_DATA_WIDTH-1:0];
3173
+ end else if (WR1_DATA_WIDTH == 9) begin
3174
+ assign PORT_A1_WDATA = {1'b0, WDATA1_i[8], 8'h0, WDATA1_i[7:0]};
3175
+ end else begin
3176
+ assign PORT_A1_WDATA[17:WR1_DATA_WIDTH] = 0;
3177
+ assign PORT_A1_WDATA[WR1_DATA_WIDTH-1:0] = WDATA1_i[WR1_DATA_WIDTH-1:0];
3178
+ end
3179
+ endgenerate
3180
+
3181
+ assign WDATA_A1_i = PORT_A1_WDATA[17:0];
3182
+ assign WDATA_B1_i = 18'h0;
3183
+
3184
+ generate
3185
+ if (RD1_DATA_WIDTH == 9) begin
3186
+ assign PORT_B1_RDATA = { 9'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
3187
+ end else begin
3188
+ assign PORT_B1_RDATA = RDATA_B1_o;
3189
+ end
3190
+ endgenerate
3191
+
3192
+ assign RDATA1_o = PORT_B1_RDATA[RD1_DATA_WIDTH-1:0];
3193
+
3194
+ generate
3195
+ if (WR2_DATA_WIDTH == 18) begin
3196
+ assign PORT_A2_WDATA[WR2_DATA_WIDTH-1:0] = WDATA2_i[WR2_DATA_WIDTH-1:0];
3197
+ end else if (WR2_DATA_WIDTH == 9) begin
3198
+ assign PORT_A2_WDATA = {1'b0, WDATA2_i[8], 8'h0, WDATA2_i[7:0]};
3199
+ end else begin
3200
+ assign PORT_A2_WDATA[17:WR2_DATA_WIDTH] = 0;
3201
+ assign PORT_A2_WDATA[WR2_DATA_WIDTH-1:0] = WDATA2_i[WR2_DATA_WIDTH-1:0];
3202
+ end
3203
+ endgenerate
3204
+
3205
+ assign WDATA_A2_i = PORT_A2_WDATA[17:0];
3206
+ assign WDATA_B2_i = 18'h0;
3207
+
3208
+ generate
3209
+ if (RD2_DATA_WIDTH == 9) begin
3210
+ assign PORT_B2_RDATA = { 9'h0, RDATA_B2_o[16], RDATA_B2_o[7:0]};
3211
+ end else begin
3212
+ assign PORT_B2_RDATA = RDATA_B2_o;
3213
+ end
3214
+ endgenerate
3215
+
3216
+ assign RDATA2_o = PORT_B2_RDATA[RD2_DATA_WIDTH-1:0];
3217
+
3218
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
3219
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
3220
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
3221
+ };
3222
+
3223
+ (* is_inferred = 0 *)
3224
+ (* is_split = 0 *)
3225
+ (* is_fifo = 0 *)
3226
+ (* port_a_dwidth = PORT_A1_WRWIDTH *)
3227
+ (* port_b_dwidth = PORT_B1_WRWIDTH *)
3228
+ TDP36K _TECHMAP_REPLACE_ (
3229
+ .RESET_ni(1'b1),
3230
+
3231
+ .CLK_A1_i(WR1_CLK_i),
3232
+ .ADDR_A1_i({1'b0,PORT_A1_ADDR}),
3233
+ .WEN_A1_i(WEN_A1_i),
3234
+ .BE_A1_i(BE_A1_i),
3235
+ .WDATA_A1_i(WDATA_A1_i),
3236
+ .REN_A1_i(REN_A1_i),
3237
+ .RDATA_A1_o(RDATA_A1_o),
3238
+
3239
+ .CLK_A2_i(WR2_CLK_i),
3240
+ .ADDR_A2_i(PORT_A2_ADDR),
3241
+ .WEN_A2_i(WEN_A2_i),
3242
+ .BE_A2_i(BE_A2_i),
3243
+ .WDATA_A2_i(WDATA_A2_i),
3244
+ .REN_A2_i(REN_A2_i),
3245
+ .RDATA_A2_o(RDATA_A2_o),
3246
+
3247
+ .CLK_B1_i(RD1_CLK_i),
3248
+ .ADDR_B1_i({1'b0,PORT_B1_ADDR}),
3249
+ .WEN_B1_i(WEN_B1_i),
3250
+ .BE_B1_i(BE_B1_i),
3251
+ .WDATA_B1_i(WDATA_B1_i),
3252
+ .REN_B1_i(REN_B1_i),
3253
+ .RDATA_B1_o(RDATA_B1_o),
3254
+
3255
+ .CLK_B2_i(RD2_CLK_i),
3256
+ .ADDR_B2_i(PORT_B2_ADDR),
3257
+ .WEN_B2_i(WEN_B2_i),
3258
+ .BE_B2_i(BE_B2_i),
3259
+ .WDATA_B2_i(WDATA_B2_i),
3260
+ .REN_B2_i(REN_B2_i),
3261
+ .RDATA_B2_o(RDATA_B2_o),
3262
+
3263
+ .FLUSH1_i(1'b0),
3264
+ .FLUSH2_i(1'b0)
3265
+ );
3266
+
3267
+ endmodule
3268
+
3269
+ module BRAM2x18_dP (
3270
+ PORT_A1_CLK_i,
3271
+ PORT_A1_WEN_i,
3272
+ PORT_A1_WR_BE_i,
3273
+ PORT_A1_REN_i,
3274
+ PORT_A1_ADDR_i,
3275
+ PORT_A1_WR_DATA_i,
3276
+ PORT_A1_RD_DATA_o,
3277
+
3278
+ PORT_B1_CLK_i,
3279
+ PORT_B1_WEN_i,
3280
+ PORT_B1_WR_BE_i,
3281
+ PORT_B1_REN_i,
3282
+ PORT_B1_ADDR_i,
3283
+ PORT_B1_WR_DATA_i,
3284
+ PORT_B1_RD_DATA_o,
3285
+
3286
+ PORT_A2_CLK_i,
3287
+ PORT_A2_WEN_i,
3288
+ PORT_A2_WR_BE_i,
3289
+ PORT_A2_REN_i,
3290
+ PORT_A2_ADDR_i,
3291
+ PORT_A2_WR_DATA_i,
3292
+ PORT_A2_RD_DATA_o,
3293
+
3294
+ PORT_B2_CLK_i,
3295
+ PORT_B2_WEN_i,
3296
+ PORT_B2_WR_BE_i,
3297
+ PORT_B2_REN_i,
3298
+ PORT_B2_ADDR_i,
3299
+ PORT_B2_WR_DATA_i,
3300
+ PORT_B2_RD_DATA_o
3301
+ );
3302
+
3303
+ parameter PORT_A1_AWIDTH = 10;
3304
+ parameter PORT_A1_DWIDTH = 18;
3305
+ parameter PORT_A1_WR_BE_WIDTH = 2;
3306
+
3307
+ parameter PORT_B1_AWIDTH = 10;
3308
+ parameter PORT_B1_DWIDTH = 18;
3309
+ parameter PORT_B1_WR_BE_WIDTH = 2;
3310
+
3311
+ parameter PORT_A2_AWIDTH = 10;
3312
+ parameter PORT_A2_DWIDTH = 18;
3313
+ parameter PORT_A2_WR_BE_WIDTH = 2;
3314
+
3315
+ parameter PORT_B2_AWIDTH = 10;
3316
+ parameter PORT_B2_DWIDTH = 18;
3317
+ parameter PORT_B2_WR_BE_WIDTH = 2;
3318
+
3319
+ input PORT_A1_CLK_i;
3320
+ input [PORT_A1_AWIDTH-1:0] PORT_A1_ADDR_i;
3321
+ input [PORT_A1_DWIDTH-1:0] PORT_A1_WR_DATA_i;
3322
+ input PORT_A1_WEN_i;
3323
+ input [PORT_A1_WR_BE_WIDTH-1:0] PORT_A1_WR_BE_i;
3324
+ input PORT_A1_REN_i;
3325
+ output [PORT_A1_DWIDTH-1:0] PORT_A1_RD_DATA_o;
3326
+
3327
+ input PORT_B1_CLK_i;
3328
+ input [PORT_B1_AWIDTH-1:0] PORT_B1_ADDR_i;
3329
+ input [PORT_B1_DWIDTH-1:0] PORT_B1_WR_DATA_i;
3330
+ input PORT_B1_WEN_i;
3331
+ input [PORT_B1_WR_BE_WIDTH-1:0] PORT_B1_WR_BE_i;
3332
+ input PORT_B1_REN_i;
3333
+ output [PORT_B1_DWIDTH-1:0] PORT_B1_RD_DATA_o;
3334
+
3335
+ input PORT_A2_CLK_i;
3336
+ input [PORT_A2_AWIDTH-1:0] PORT_A2_ADDR_i;
3337
+ input [PORT_A2_DWIDTH-1:0] PORT_A2_WR_DATA_i;
3338
+ input PORT_A2_WEN_i;
3339
+ input [PORT_A2_WR_BE_WIDTH-1:0] PORT_A2_WR_BE_i;
3340
+ input PORT_A2_REN_i;
3341
+ output [PORT_A2_DWIDTH-1:0] PORT_A2_RD_DATA_o;
3342
+
3343
+ input PORT_B2_CLK_i;
3344
+ input [PORT_B2_AWIDTH-1:0] PORT_B2_ADDR_i;
3345
+ input [PORT_B2_DWIDTH-1:0] PORT_B2_WR_DATA_i;
3346
+ input PORT_B2_WEN_i;
3347
+ input [PORT_B2_WR_BE_WIDTH-1:0] PORT_B2_WR_BE_i;
3348
+ input PORT_B2_REN_i;
3349
+ output [PORT_B2_DWIDTH-1:0] PORT_B2_RD_DATA_o;
3350
+
3351
+
3352
+ // Fixed mode settings
3353
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
3354
+ localparam [ 0:0] FMODE1_i = 1'd0;
3355
+ localparam [ 0:0] POWERDN1_i = 1'd0;
3356
+ localparam [ 0:0] SLEEP1_i = 1'd0;
3357
+ localparam [ 0:0] PROTECT1_i = 1'd0;
3358
+ localparam [11:0] UPAE1_i = 12'd10;
3359
+ localparam [11:0] UPAF1_i = 12'd10;
3360
+
3361
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
3362
+ localparam [ 0:0] FMODE2_i = 1'd0;
3363
+ localparam [ 0:0] POWERDN2_i = 1'd0;
3364
+ localparam [ 0:0] SLEEP2_i = 1'd0;
3365
+ localparam [ 0:0] PROTECT2_i = 1'd0;
3366
+ localparam [10:0] UPAE2_i = 11'd10;
3367
+ localparam [10:0] UPAF2_i = 11'd10;
3368
+
3369
+ // Width mode function
3370
+ function [2:0] mode;
3371
+ input integer width;
3372
+ case (width)
3373
+ 1: mode = 3'b101;
3374
+ 2: mode = 3'b110;
3375
+ 4: mode = 3'b100;
3376
+ 8,9: mode = 3'b001;
3377
+ 16, 18: mode = 3'b010;
3378
+ 32, 36: mode = 3'b011;
3379
+ default: mode = 3'b000;
3380
+ endcase
3381
+ endfunction
3382
+
3383
+ function integer rwmode;
3384
+ input integer rwwidth;
3385
+ case (rwwidth)
3386
+ 1: rwmode = 1;
3387
+ 2: rwmode = 2;
3388
+ 4: rwmode = 4;
3389
+ 8,9: rwmode = 9;
3390
+ 16, 18: rwmode = 18;
3391
+ default: rwmode = 18;
3392
+ endcase
3393
+ endfunction
3394
+
3395
+ wire REN_A1_i;
3396
+ wire REN_A2_i;
3397
+
3398
+ wire REN_B1_i;
3399
+ wire REN_B2_i;
3400
+
3401
+ wire WEN_A1_i;
3402
+ wire WEN_A2_i;
3403
+
3404
+ wire WEN_B1_i;
3405
+ wire WEN_B2_i;
3406
+
3407
+ wire [1:0] BE_A1_i;
3408
+ wire [1:0] BE_A2_i;
3409
+
3410
+ wire [1:0] BE_B1_i;
3411
+ wire [1:0] BE_B2_i;
3412
+
3413
+ wire [14:0] ADDR_A1_i;
3414
+ wire [13:0] ADDR_A2_i;
3415
+
3416
+ wire [14:0] ADDR_B1_i;
3417
+ wire [13:0] ADDR_B2_i;
3418
+
3419
+ wire [17:0] WDATA_A1_i;
3420
+ wire [17:0] WDATA_A2_i;
3421
+
3422
+ wire [17:0] WDATA_B1_i;
3423
+ wire [17:0] WDATA_B2_i;
3424
+
3425
+ wire [17:0] RDATA_A1_o;
3426
+ wire [17:0] RDATA_A2_o;
3427
+
3428
+ wire [17:0] RDATA_B1_o;
3429
+ wire [17:0] RDATA_B2_o;
3430
+
3431
+ wire [1:0] PORT_A1_WR_BE;
3432
+ wire [1:0] PORT_B1_WR_BE;
3433
+
3434
+ wire [1:0] PORT_A2_WR_BE;
3435
+ wire [1:0] PORT_B2_WR_BE;
3436
+
3437
+ wire [17:0] PORT_B1_WDATA;
3438
+ wire [17:0] PORT_B1_RDATA;
3439
+ wire [17:0] PORT_A1_WDATA;
3440
+ wire [17:0] PORT_A1_RDATA;
3441
+
3442
+ wire [17:0] PORT_B2_WDATA;
3443
+ wire [17:0] PORT_B2_RDATA;
3444
+ wire [17:0] PORT_A2_WDATA;
3445
+ wire [17:0] PORT_A2_RDATA;
3446
+
3447
+ wire [13:0] PORT_A1_ADDR_INT;
3448
+ wire [13:0] PORT_B1_ADDR_INT;
3449
+
3450
+ wire [13:0] PORT_A2_ADDR_INT;
3451
+ wire [13:0] PORT_B2_ADDR_INT;
3452
+
3453
+ wire [13:0] PORT_A1_ADDR;
3454
+ wire [13:0] PORT_B1_ADDR;
3455
+
3456
+ wire [13:0] PORT_A2_ADDR;
3457
+ wire [13:0] PORT_B2_ADDR;
3458
+
3459
+ wire PORT_A1_CLK;
3460
+ wire PORT_B1_CLK;
3461
+
3462
+ wire PORT_A2_CLK;
3463
+ wire PORT_B2_CLK;
3464
+
3465
+ // Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
3466
+ localparam [ 2:0] RMODE_A1_i = mode(PORT_A1_DWIDTH);
3467
+ localparam [ 2:0] WMODE_A1_i = mode(PORT_A1_DWIDTH);
3468
+ localparam [ 2:0] RMODE_A2_i = mode(PORT_A2_DWIDTH);
3469
+ localparam [ 2:0] WMODE_A2_i = mode(PORT_A2_DWIDTH);
3470
+
3471
+ localparam [ 2:0] RMODE_B1_i = mode(PORT_B1_DWIDTH);
3472
+ localparam [ 2:0] WMODE_B1_i = mode(PORT_B1_DWIDTH);
3473
+ localparam [ 2:0] RMODE_B2_i = mode(PORT_B2_DWIDTH);
3474
+ localparam [ 2:0] WMODE_B2_i = mode(PORT_B2_DWIDTH);
3475
+
3476
+ localparam PORT_A1_WRWIDTH = rwmode(PORT_A1_DWIDTH);
3477
+ localparam PORT_B1_WRWIDTH = rwmode(PORT_B1_DWIDTH);
3478
+ localparam PORT_A2_WRWIDTH = rwmode(PORT_A2_DWIDTH);
3479
+ localparam PORT_B2_WRWIDTH = rwmode(PORT_B2_DWIDTH);
3480
+
3481
+ assign PORT_A1_CLK = PORT_A1_CLK_i;
3482
+ assign PORT_B1_CLK = PORT_B1_CLK_i;
3483
+
3484
+ assign PORT_A2_CLK = PORT_A2_CLK_i;
3485
+ assign PORT_B2_CLK = PORT_B2_CLK_i;
3486
+
3487
+ generate
3488
+ if (PORT_A1_AWIDTH == 14) begin
3489
+ assign PORT_A1_ADDR_INT = PORT_A1_ADDR_i;
3490
+ end else begin
3491
+ assign PORT_A1_ADDR_INT[13:PORT_A1_AWIDTH] = 0;
3492
+ assign PORT_A1_ADDR_INT[PORT_A1_AWIDTH-1:0] = PORT_A1_ADDR_i;
3493
+ end
3494
+ endgenerate
3495
+
3496
+ case (PORT_A1_DWIDTH)
3497
+ 1: begin
3498
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT;
3499
+ end
3500
+ 2: begin
3501
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 1;
3502
+ end
3503
+ 4: begin
3504
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 2;
3505
+ end
3506
+ 8, 9: begin
3507
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 3;
3508
+ end
3509
+ 16, 18: begin
3510
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT << 4;
3511
+ end
3512
+ default: begin
3513
+ assign PORT_A1_ADDR = PORT_A1_ADDR_INT;
3514
+ end
3515
+ endcase
3516
+
3517
+ generate
3518
+ if (PORT_B1_AWIDTH == 14) begin
3519
+ assign PORT_B1_ADDR_INT = PORT_B1_ADDR_i;
3520
+ end else begin
3521
+ assign PORT_B1_ADDR_INT[13:PORT_B1_AWIDTH] = 0;
3522
+ assign PORT_B1_ADDR_INT[PORT_B1_AWIDTH-1:0] = PORT_B1_ADDR_i;
3523
+ end
3524
+ endgenerate
3525
+
3526
+ case (PORT_B1_DWIDTH)
3527
+ 1: begin
3528
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT;
3529
+ end
3530
+ 2: begin
3531
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 1;
3532
+ end
3533
+ 4: begin
3534
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 2;
3535
+ end
3536
+ 8, 9: begin
3537
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 3;
3538
+ end
3539
+ 16, 18: begin
3540
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT << 4;
3541
+ end
3542
+ default: begin
3543
+ assign PORT_B1_ADDR = PORT_B1_ADDR_INT;
3544
+ end
3545
+ endcase
3546
+
3547
+ generate
3548
+ if (PORT_A2_AWIDTH == 14) begin
3549
+ assign PORT_A2_ADDR_INT = PORT_A2_ADDR_i;
3550
+ end else begin
3551
+ assign PORT_A2_ADDR_INT[13:PORT_A2_AWIDTH] = 0;
3552
+ assign PORT_A2_ADDR_INT[PORT_A2_AWIDTH-1:0] = PORT_A2_ADDR_i;
3553
+ end
3554
+ endgenerate
3555
+
3556
+ case (PORT_A2_DWIDTH)
3557
+ 1: begin
3558
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT;
3559
+ end
3560
+ 2: begin
3561
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 1;
3562
+ end
3563
+ 4: begin
3564
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 2;
3565
+ end
3566
+ 8, 9: begin
3567
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 3;
3568
+ end
3569
+ 16, 18: begin
3570
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT << 4;
3571
+ end
3572
+ default: begin
3573
+ assign PORT_A2_ADDR = PORT_A2_ADDR_INT;
3574
+ end
3575
+ endcase
3576
+
3577
+ generate
3578
+ if (PORT_B2_AWIDTH == 14) begin
3579
+ assign PORT_B2_ADDR_INT = PORT_B2_ADDR_i;
3580
+ end else begin
3581
+ assign PORT_B2_ADDR_INT[13:PORT_B2_AWIDTH] = 0;
3582
+ assign PORT_B2_ADDR_INT[PORT_B2_AWIDTH-1:0] = PORT_B2_ADDR_i;
3583
+ end
3584
+ endgenerate
3585
+
3586
+ case (PORT_B2_DWIDTH)
3587
+ 1: begin
3588
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT;
3589
+ end
3590
+ 2: begin
3591
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 1;
3592
+ end
3593
+ 4: begin
3594
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 2;
3595
+ end
3596
+ 8, 9: begin
3597
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 3;
3598
+ end
3599
+ 16, 18: begin
3600
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT << 4;
3601
+ end
3602
+ default: begin
3603
+ assign PORT_B2_ADDR = PORT_B2_ADDR_INT;
3604
+ end
3605
+ endcase
3606
+
3607
+ case (PORT_A1_WR_BE_WIDTH)
3608
+ 2: begin
3609
+ assign PORT_A1_WR_BE = PORT_A1_WR_BE_i[PORT_A1_WR_BE_WIDTH-1 :0];
3610
+ end
3611
+ default: begin
3612
+ assign PORT_A1_WR_BE[1:PORT_A1_WR_BE_WIDTH] = 0;
3613
+ assign PORT_A1_WR_BE[PORT_A1_WR_BE_WIDTH-1 :0] = PORT_A1_WR_BE_i[PORT_A1_WR_BE_WIDTH-1 :0];
3614
+ end
3615
+ endcase
3616
+
3617
+ case (PORT_B1_WR_BE_WIDTH)
3618
+ 2: begin
3619
+ assign PORT_B1_WR_BE = PORT_B1_WR_BE_i[PORT_B1_WR_BE_WIDTH-1 :0];
3620
+ end
3621
+ default: begin
3622
+ assign PORT_B1_WR_BE[1:PORT_B1_WR_BE_WIDTH] = 0;
3623
+ assign PORT_B1_WR_BE[PORT_B1_WR_BE_WIDTH-1 :0] = PORT_B1_WR_BE_i[PORT_B1_WR_BE_WIDTH-1 :0];
3624
+ end
3625
+ endcase
3626
+
3627
+ case (PORT_A2_WR_BE_WIDTH)
3628
+ 2: begin
3629
+ assign PORT_A2_WR_BE = PORT_A2_WR_BE_i[PORT_A2_WR_BE_WIDTH-1 :0];
3630
+ end
3631
+ default: begin
3632
+ assign PORT_A2_WR_BE[1:PORT_A2_WR_BE_WIDTH] = 0;
3633
+ assign PORT_A2_WR_BE[PORT_A2_WR_BE_WIDTH-1 :0] = PORT_A2_WR_BE_i[PORT_A2_WR_BE_WIDTH-1 :0];
3634
+ end
3635
+ endcase
3636
+
3637
+ case (PORT_B2_WR_BE_WIDTH)
3638
+ 2: begin
3639
+ assign PORT_B2_WR_BE = PORT_B2_WR_BE_i[PORT_B2_WR_BE_WIDTH-1 :0];
3640
+ end
3641
+ default: begin
3642
+ assign PORT_B2_WR_BE[1:PORT_B2_WR_BE_WIDTH] = 0;
3643
+ assign PORT_B2_WR_BE[PORT_B2_WR_BE_WIDTH-1 :0] = PORT_B2_WR_BE_i[PORT_B2_WR_BE_WIDTH-1 :0];
3644
+ end
3645
+ endcase
3646
+
3647
+ assign REN_A1_i = PORT_A1_REN_i;
3648
+ assign WEN_A1_i = PORT_A1_WEN_i;
3649
+ assign BE_A1_i = PORT_A1_WR_BE;
3650
+
3651
+ assign REN_A2_i = PORT_A2_REN_i;
3652
+ assign WEN_A2_i = PORT_A2_WEN_i;
3653
+ assign BE_A2_i = PORT_A2_WR_BE;
3654
+
3655
+ assign REN_B1_i = PORT_B1_REN_i;
3656
+ assign WEN_B1_i = PORT_B1_WEN_i;
3657
+ assign BE_B1_i = PORT_B1_WR_BE;
3658
+
3659
+ assign REN_B2_i = PORT_B2_REN_i;
3660
+ assign WEN_B2_i = PORT_B2_WEN_i;
3661
+ assign BE_B2_i = PORT_B2_WR_BE;
3662
+
3663
+ generate
3664
+ if (PORT_A1_DWIDTH == 18) begin
3665
+ assign PORT_A1_WDATA[PORT_A1_DWIDTH-1:0] = PORT_A1_WR_DATA_i[PORT_A1_DWIDTH-1:0];
3666
+ end else if (PORT_A1_DWIDTH == 9) begin
3667
+ assign PORT_A1_WDATA = {1'b0, PORT_A1_WR_DATA_i[8], 8'h0, PORT_A1_WR_DATA_i[7:0]};
3668
+ end else begin
3669
+ assign PORT_A1_WDATA[17:PORT_A1_DWIDTH] = 0;
3670
+ assign PORT_A1_WDATA[PORT_A1_DWIDTH-1:0] = PORT_A1_WR_DATA_i[PORT_A1_DWIDTH-1:0];
3671
+ end
3672
+ endgenerate
3673
+
3674
+ assign WDATA_A1_i = PORT_A1_WDATA;
3675
+
3676
+ generate
3677
+ if (PORT_A2_DWIDTH == 18) begin
3678
+ assign PORT_A2_WDATA[PORT_A2_DWIDTH-1:0] = PORT_A2_WR_DATA_i[PORT_A2_DWIDTH-1:0];
3679
+ end else if (PORT_A2_DWIDTH == 9) begin
3680
+ assign PORT_A2_WDATA = {1'b0, PORT_A2_WR_DATA_i[8], 8'h0, PORT_A2_WR_DATA_i[7:0]};
3681
+ end else begin
3682
+ assign PORT_A2_WDATA[17:PORT_A2_DWIDTH] = 0;
3683
+ assign PORT_A2_WDATA[PORT_A2_DWIDTH-1:0] = PORT_A2_WR_DATA_i[PORT_A2_DWIDTH-1:0];
3684
+ end
3685
+ endgenerate
3686
+
3687
+ assign WDATA_A2_i = PORT_A2_WDATA;
3688
+
3689
+ generate
3690
+ if (PORT_A1_DWIDTH == 9) begin
3691
+ assign PORT_A1_RDATA = { 9'h0, RDATA_A1_o[16], RDATA_A1_o[7:0]};
3692
+ end else begin
3693
+ assign PORT_A1_RDATA = RDATA_A1_o;
3694
+ end
3695
+ endgenerate
3696
+
3697
+ assign PORT_A1_RD_DATA_o = PORT_A1_RDATA[PORT_A1_DWIDTH-1:0];
3698
+
3699
+ generate
3700
+ if (PORT_A2_DWIDTH == 9) begin
3701
+ assign PORT_A2_RDATA = { 9'h0, RDATA_A2_o[16], RDATA_A2_o[7:0]};
3702
+ end else begin
3703
+ assign PORT_A2_RDATA = RDATA_A2_o;
3704
+ end
3705
+ endgenerate
3706
+
3707
+ assign PORT_A2_RD_DATA_o = PORT_A2_RDATA[PORT_A2_DWIDTH-1:0];
3708
+
3709
+ generate
3710
+ if (PORT_B1_DWIDTH == 18) begin
3711
+ assign PORT_B1_WDATA[PORT_B1_DWIDTH-1:0] = PORT_B1_WR_DATA_i[PORT_B1_DWIDTH-1:0];
3712
+ end else if (PORT_B1_DWIDTH == 9) begin
3713
+ assign PORT_B1_WDATA = {1'b0, PORT_B1_WR_DATA_i[8], 8'h0, PORT_B1_WR_DATA_i[7:0]};
3714
+ end else begin
3715
+ assign PORT_B1_WDATA[17:PORT_B1_DWIDTH] = 0;
3716
+ assign PORT_B1_WDATA[PORT_B1_DWIDTH-1:0] = PORT_B1_WR_DATA_i[PORT_B1_DWIDTH-1:0];
3717
+ end
3718
+ endgenerate
3719
+
3720
+ assign WDATA_B1_i = PORT_B1_WDATA;
3721
+
3722
+ generate
3723
+ if (PORT_B2_DWIDTH == 18) begin
3724
+ assign PORT_B2_WDATA[PORT_B2_DWIDTH-1:0] = PORT_B2_WR_DATA_i[PORT_B2_DWIDTH-1:0];
3725
+ end else if (PORT_B2_DWIDTH == 9) begin
3726
+ assign PORT_B2_WDATA = {1'b0, PORT_B2_WR_DATA_i[8], 8'h0, PORT_B2_WR_DATA_i[7:0]};
3727
+ end else begin
3728
+ assign PORT_B2_WDATA[17:PORT_B2_DWIDTH] = 0;
3729
+ assign PORT_B2_WDATA[PORT_B2_DWIDTH-1:0] = PORT_B2_WR_DATA_i[PORT_B2_DWIDTH-1:0];
3730
+ end
3731
+ endgenerate
3732
+
3733
+ assign WDATA_B2_i = PORT_B2_WDATA;
3734
+
3735
+ generate
3736
+ if (PORT_B1_DWIDTH == 9) begin
3737
+ assign PORT_B1_RDATA = { 9'h0, RDATA_B1_o[16], RDATA_B1_o[7:0]};
3738
+ end else begin
3739
+ assign PORT_B1_RDATA = RDATA_B1_o;
3740
+ end
3741
+ endgenerate
3742
+
3743
+ assign PORT_B1_RD_DATA_o = PORT_B1_RDATA[PORT_B1_DWIDTH-1:0];
3744
+
3745
+ generate
3746
+ if (PORT_B2_DWIDTH == 9) begin
3747
+ assign PORT_B2_RDATA = { 9'h0, RDATA_B2_o[16], RDATA_B2_o[7:0]};
3748
+ end else begin
3749
+ assign PORT_B2_RDATA = RDATA_B2_o;
3750
+ end
3751
+ endgenerate
3752
+
3753
+ assign PORT_B2_RD_DATA_o = PORT_B2_RDATA[PORT_B2_DWIDTH-1:0];
3754
+
3755
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
3756
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
3757
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
3758
+ };
3759
+
3760
+ (* is_inferred = 0 *)
3761
+ (* is_split = 0 *)
3762
+ (* is_fifo = 0 *)
3763
+ (* port_a_dwidth = PORT_A1_WRWIDTH *)
3764
+ (* port_b_dwidth = PORT_B1_WRWIDTH *)
3765
+ TDP36K _TECHMAP_REPLACE_ (
3766
+ .RESET_ni(1'b1),
3767
+
3768
+ .CLK_A1_i(PORT_A1_CLK),
3769
+ .ADDR_A1_i({1'b0,PORT_A1_ADDR}),
3770
+ .WEN_A1_i(WEN_A1_i),
3771
+ .BE_A1_i(BE_A1_i),
3772
+ .WDATA_A1_i(WDATA_A1_i),
3773
+ .REN_A1_i(REN_A1_i),
3774
+ .RDATA_A1_o(RDATA_A1_o),
3775
+
3776
+ .CLK_A2_i(PORT_A2_CLK),
3777
+ .ADDR_A2_i(PORT_A2_ADDR),
3778
+ .WEN_A2_i(WEN_A2_i),
3779
+ .BE_A2_i(BE_A2_i),
3780
+ .WDATA_A2_i(WDATA_A2_i),
3781
+ .REN_A2_i(REN_A2_i),
3782
+ .RDATA_A2_o(RDATA_A2_o),
3783
+
3784
+ .CLK_B1_i(PORT_B1_CLK),
3785
+ .ADDR_B1_i({1'b0,PORT_B1_ADDR}),
3786
+ .WEN_B1_i(WEN_B1_i),
3787
+ .BE_B1_i(BE_B1_i),
3788
+ .WDATA_B1_i(WDATA_B1_i),
3789
+ .REN_B1_i(REN_B1_i),
3790
+ .RDATA_B1_o(RDATA_B1_o),
3791
+
3792
+ .CLK_B2_i(PORT_B2_CLK),
3793
+ .ADDR_B2_i(PORT_B2_ADDR),
3794
+ .WEN_B2_i(WEN_B2_i),
3795
+ .BE_B2_i(BE_B2_i),
3796
+ .WDATA_B2_i(WDATA_B2_i),
3797
+ .REN_B2_i(REN_B2_i),
3798
+ .RDATA_B2_o(RDATA_B2_o),
3799
+
3800
+ .FLUSH1_i(1'b0),
3801
+ .FLUSH2_i(1'b0)
3802
+ );
3803
+
3804
+ endmodule
3805
+
3806
+
3807
+ module BRAM2x18_SFIFO (
3808
+ DIN1,
3809
+ PUSH1,
3810
+ POP1,
3811
+ CLK1,
3812
+ Async_Flush1,
3813
+ Overrun_Error1,
3814
+ Full_Watermark1,
3815
+ Almost_Full1,
3816
+ Full1,
3817
+ Underrun_Error1,
3818
+ Empty_Watermark1,
3819
+ Almost_Empty1,
3820
+ Empty1,
3821
+ DOUT1,
3822
+
3823
+ DIN2,
3824
+ PUSH2,
3825
+ POP2,
3826
+ CLK2,
3827
+ Async_Flush2,
3828
+ Overrun_Error2,
3829
+ Full_Watermark2,
3830
+ Almost_Full2,
3831
+ Full2,
3832
+ Underrun_Error2,
3833
+ Empty_Watermark2,
3834
+ Almost_Empty2,
3835
+ Empty2,
3836
+ DOUT2
3837
+ );
3838
+
3839
+ parameter WR1_DATA_WIDTH = 18;
3840
+ parameter RD1_DATA_WIDTH = 18;
3841
+
3842
+ parameter WR2_DATA_WIDTH = 18;
3843
+ parameter RD2_DATA_WIDTH = 18;
3844
+
3845
+ parameter UPAE_DBITS1 = 12'd10;
3846
+ parameter UPAF_DBITS1 = 12'd10;
3847
+
3848
+ parameter UPAE_DBITS2 = 11'd10;
3849
+ parameter UPAF_DBITS2 = 11'd10;
3850
+
3851
+ input CLK1;
3852
+ input PUSH1, POP1;
3853
+ input [WR1_DATA_WIDTH-1:0] DIN1;
3854
+ input Async_Flush1;
3855
+ output [RD1_DATA_WIDTH-1:0] DOUT1;
3856
+ output Almost_Full1, Almost_Empty1;
3857
+ output Full1, Empty1;
3858
+ output Full_Watermark1, Empty_Watermark1;
3859
+ output Overrun_Error1, Underrun_Error1;
3860
+
3861
+ input CLK2;
3862
+ input PUSH2, POP2;
3863
+ input [WR2_DATA_WIDTH-1:0] DIN2;
3864
+ input Async_Flush2;
3865
+ output [RD2_DATA_WIDTH-1:0] DOUT2;
3866
+ output Almost_Full2, Almost_Empty2;
3867
+ output Full2, Empty2;
3868
+ output Full_Watermark2, Empty_Watermark2;
3869
+ output Overrun_Error2, Underrun_Error2;
3870
+
3871
+ // Fixed mode settings
3872
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd1;
3873
+ localparam [ 0:0] FMODE1_i = 1'd1;
3874
+ localparam [ 0:0] POWERDN1_i = 1'd0;
3875
+ localparam [ 0:0] SLEEP1_i = 1'd0;
3876
+ localparam [ 0:0] PROTECT1_i = 1'd0;
3877
+ localparam [11:0] UPAE1_i = UPAE_DBITS1;
3878
+ localparam [11:0] UPAF1_i = UPAF_DBITS1;
3879
+
3880
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd1;
3881
+ localparam [ 0:0] FMODE2_i = 1'd1;
3882
+ localparam [ 0:0] POWERDN2_i = 1'd0;
3883
+ localparam [ 0:0] SLEEP2_i = 1'd0;
3884
+ localparam [ 0:0] PROTECT2_i = 1'd0;
3885
+ localparam [10:0] UPAE2_i = UPAE_DBITS2;
3886
+ localparam [10:0] UPAF2_i = UPAF_DBITS2;
3887
+
3888
+ // Width mode function
3889
+ function [2:0] mode;
3890
+ input integer width;
3891
+ case (width)
3892
+ 1: mode = 3'b101;
3893
+ 2: mode = 3'b110;
3894
+ 4: mode = 3'b100;
3895
+ 8,9: mode = 3'b001;
3896
+ 16, 18: mode = 3'b010;
3897
+ 32, 36: mode = 3'b011;
3898
+ default: mode = 3'b000;
3899
+ endcase
3900
+ endfunction
3901
+
3902
+ function integer rwmode;
3903
+ input integer rwwidth;
3904
+ case (rwwidth)
3905
+ 1: rwmode = 1;
3906
+ 2: rwmode = 2;
3907
+ 4: rwmode = 4;
3908
+ 8,9: rwmode = 9;
3909
+ 16, 18: rwmode = 18;
3910
+ default: rwmode = 18;
3911
+ endcase
3912
+ endfunction
3913
+
3914
+ wire [17:0] in_reg1;
3915
+ wire [17:0] out_reg1;
3916
+ wire [17:0] fifo1_flags;
3917
+
3918
+ wire [17:0] in_reg2;
3919
+ wire [17:0] out_reg2;
3920
+ wire [17:0] fifo2_flags;
3921
+
3922
+ wire Push_Clk1, Pop_Clk1;
3923
+ wire Push_Clk2, Pop_Clk2;
3924
+ assign Push_Clk1 = CLK1;
3925
+ assign Pop_Clk1 = CLK1;
3926
+ assign Push_Clk2 = CLK2;
3927
+ assign Pop_Clk2 = CLK2;
3928
+
3929
+ assign Overrun_Error1 = fifo1_flags[0];
3930
+ assign Full_Watermark1 = fifo1_flags[1];
3931
+ assign Almost_Full1 = fifo1_flags[2];
3932
+ assign Full1 = fifo1_flags[3];
3933
+ assign Underrun_Error1 = fifo1_flags[4];
3934
+ assign Empty_Watermark1 = fifo1_flags[5];
3935
+ assign Almost_Empty1 = fifo1_flags[6];
3936
+ assign Empty1 = fifo1_flags[7];
3937
+
3938
+ assign Overrun_Error2 = fifo2_flags[0];
3939
+ assign Full_Watermark2 = fifo2_flags[1];
3940
+ assign Almost_Full2 = fifo2_flags[2];
3941
+ assign Full2 = fifo2_flags[3];
3942
+ assign Underrun_Error2 = fifo2_flags[4];
3943
+ assign Empty_Watermark2 = fifo2_flags[5];
3944
+ assign Almost_Empty2 = fifo2_flags[6];
3945
+ assign Empty2 = fifo2_flags[7];
3946
+
3947
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
3948
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
3949
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
3950
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
3951
+
3952
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
3953
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
3954
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
3955
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
3956
+
3957
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
3958
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
3959
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
3960
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
3961
+
3962
+ generate
3963
+ if (WR1_DATA_WIDTH == 18) begin
3964
+ assign in_reg1[17:0] = DIN1[17:0];
3965
+ end else if (WR1_DATA_WIDTH == 9) begin
3966
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
3967
+ end else begin
3968
+ assign in_reg1[17:WR1_DATA_WIDTH] = 0;
3969
+ assign in_reg1[WR1_DATA_WIDTH-1:0] = DIN1[WR1_DATA_WIDTH-1:0];
3970
+ end
3971
+ endgenerate
3972
+
3973
+ generate
3974
+ if (RD1_DATA_WIDTH == 9) begin
3975
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
3976
+ end else begin
3977
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = out_reg1[RD1_DATA_WIDTH-1:0];
3978
+ end
3979
+ endgenerate
3980
+
3981
+ generate
3982
+ if (WR2_DATA_WIDTH == 18) begin
3983
+ assign in_reg2[17:0] = DIN2[17:0];
3984
+ end else if (WR2_DATA_WIDTH == 9) begin
3985
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
3986
+ end else begin
3987
+ assign in_reg2[17:WR2_DATA_WIDTH] = 0;
3988
+ assign in_reg2[WR2_DATA_WIDTH-1:0] = DIN2[WR2_DATA_WIDTH-1:0];
3989
+ end
3990
+ endgenerate
3991
+
3992
+ generate
3993
+ if (RD2_DATA_WIDTH == 9) begin
3994
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
3995
+ end else begin
3996
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = out_reg2[RD2_DATA_WIDTH-1:0];
3997
+ end
3998
+ endgenerate
3999
+
4000
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
4001
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
4002
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
4003
+ };
4004
+
4005
+ (* is_fifo = 1 *)
4006
+ (* sync_fifo = 1 *)
4007
+ (* is_split = 0 *)
4008
+ (* is_inferred = 0 *)
4009
+ (* port_a_dwidth = PORT_A1_WRWIDTH *)
4010
+ (* port_b_dwidth = PORT_B1_WRWIDTH *)
4011
+ TDP36K _TECHMAP_REPLACE_ (
4012
+ .RESET_ni(1'b1),
4013
+ .WDATA_A1_i(in_reg1[17:0]),
4014
+ .WDATA_A2_i(in_reg2[17:0]),
4015
+ .RDATA_A1_o(fifo1_flags),
4016
+ .RDATA_A2_o(fifo2_flags),
4017
+ .ADDR_A1_i(14'h0),
4018
+ .ADDR_A2_i(14'h0),
4019
+ .CLK_A1_i(Push_Clk1),
4020
+ .CLK_A2_i(Push_Clk2),
4021
+ .REN_A1_i(1'b1),
4022
+ .REN_A2_i(1'b1),
4023
+ .WEN_A1_i(PUSH1),
4024
+ .WEN_A2_i(PUSH2),
4025
+ .BE_A1_i(2'b11),
4026
+ .BE_A2_i(2'b11),
4027
+
4028
+ .WDATA_B1_i(18'h0),
4029
+ .WDATA_B2_i(18'h0),
4030
+ .RDATA_B1_o(out_reg1[17:0]),
4031
+ .RDATA_B2_o(out_reg2[17:0]),
4032
+ .ADDR_B1_i(14'h0),
4033
+ .ADDR_B2_i(14'h0),
4034
+ .CLK_B1_i(Pop_Clk1),
4035
+ .CLK_B2_i(Pop_Clk2),
4036
+ .REN_B1_i(POP1),
4037
+ .REN_B2_i(POP2),
4038
+ .WEN_B1_i(1'b0),
4039
+ .WEN_B2_i(1'b0),
4040
+ .BE_B1_i(2'b11),
4041
+ .BE_B2_i(2'b11),
4042
+
4043
+ .FLUSH1_i(Async_Flush1),
4044
+ .FLUSH2_i(Async_Flush2)
4045
+ );
4046
+
4047
+ endmodule
4048
+
4049
+
4050
+ module BRAM2x18_AFIFO (
4051
+ DIN1,
4052
+ PUSH1,
4053
+ POP1,
4054
+ Push_Clk1,
4055
+ Pop_Clk1,
4056
+ Async_Flush1,
4057
+ Overrun_Error1,
4058
+ Full_Watermark1,
4059
+ Almost_Full1,
4060
+ Full1,
4061
+ Underrun_Error1,
4062
+ Empty_Watermark1,
4063
+ Almost_Empty1,
4064
+ Empty1,
4065
+ DOUT1,
4066
+
4067
+ DIN2,
4068
+ PUSH2,
4069
+ POP2,
4070
+ Push_Clk2,
4071
+ Pop_Clk2,
4072
+ Async_Flush2,
4073
+ Overrun_Error2,
4074
+ Full_Watermark2,
4075
+ Almost_Full2,
4076
+ Full2,
4077
+ Underrun_Error2,
4078
+ Empty_Watermark2,
4079
+ Almost_Empty2,
4080
+ Empty2,
4081
+ DOUT2
4082
+ );
4083
+
4084
+ parameter WR1_DATA_WIDTH = 18;
4085
+ parameter RD1_DATA_WIDTH = 18;
4086
+
4087
+ parameter WR2_DATA_WIDTH = 18;
4088
+ parameter RD2_DATA_WIDTH = 18;
4089
+
4090
+ parameter UPAE_DBITS1 = 12'd10;
4091
+ parameter UPAF_DBITS1 = 12'd10;
4092
+
4093
+ parameter UPAE_DBITS2 = 11'd10;
4094
+ parameter UPAF_DBITS2 = 11'd10;
4095
+
4096
+ input Push_Clk1, Pop_Clk1;
4097
+ input PUSH1, POP1;
4098
+ input [WR1_DATA_WIDTH-1:0] DIN1;
4099
+ input Async_Flush1;
4100
+ output [RD1_DATA_WIDTH-1:0] DOUT1;
4101
+ output Almost_Full1, Almost_Empty1;
4102
+ output Full1, Empty1;
4103
+ output Full_Watermark1, Empty_Watermark1;
4104
+ output Overrun_Error1, Underrun_Error1;
4105
+
4106
+ input Push_Clk2, Pop_Clk2;
4107
+ input PUSH2, POP2;
4108
+ input [WR2_DATA_WIDTH-1:0] DIN2;
4109
+ input Async_Flush2;
4110
+ output [RD2_DATA_WIDTH-1:0] DOUT2;
4111
+ output Almost_Full2, Almost_Empty2;
4112
+ output Full2, Empty2;
4113
+ output Full_Watermark2, Empty_Watermark2;
4114
+ output Overrun_Error2, Underrun_Error2;
4115
+
4116
+ // Fixed mode settings
4117
+ localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
4118
+ localparam [ 0:0] FMODE1_i = 1'd1;
4119
+ localparam [ 0:0] POWERDN1_i = 1'd0;
4120
+ localparam [ 0:0] SLEEP1_i = 1'd0;
4121
+ localparam [ 0:0] PROTECT1_i = 1'd0;
4122
+ localparam [11:0] UPAE1_i = UPAE_DBITS1;
4123
+ localparam [11:0] UPAF1_i = UPAF_DBITS1;
4124
+
4125
+ localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
4126
+ localparam [ 0:0] FMODE2_i = 1'd1;
4127
+ localparam [ 0:0] POWERDN2_i = 1'd0;
4128
+ localparam [ 0:0] SLEEP2_i = 1'd0;
4129
+ localparam [ 0:0] PROTECT2_i = 1'd0;
4130
+ localparam [10:0] UPAE2_i = UPAE_DBITS2;
4131
+ localparam [10:0] UPAF2_i = UPAF_DBITS2;
4132
+
4133
+ // Width mode function
4134
+ function [2:0] mode;
4135
+ input integer width;
4136
+ case (width)
4137
+ 1: mode = 3'b101;
4138
+ 2: mode = 3'b110;
4139
+ 4: mode = 3'b100;
4140
+ 8,9: mode = 3'b001;
4141
+ 16, 18: mode = 3'b010;
4142
+ 32, 36: mode = 3'b011;
4143
+ default: mode = 3'b000;
4144
+ endcase
4145
+ endfunction
4146
+
4147
+ function integer rwmode;
4148
+ input integer rwwidth;
4149
+ case (rwwidth)
4150
+ 1: rwmode = 1;
4151
+ 2: rwmode = 2;
4152
+ 4: rwmode = 4;
4153
+ 8,9: rwmode = 9;
4154
+ 16, 18: rwmode = 18;
4155
+ default: rwmode = 18;
4156
+ endcase
4157
+ endfunction
4158
+
4159
+ wire [17:0] in_reg1;
4160
+ wire [17:0] out_reg1;
4161
+ wire [17:0] fifo1_flags;
4162
+
4163
+ wire [17:0] in_reg2;
4164
+ wire [17:0] out_reg2;
4165
+ wire [17:0] fifo2_flags;
4166
+
4167
+ wire Push_Clk1, Pop_Clk1;
4168
+ wire Push_Clk2, Pop_Clk2;
4169
+
4170
+ assign Overrun_Error1 = fifo1_flags[0];
4171
+ assign Full_Watermark1 = fifo1_flags[1];
4172
+ assign Almost_Full1 = fifo1_flags[2];
4173
+ assign Full1 = fifo1_flags[3];
4174
+ assign Underrun_Error1 = fifo1_flags[4];
4175
+ assign Empty_Watermark1 = fifo1_flags[5];
4176
+ assign Almost_Empty1 = fifo1_flags[6];
4177
+ assign Empty1 = fifo1_flags[7];
4178
+
4179
+ assign Overrun_Error2 = fifo2_flags[0];
4180
+ assign Full_Watermark2 = fifo2_flags[1];
4181
+ assign Almost_Full2 = fifo2_flags[2];
4182
+ assign Full2 = fifo2_flags[3];
4183
+ assign Underrun_Error2 = fifo2_flags[4];
4184
+ assign Empty_Watermark2 = fifo2_flags[5];
4185
+ assign Almost_Empty2 = fifo2_flags[6];
4186
+ assign Empty2 = fifo2_flags[7];
4187
+
4188
+ localparam [ 2:0] RMODE_A1_i = mode(WR1_DATA_WIDTH);
4189
+ localparam [ 2:0] WMODE_A1_i = mode(WR1_DATA_WIDTH);
4190
+ localparam [ 2:0] RMODE_A2_i = mode(WR2_DATA_WIDTH);
4191
+ localparam [ 2:0] WMODE_A2_i = mode(WR2_DATA_WIDTH);
4192
+
4193
+ localparam [ 2:0] RMODE_B1_i = mode(RD1_DATA_WIDTH);
4194
+ localparam [ 2:0] WMODE_B1_i = mode(RD1_DATA_WIDTH);
4195
+ localparam [ 2:0] RMODE_B2_i = mode(RD2_DATA_WIDTH);
4196
+ localparam [ 2:0] WMODE_B2_i = mode(RD2_DATA_WIDTH);
4197
+
4198
+ localparam PORT_A1_WRWIDTH = rwmode(WR1_DATA_WIDTH);
4199
+ localparam PORT_B1_WRWIDTH = rwmode(RD1_DATA_WIDTH);
4200
+ localparam PORT_A2_WRWIDTH = rwmode(WR2_DATA_WIDTH);
4201
+ localparam PORT_B2_WRWIDTH = rwmode(RD2_DATA_WIDTH);
4202
+
4203
+ generate
4204
+ if (WR1_DATA_WIDTH == 18) begin
4205
+ assign in_reg1[17:0] = DIN1[17:0];
4206
+ end else if (WR1_DATA_WIDTH == 9) begin
4207
+ assign in_reg1[17:0] = {1'b0, DIN1[8], 8'h0, DIN1[7:0]};
4208
+ end else begin
4209
+ assign in_reg1[17:WR1_DATA_WIDTH] = 0;
4210
+ assign in_reg1[WR1_DATA_WIDTH-1:0] = DIN1[WR1_DATA_WIDTH-1:0];
4211
+ end
4212
+ endgenerate
4213
+
4214
+ generate
4215
+ if (RD1_DATA_WIDTH == 9) begin
4216
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = {out_reg1[16], out_reg1[7:0]};
4217
+ end else begin
4218
+ assign DOUT1[RD1_DATA_WIDTH-1:0] = out_reg1[RD1_DATA_WIDTH-1:0];
4219
+ end
4220
+ endgenerate
4221
+
4222
+ generate
4223
+ if (WR2_DATA_WIDTH == 18) begin
4224
+ assign in_reg2[17:0] = DIN2[17:0];
4225
+ end else if (WR2_DATA_WIDTH == 9) begin
4226
+ assign in_reg2[17:0] = {1'b0, DIN2[8], 8'h0, DIN2[7:0]};
4227
+ end else begin
4228
+ assign in_reg2[17:WR2_DATA_WIDTH] = 0;
4229
+ assign in_reg2[WR2_DATA_WIDTH-1:0] = DIN2[WR2_DATA_WIDTH-1:0];
4230
+ end
4231
+ endgenerate
4232
+
4233
+ generate
4234
+ if (RD2_DATA_WIDTH == 9) begin
4235
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = {out_reg2[16], out_reg2[7:0]};
4236
+ end else begin
4237
+ assign DOUT2[RD2_DATA_WIDTH-1:0] = out_reg2[RD2_DATA_WIDTH-1:0];
4238
+ end
4239
+ endgenerate
4240
+
4241
+ defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b1,
4242
+ UPAF2_i, UPAE2_i, PROTECT2_i, SLEEP2_i, POWERDN2_i, FMODE2_i, WMODE_B2_i, WMODE_A2_i, RMODE_B2_i, RMODE_A2_i, SYNC_FIFO2_i,
4243
+ UPAF1_i, UPAE1_i, PROTECT1_i, SLEEP1_i, POWERDN1_i, FMODE1_i, WMODE_B1_i, WMODE_A1_i, RMODE_B1_i, RMODE_A1_i, SYNC_FIFO1_i
4244
+ };
4245
+
4246
+ (* is_fifo = 1 *)
4247
+ (* sync_fifo = 0 *)
4248
+ (* is_split = 0 *)
4249
+ (* is_inferred = 0 *)
4250
+ (* port_a_dwidth = PORT_A1_WRWIDTH *)
4251
+ (* port_b_dwidth = PORT_B1_WRWIDTH *)
4252
+ TDP36K _TECHMAP_REPLACE_ (
4253
+ .RESET_ni(1'b1),
4254
+ .WDATA_A1_i(in_reg1[17:0]),
4255
+ .WDATA_A2_i(in_reg2[17:0]),
4256
+ .RDATA_A1_o(fifo1_flags),
4257
+ .RDATA_A2_o(fifo2_flags),
4258
+ .ADDR_A1_i(14'h0),
4259
+ .ADDR_A2_i(14'h0),
4260
+ .CLK_A1_i(Push_Clk1),
4261
+ .CLK_A2_i(Push_Clk2),
4262
+ .REN_A1_i(1'b1),
4263
+ .REN_A2_i(1'b1),
4264
+ .WEN_A1_i(PUSH1),
4265
+ .WEN_A2_i(PUSH2),
4266
+ .BE_A1_i(2'b11),
4267
+ .BE_A2_i(2'b11),
4268
+
4269
+ .WDATA_B1_i(18'h0),
4270
+ .WDATA_B2_i(18'h0),
4271
+ .RDATA_B1_o(out_reg1[17:0]),
4272
+ .RDATA_B2_o(out_reg2[17:0]),
4273
+ .ADDR_B1_i(14'h0),
4274
+ .ADDR_B2_i(14'h0),
4275
+ .CLK_B1_i(Pop_Clk1),
4276
+ .CLK_B2_i(Pop_Clk2),
4277
+ .REN_B1_i(POP1),
4278
+ .REN_B2_i(POP2),
4279
+ .WEN_B1_i(1'b0),
4280
+ .WEN_B2_i(1'b0),
4281
+ .BE_B1_i(2'b11),
4282
+ .BE_B2_i(2'b11),
4283
+
4284
+ .FLUSH1_i(Async_Flush1),
4285
+ .FLUSH2_i(Async_Flush2)
4286
+ );
4287
+
4288
+ endmodule