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.
- yowasp_yosys/share/cmp2softlogic.v +117 -0
- yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi.cc} +3 -3
- yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi_vcd.cc} +3 -3
- yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.h → runtime/cxxrtl/capi/cxxrtl_capi_vcd.h} +3 -3
- yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl.h → runtime/cxxrtl/cxxrtl.h} +2 -1
- yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd.h → runtime/cxxrtl/cxxrtl_vcd.h} +1 -1
- yowasp_yosys/share/include/kernel/rtlil.h +3 -0
- yowasp_yosys/share/nexus/brams_map.v +6 -6
- yowasp_yosys/share/python3/ywio.py +8 -2
- yowasp_yosys/share/quicklogic/{pp3_cells_sim.v → pp3/cells_sim.v} +77 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/TDP18K_FIFO.v +344 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/arith_map.v +99 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/bram_types_sim.v +74035 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_map.v +4288 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_sim.v +10949 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/cells_sim.v +375 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_final_map.v +265 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_map.v +102 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_sim.v +4527 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/ffs_map.v +133 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams.txt +22 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams_map.v +483 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/sram1024x18_mem.v +64 -0
- yowasp_yosys/share/quicklogic/qlf_k6n10f/ufifo_ctl.v +620 -0
- yowasp_yosys/smtbmc.py +99 -55
- yowasp_yosys/witness.py +16 -7
- yowasp_yosys/yosys.wasm +0 -0
- yowasp_yosys/ywio.py +8 -2
- {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/METADATA +12 -12
- {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/RECORD +42 -28
- {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/WHEEL +1 -1
- yowasp_yosys/share/quicklogic/lut_sim.v +0 -76
- /yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.h → runtime/cxxrtl/capi/cxxrtl_capi.h} +0 -0
- /yowasp_yosys/share/quicklogic/{cells_sim.v → common/cells_sim.v} +0 -0
- /yowasp_yosys/share/quicklogic/{abc9_map.v → pp3/abc9_map.v} +0 -0
- /yowasp_yosys/share/quicklogic/{abc9_model.v → pp3/abc9_model.v} +0 -0
- /yowasp_yosys/share/quicklogic/{abc9_unmap.v → pp3/abc9_unmap.v} +0 -0
- /yowasp_yosys/share/quicklogic/{pp3_cells_map.v → pp3/cells_map.v} +0 -0
- /yowasp_yosys/share/quicklogic/{pp3_ffs_map.v → pp3/ffs_map.v} +0 -0
- /yowasp_yosys/share/quicklogic/{pp3_latches_map.v → pp3/latches_map.v} +0 -0
- /yowasp_yosys/share/quicklogic/{pp3_lut_map.v → pp3/lut_map.v} +0 -0
- {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/entry_points.txt +0 -0
- {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
|