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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. yowasp_yosys/share/cmp2softlogic.v +117 -0
  2. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi.cc} +3 -3
  3. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi_vcd.cc} +3 -3
  4. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd_capi.h → runtime/cxxrtl/capi/cxxrtl_capi_vcd.h} +3 -3
  5. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl.h → runtime/cxxrtl/cxxrtl.h} +2 -1
  6. yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_vcd.h → runtime/cxxrtl/cxxrtl_vcd.h} +1 -1
  7. yowasp_yosys/share/include/kernel/rtlil.h +3 -0
  8. yowasp_yosys/share/nexus/brams_map.v +6 -6
  9. yowasp_yosys/share/python3/ywio.py +8 -2
  10. yowasp_yosys/share/quicklogic/{pp3_cells_sim.v → pp3/cells_sim.v} +77 -0
  11. yowasp_yosys/share/quicklogic/qlf_k6n10f/TDP18K_FIFO.v +344 -0
  12. yowasp_yosys/share/quicklogic/qlf_k6n10f/arith_map.v +99 -0
  13. yowasp_yosys/share/quicklogic/qlf_k6n10f/bram_types_sim.v +74035 -0
  14. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_map.v +4288 -0
  15. yowasp_yosys/share/quicklogic/qlf_k6n10f/brams_sim.v +10949 -0
  16. yowasp_yosys/share/quicklogic/qlf_k6n10f/cells_sim.v +375 -0
  17. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_final_map.v +265 -0
  18. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_map.v +102 -0
  19. yowasp_yosys/share/quicklogic/qlf_k6n10f/dsp_sim.v +4527 -0
  20. yowasp_yosys/share/quicklogic/qlf_k6n10f/ffs_map.v +133 -0
  21. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams.txt +22 -0
  22. yowasp_yosys/share/quicklogic/qlf_k6n10f/libmap_brams_map.v +483 -0
  23. yowasp_yosys/share/quicklogic/qlf_k6n10f/sram1024x18_mem.v +64 -0
  24. yowasp_yosys/share/quicklogic/qlf_k6n10f/ufifo_ctl.v +620 -0
  25. yowasp_yosys/smtbmc.py +99 -55
  26. yowasp_yosys/witness.py +16 -7
  27. yowasp_yosys/yosys.wasm +0 -0
  28. yowasp_yosys/ywio.py +8 -2
  29. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/METADATA +12 -12
  30. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/RECORD +42 -28
  31. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/WHEEL +1 -1
  32. yowasp_yosys/share/quicklogic/lut_sim.v +0 -76
  33. /yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.h → runtime/cxxrtl/capi/cxxrtl_capi.h} +0 -0
  34. /yowasp_yosys/share/quicklogic/{cells_sim.v → common/cells_sim.v} +0 -0
  35. /yowasp_yosys/share/quicklogic/{abc9_map.v → pp3/abc9_map.v} +0 -0
  36. /yowasp_yosys/share/quicklogic/{abc9_model.v → pp3/abc9_model.v} +0 -0
  37. /yowasp_yosys/share/quicklogic/{abc9_unmap.v → pp3/abc9_unmap.v} +0 -0
  38. /yowasp_yosys/share/quicklogic/{pp3_cells_map.v → pp3/cells_map.v} +0 -0
  39. /yowasp_yosys/share/quicklogic/{pp3_ffs_map.v → pp3/ffs_map.v} +0 -0
  40. /yowasp_yosys/share/quicklogic/{pp3_latches_map.v → pp3/latches_map.v} +0 -0
  41. /yowasp_yosys/share/quicklogic/{pp3_lut_map.v → pp3/lut_map.v} +0 -0
  42. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/entry_points.txt +0 -0
  43. {yowasp_yosys-0.35.0.0.post605.dist-info → yowasp_yosys-0.36.0.8.post623.dev0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,620 @@
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
+ `default_nettype wire
18
+ module fifo_ctl (
19
+ raddr,
20
+ waddr,
21
+ fflags,
22
+ ren_o,
23
+ sync,
24
+ rmode,
25
+ wmode,
26
+ rclk,
27
+ rst_R_n,
28
+ wclk,
29
+ rst_W_n,
30
+ ren,
31
+ wen,
32
+ upaf,
33
+ upae
34
+ );
35
+ parameter ADDR_WIDTH = 11;
36
+ parameter FIFO_WIDTH = 3'd2;
37
+ parameter DEPTH = 6;
38
+ output wire [ADDR_WIDTH - 1:0] raddr;
39
+ output wire [ADDR_WIDTH - 1:0] waddr;
40
+ output wire [7:0] fflags;
41
+ output wire ren_o;
42
+ input wire sync;
43
+ input wire [1:0] rmode;
44
+ input wire [1:0] wmode;
45
+ (* clkbuf_sink *)
46
+ input wire rclk;
47
+ input wire rst_R_n;
48
+ (* clkbuf_sink *)
49
+ input wire wclk;
50
+ input wire rst_W_n;
51
+ input wire ren;
52
+ input wire wen;
53
+ input wire [ADDR_WIDTH - 1:0] upaf;
54
+ input wire [ADDR_WIDTH - 1:0] upae;
55
+ localparam ADDR_PLUS_ONE = ADDR_WIDTH + 1;
56
+ reg [ADDR_WIDTH:0] pushtopop1;
57
+ reg [ADDR_WIDTH:0] pushtopop2;
58
+ reg [ADDR_WIDTH:0] poptopush1;
59
+ reg [ADDR_WIDTH:0] poptopush2;
60
+ wire [ADDR_WIDTH:0] pushtopop0;
61
+ wire [ADDR_WIDTH:0] poptopush0;
62
+ wire [ADDR_WIDTH:0] smux_poptopush;
63
+ wire [ADDR_WIDTH:0] smux_pushtopop;
64
+ assign smux_poptopush = (sync ? poptopush0 : poptopush2);
65
+ assign smux_pushtopop = (sync ? pushtopop0 : pushtopop2);
66
+ always @(posedge rclk or negedge rst_R_n)
67
+ if (~rst_R_n) begin
68
+ pushtopop1 <= 'h0;
69
+ pushtopop2 <= 'h0;
70
+ end
71
+ else begin
72
+ pushtopop1 = pushtopop0;
73
+ pushtopop2 = pushtopop1;
74
+ end
75
+ always @(posedge wclk or negedge rst_W_n)
76
+ if (~rst_W_n) begin
77
+ poptopush1 <= 'h0;
78
+ poptopush2 <= 'h0;
79
+ end
80
+ else begin
81
+ poptopush1 <= poptopush0;
82
+ poptopush2 <= poptopush1;
83
+ end
84
+ fifo_push #(
85
+ .ADDR_WIDTH(ADDR_WIDTH),
86
+ .DEPTH(DEPTH)
87
+ ) u_fifo_push(
88
+ .wclk(wclk),
89
+ .wen(wen),
90
+ .rst_n(rst_W_n),
91
+ .rmode(rmode),
92
+ .wmode(wmode),
93
+ .gcout(pushtopop0),
94
+ .gcin(smux_poptopush),
95
+ .ff_waddr(waddr),
96
+ .pushflags(fflags[7:4]),
97
+ .upaf(upaf)
98
+ );
99
+ fifo_pop #(
100
+ .ADDR_WIDTH(ADDR_WIDTH),
101
+ .FIFO_WIDTH(FIFO_WIDTH),
102
+ .DEPTH(DEPTH)
103
+ ) u_fifo_pop(
104
+ .rclk(rclk),
105
+ .ren_in(ren),
106
+ .rst_n(rst_R_n),
107
+ .rmode(rmode),
108
+ .wmode(wmode),
109
+ .ren_o(ren_o),
110
+ .gcout(poptopush0),
111
+ .gcin(smux_pushtopop),
112
+ .out_raddr(raddr),
113
+ .popflags(fflags[3:0]),
114
+ .upae(upae)
115
+ );
116
+ endmodule
117
+ module fifo_push (
118
+ pushflags,
119
+ gcout,
120
+ ff_waddr,
121
+ rst_n,
122
+ wclk,
123
+ wen,
124
+ rmode,
125
+ wmode,
126
+ gcin,
127
+ upaf
128
+ );
129
+ parameter ADDR_WIDTH = 11;
130
+ parameter DEPTH = 6;
131
+ output wire [3:0] pushflags;
132
+ output wire [ADDR_WIDTH:0] gcout;
133
+ output wire [ADDR_WIDTH - 1:0] ff_waddr;
134
+ input rst_n;
135
+ (* clkbuf_sink *)
136
+ input wclk;
137
+ input wen;
138
+ input [1:0] rmode;
139
+ input [1:0] wmode;
140
+ input [ADDR_WIDTH:0] gcin;
141
+ input [ADDR_WIDTH - 1:0] upaf;
142
+ localparam ADDR_PLUS_ONE = ADDR_WIDTH + 1;
143
+ reg full_next;
144
+ reg full;
145
+ reg paf_next;
146
+ reg paf;
147
+ reg fmo;
148
+ reg fmo_next;
149
+ reg overflow;
150
+ reg p1;
151
+ reg p2;
152
+ reg f1;
153
+ reg f2;
154
+ reg q1;
155
+ reg q2;
156
+ reg [1:0] gmode;
157
+ reg [ADDR_WIDTH:0] waddr;
158
+ reg [ADDR_WIDTH:0] raddr;
159
+ reg [ADDR_WIDTH:0] gcout_reg;
160
+ reg [ADDR_WIDTH:0] gcout_next;
161
+ reg [ADDR_WIDTH:0] raddr_next;
162
+ reg [ADDR_WIDTH - 1:0] paf_thresh;
163
+ wire overflow_next;
164
+ wire [ADDR_WIDTH:0] waddr_next;
165
+ wire [ADDR_WIDTH:0] gc8out_next;
166
+ wire [ADDR_WIDTH - 1:0] gc16out_next;
167
+ wire [ADDR_WIDTH - 2:0] gc32out_next;
168
+ wire [ADDR_WIDTH:0] tmp;
169
+ wire [ADDR_WIDTH:0] next_count;
170
+ wire [ADDR_WIDTH:0] count;
171
+ wire [ADDR_WIDTH:0] fbytes;
172
+ genvar i;
173
+ assign next_count = fbytes - (waddr_next >= raddr_next ? waddr_next - raddr_next : (~raddr_next + waddr_next) + 1);
174
+ assign count = fbytes - (waddr >= raddr ? waddr - raddr : (~raddr + waddr) + 1);
175
+ assign fbytes = 1 << (DEPTH + 5);
176
+ always @(*) begin
177
+ paf_thresh = wmode[1] ? upaf : (wmode[0] ? upaf << 1 : upaf << 2);
178
+ end
179
+ always @(*)
180
+ case (wmode)
181
+ 2'h0, 2'h1, 2'h2: begin
182
+ full_next = (wen ? f1 : f2);
183
+ fmo_next = (wen ? p1 : p2);
184
+ paf_next = (wen ? q1 : q2);
185
+ end
186
+ default: begin
187
+ full_next = 1'b0;
188
+ fmo_next = 1'b0;
189
+ paf_next = 1'b0;
190
+ end
191
+ endcase
192
+ always @(*) begin : PUSH_FULL_FLAGS
193
+ f1 = 1'b0;
194
+ f2 = 1'b0;
195
+ p1 = 1'b0;
196
+ p2 = 1'b0;
197
+ q1 = next_count < {1'b0, paf_thresh};
198
+ q2 = count < {1'b0, paf_thresh};
199
+ case (wmode)
200
+ 2'h0:
201
+ case (DEPTH)
202
+ 3'h6: begin
203
+ f1 = {~waddr_next[11], waddr_next[10:2]} == raddr_next[11:2];
204
+ f2 = {~waddr[11], waddr[10:2]} == raddr_next[11:2];
205
+ p1 = ((waddr_next[10:2] + 1) & 9'h1ff) == raddr_next[10:2];
206
+ p2 = ((waddr[10:2] + 1) & 9'h1ff) == raddr_next[10:2];
207
+ end
208
+ 3'h5: begin
209
+ f1 = {~waddr_next[10], waddr_next[9:2]} == raddr_next[10:2];
210
+ f2 = {~waddr[10], waddr[9:2]} == raddr_next[10:2];
211
+ p1 = ((waddr_next[9:2] + 1) & 8'hff) == raddr_next[9:2];
212
+ p2 = ((waddr[9:2] + 1) & 8'hff) == raddr_next[9:2];
213
+ end
214
+ 3'h4: begin
215
+ f1 = {~waddr_next[9], waddr_next[8:2]} == raddr_next[9:2];
216
+ f2 = {~waddr[9], waddr[8:2]} == raddr_next[9:2];
217
+ p1 = ((waddr_next[8:2] + 1) & 7'h7f) == raddr_next[8:2];
218
+ p2 = ((waddr[8:2] + 1) & 7'h7f) == raddr_next[8:2];
219
+ end
220
+ 3'h3: begin
221
+ f1 = {~waddr_next[8], waddr_next[7:2]} == raddr_next[8:2];
222
+ f2 = {~waddr[8], waddr[7:2]} == raddr_next[8:2];
223
+ p1 = ((waddr_next[7:2] + 1) & 6'h3f) == raddr_next[7:2];
224
+ p2 = ((waddr[7:2] + 1) & 6'h3f) == raddr_next[7:2];
225
+ end
226
+ 3'h2: begin
227
+ f1 = {~waddr_next[7], waddr_next[6:2]} == raddr_next[7:2];
228
+ f2 = {~waddr[7], waddr[6:2]} == raddr_next[7:2];
229
+ p1 = ((waddr_next[6:2] + 1) & 5'h1f) == raddr_next[6:2];
230
+ p2 = ((waddr[6:2] + 1) & 5'h1f) == raddr_next[6:2];
231
+ end
232
+ 3'h1: begin
233
+ f1 = {~waddr_next[6], waddr_next[5:2]} == raddr_next[6:2];
234
+ f2 = {~waddr[6], waddr[5:2]} == raddr_next[6:2];
235
+ p1 = ((waddr_next[5:2] + 1) & 4'hf) == raddr_next[5:2];
236
+ p2 = ((waddr[5:2] + 1) & 4'hf) == raddr_next[5:2];
237
+ end
238
+ 3'h0: begin
239
+ f1 = {~waddr_next[5], waddr_next[4:2]} == raddr_next[5:2];
240
+ f2 = {~waddr[5], waddr[4:2]} == raddr_next[5:2];
241
+ p1 = ((waddr_next[4:2] + 1) & 3'h7) == raddr_next[4:2];
242
+ p2 = ((waddr[4:2] + 1) & 3'h7) == raddr_next[4:2];
243
+ end
244
+ 3'h7: begin
245
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:2]} == raddr_next[ADDR_WIDTH:2];
246
+ f2 = {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH - 1:2]} == raddr_next[ADDR_WIDTH:2];
247
+ p1 = ((waddr_next[ADDR_WIDTH - 1:2] + 1) & {ADDR_WIDTH - 2 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:2];
248
+ p2 = ((waddr[ADDR_WIDTH - 1:2] + 1) & {ADDR_WIDTH - 2 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:2];
249
+ end
250
+ endcase
251
+ 2'h1:
252
+ case (DEPTH)
253
+ 3'h6: begin
254
+ f1 = {~waddr_next[11], waddr_next[10:1]} == raddr_next[11:1];
255
+ f2 = {~waddr[11], waddr[10:1]} == raddr_next[11:1];
256
+ p1 = ((waddr_next[10:1] + 1) & 10'h3ff) == raddr_next[10:1];
257
+ p2 = ((waddr[10:1] + 1) & 10'h3ff) == raddr_next[10:1];
258
+ end
259
+ 3'h5: begin
260
+ f1 = {~waddr_next[10], waddr_next[9:1]} == raddr_next[10:1];
261
+ f2 = {~waddr[10], waddr[9:1]} == raddr_next[10:1];
262
+ p1 = ((waddr_next[9:1] + 1) & 9'h1ff) == raddr_next[9:1];
263
+ p2 = ((waddr[9:1] + 1) & 9'h1ff) == raddr_next[9:1];
264
+ end
265
+ 3'h4: begin
266
+ f1 = {~waddr_next[9], waddr_next[8:1]} == raddr_next[9:1];
267
+ f2 = {~waddr[9], waddr[8:1]} == raddr_next[9:1];
268
+ p1 = ((waddr_next[8:1] + 1) & 8'hff) == raddr_next[8:1];
269
+ p2 = ((waddr[8:1] + 1) & 8'hff) == raddr_next[8:1];
270
+ end
271
+ 3'h3: begin
272
+ f1 = {~waddr_next[8], waddr_next[7:1]} == raddr_next[8:1];
273
+ f2 = {~waddr[8], waddr[7:1]} == raddr_next[8:1];
274
+ p1 = ((waddr_next[7:1] + 1) & 7'h7f) == raddr_next[7:1];
275
+ p2 = ((waddr[7:1] + 1) & 7'h7f) == raddr_next[7:1];
276
+ end
277
+ 3'h2: begin
278
+ f1 = {~waddr_next[7], waddr_next[6:1]} == raddr_next[7:1];
279
+ f2 = {~waddr[7], waddr[6:1]} == raddr_next[7:1];
280
+ p1 = ((waddr_next[6:1] + 1) & 6'h3f) == raddr_next[6:1];
281
+ p2 = ((waddr[6:1] + 1) & 6'h3f) == raddr_next[6:1];
282
+ end
283
+ 3'h1: begin
284
+ f1 = {~waddr_next[6], waddr_next[5:1]} == raddr_next[6:1];
285
+ f2 = {~waddr[6], waddr[5:1]} == raddr_next[6:1];
286
+ p1 = ((waddr_next[5:1] + 1) & 5'h1f) == raddr_next[5:1];
287
+ p2 = ((waddr[5:1] + 1) & 5'h1f) == raddr_next[5:1];
288
+ end
289
+ 3'h0: begin
290
+ f1 = {~waddr_next[5], waddr_next[4:1]} == raddr_next[5:1];
291
+ f2 = {~waddr[5], waddr[4:1]} == raddr_next[5:1];
292
+ p1 = ((waddr_next[4:1] + 1) & 4'hf) == raddr_next[4:1];
293
+ p2 = ((waddr[4:1] + 1) & 4'hf) == raddr_next[4:1];
294
+ end
295
+ 3'h7: begin
296
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:1]} == raddr_next[ADDR_WIDTH:1];
297
+ f2 = {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH - 1:1]} == raddr_next[ADDR_WIDTH:1];
298
+ p1 = ((waddr_next[ADDR_WIDTH - 1:1] + 1) & {ADDR_WIDTH - 1 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:1];
299
+ p2 = ((waddr[ADDR_WIDTH - 1:1] + 1) & {ADDR_WIDTH - 1 {1'b1}}) == raddr_next[ADDR_WIDTH - 1:1];
300
+ end
301
+ endcase
302
+ 2'h2:
303
+ case (DEPTH)
304
+ 3'h6: begin
305
+ f1 = {~waddr_next[11], waddr_next[10:0]} == raddr_next[11:0];
306
+ f2 = {~waddr[11], waddr[10:0]} == raddr_next[11:0];
307
+ p1 = ((waddr_next[10:0] + 1) & 11'h7ff) == raddr_next[10:0];
308
+ p2 = ((waddr[10:0] + 1) & 11'h7ff) == raddr_next[10:0];
309
+ end
310
+ 3'h5: begin
311
+ f1 = {~waddr_next[10], waddr_next[9:0]} == raddr_next[10:0];
312
+ f2 = {~waddr[10], waddr[9:0]} == raddr_next[10:0];
313
+ p1 = ((waddr_next[9:0] + 1) & 10'h3ff) == raddr_next[9:0];
314
+ p2 = ((waddr[9:0] + 1) & 10'h3ff) == raddr_next[9:0];
315
+ end
316
+ 3'h4: begin
317
+ f1 = {~waddr_next[9], waddr_next[8:0]} == raddr_next[9:0];
318
+ f2 = {~waddr[9], waddr[8:0]} == raddr_next[9:0];
319
+ p1 = ((waddr_next[8:0] + 1) & 9'h1ff) == raddr_next[8:0];
320
+ p2 = ((waddr[8:0] + 1) & 9'h1ff) == raddr_next[8:0];
321
+ end
322
+ 3'h3: begin
323
+ f1 = {~waddr_next[8], waddr_next[7:0]} == raddr_next[8:0];
324
+ f2 = {~waddr[8], waddr[7:0]} == raddr_next[8:0];
325
+ p1 = ((waddr_next[7:0] + 1) & 8'hff) == raddr_next[7:0];
326
+ p2 = ((waddr[7:0] + 1) & 8'hff) == raddr_next[7:0];
327
+ end
328
+ 3'h2: begin
329
+ f1 = {~waddr_next[7], waddr_next[6:0]} == raddr_next[7:0];
330
+ f2 = {~waddr[7], waddr[6:0]} == raddr_next[7:0];
331
+ p1 = ((waddr_next[6:0] + 1) & 7'h7f) == raddr_next[6:0];
332
+ p2 = ((waddr[6:0] + 1) & 7'h7f) == raddr_next[6:0];
333
+ end
334
+ 3'h1: begin
335
+ f1 = {~waddr_next[6], waddr_next[5:0]} == raddr_next[6:0];
336
+ f2 = {~waddr[6], waddr[5:0]} == raddr_next[6:0];
337
+ p1 = ((waddr_next[5:0] + 1) & 6'h3f) == raddr_next[5:0];
338
+ p2 = ((waddr[5:0] + 1) & 6'h3f) == raddr_next[5:0];
339
+ end
340
+ 3'h0: begin
341
+ f1 = {~waddr_next[5], waddr_next[4:0]} == raddr_next[5:0];
342
+ f2 = {~waddr[5], waddr[4:0]} == raddr_next[5:0];
343
+ p1 = ((waddr_next[4:0] + 1) & 5'h1f) == raddr_next[4:0];
344
+ p2 = ((waddr[4:0] + 1) & 5'h1f) == raddr_next[4:0];
345
+ end
346
+ 3'h7: begin
347
+ f1 = {~waddr_next[ADDR_WIDTH], waddr_next[ADDR_WIDTH - 1:0]} == raddr_next[ADDR_WIDTH:0];
348
+ f2 = {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH - 1:0]} == raddr_next[ADDR_WIDTH:0];
349
+ p1 = ((waddr_next[ADDR_WIDTH - 1:0] + 1) & {ADDR_WIDTH {1'b1}}) == raddr_next[ADDR_WIDTH - 1:0];
350
+ p2 = ((waddr[ADDR_WIDTH - 1:0] + 1) & {ADDR_WIDTH {1'b1}}) == raddr_next[ADDR_WIDTH - 1:0];
351
+ end
352
+ endcase
353
+ 2'h3: begin
354
+ f1 = 1'b0;
355
+ f2 = 1'b0;
356
+ p1 = 1'b0;
357
+ p2 = 1'b0;
358
+ end
359
+ endcase
360
+ end
361
+ always @(*)
362
+ case (wmode)
363
+ 2'h0: gmode = 2'h0;
364
+ 2'h1: gmode = (rmode == 2'h0 ? 2'h0 : 2'h1);
365
+ 2'h2: gmode = (rmode == 2'h2 ? 2'h2 : rmode);
366
+ 2'h3: gmode = 2'h3;
367
+ endcase
368
+ assign gc8out_next = (waddr_next >> 1) ^ waddr_next;
369
+ assign gc16out_next = (waddr_next >> 2) ^ (waddr_next >> 1);
370
+ assign gc32out_next = (waddr_next >> 3) ^ (waddr_next >> 2);
371
+ always @(*)
372
+ if (wen)
373
+ case (gmode)
374
+ 2'h2: gcout_next = gc8out_next;
375
+ 2'h1: gcout_next = {1'b0, gc16out_next};
376
+ 2'h0: gcout_next = {2'b00, gc32out_next};
377
+ default: gcout_next = {ADDR_PLUS_ONE {1'b0}};
378
+ endcase
379
+ else
380
+ gcout_next = {ADDR_PLUS_ONE {1'b0}};
381
+ always @(posedge wclk or negedge rst_n)
382
+ if (~rst_n) begin
383
+ full <= 1'b0;
384
+ fmo <= 1'b0;
385
+ paf <= 1'b0;
386
+ raddr <= {ADDR_PLUS_ONE {1'b0}};
387
+ end
388
+ else begin
389
+ full <= full_next;
390
+ fmo <= fmo_next;
391
+ paf <= paf_next;
392
+ case (gmode)
393
+ 0: raddr <= raddr_next & {{ADDR_WIDTH - 1 {1'b1}}, 2'b00};
394
+ 1: raddr <= raddr_next & {{ADDR_WIDTH {1'b1}}, 1'b0};
395
+ 2: raddr <= raddr_next & {ADDR_WIDTH + 1 {1'b1}};
396
+ 3: raddr <= 12'h000;
397
+ endcase
398
+ end
399
+ assign overflow_next = full & wen;
400
+ always @(posedge wclk or negedge rst_n)
401
+ if (~rst_n)
402
+ overflow <= 1'b0;
403
+ else if (wen == 1'b1)
404
+ overflow <= overflow_next;
405
+ always @(posedge wclk or negedge rst_n)
406
+ if (~rst_n) begin
407
+ waddr <= {ADDR_WIDTH + 1 {1'b0}};
408
+ gcout_reg <= {ADDR_WIDTH + 1 {1'b0}};
409
+ end
410
+ else if (wen == 1'b1) begin
411
+ waddr <= waddr_next;
412
+ gcout_reg <= gcout_next;
413
+ end
414
+ assign gcout = gcout_reg;
415
+ generate
416
+ for (i = 0; i < (ADDR_WIDTH + 1); i = i + 1) begin : genblk1
417
+ assign tmp[i] = ^(gcin >> i);
418
+ end
419
+ endgenerate
420
+ always @(*)
421
+ case (gmode)
422
+ 2'h0: raddr_next = {tmp[ADDR_WIDTH - 2:0], 2'b00} & {{ADDR_WIDTH - 1 {1'b1}}, 2'b00};
423
+ 2'h1: raddr_next = {tmp[ADDR_WIDTH - 1:0], 1'b0} & {{ADDR_WIDTH {1'b1}}, 1'b0};
424
+ 2'h2: raddr_next = {tmp[ADDR_WIDTH:0]} & {ADDR_WIDTH + 1 {1'b1}};
425
+ default: raddr_next = {ADDR_WIDTH + 1 {1'b0}};
426
+ endcase
427
+ assign ff_waddr = waddr[ADDR_WIDTH - 1:0];
428
+ assign pushflags = {full, fmo, paf, overflow};
429
+ assign waddr_next = waddr + (wmode == 2'h0 ? 'h4 : (wmode == 2'h1 ? 'h2 : 'h1));
430
+ endmodule
431
+ module fifo_pop (
432
+ ren_o,
433
+ popflags,
434
+ out_raddr,
435
+ gcout,
436
+ rst_n,
437
+ rclk,
438
+ ren_in,
439
+ rmode,
440
+ wmode,
441
+ gcin,
442
+ upae
443
+ );
444
+ parameter ADDR_WIDTH = 11;
445
+ parameter FIFO_WIDTH = 3'd2;
446
+ parameter DEPTH = 6;
447
+ output wire ren_o;
448
+ output wire [3:0] popflags;
449
+ output reg [ADDR_WIDTH - 1:0] out_raddr;
450
+ output wire [ADDR_WIDTH:0] gcout;
451
+ input rst_n;
452
+ (* clkbuf_sink *)
453
+ input rclk;
454
+ input ren_in;
455
+ input [1:0] rmode;
456
+ input [1:0] wmode;
457
+ input [ADDR_WIDTH:0] gcin;
458
+ input [ADDR_WIDTH - 1:0] upae;
459
+ localparam ADDR_PLUS_ONE = ADDR_WIDTH + 1;
460
+ reg empty;
461
+ reg epo;
462
+ reg pae;
463
+ reg underflow;
464
+ reg e1;
465
+ reg e2;
466
+ reg o1;
467
+ reg o2;
468
+ reg q1;
469
+ reg q2;
470
+ reg [1:0] bwl_sel;
471
+ reg [1:0] gmode;
472
+ reg [ADDR_WIDTH - 1:0] ff_raddr;
473
+ reg [ADDR_WIDTH:0] waddr;
474
+ reg [ADDR_WIDTH:0] raddr;
475
+ reg [ADDR_WIDTH:0] gcout_reg;
476
+ reg [ADDR_WIDTH:0] gcout_next;
477
+ reg [ADDR_WIDTH:0] waddr_next;
478
+ reg [ADDR_WIDTH - 1:0] pae_thresh;
479
+ wire ren_out;
480
+ wire empty_next;
481
+ wire pae_next;
482
+ wire epo_next;
483
+ wire [ADDR_WIDTH - 2:0] gc32out_next;
484
+ wire [ADDR_WIDTH - 1:0] gc16out_next;
485
+ wire [ADDR_WIDTH:0] gc8out_next;
486
+ wire [ADDR_WIDTH:0] raddr_next;
487
+ wire [ADDR_WIDTH - 1:0] ff_raddr_next;
488
+ wire [ADDR_WIDTH:0] tmp;
489
+ wire [ADDR_PLUS_ONE:0] next_count;
490
+ wire [ADDR_PLUS_ONE:0] count;
491
+ wire [ADDR_PLUS_ONE:0] fbytes;
492
+ genvar i;
493
+ assign next_count = waddr - raddr_next;
494
+ assign count = waddr - raddr;
495
+ assign fbytes = 1 << (DEPTH + 5);
496
+ always @(*) pae_thresh = rmode[1] ? upae : (rmode[0] ? upae << 1 : upae << 2);
497
+ assign ren_out = (empty ? 1'b1 : ren_in);
498
+ always @(*)
499
+ case (rmode)
500
+ 2'h0: gmode = 2'h0;
501
+ 2'h1: gmode = (wmode == 2'h0 ? 2'h0 : 2'h1);
502
+ 2'h2: gmode = (wmode == 2'h2 ? 2'h2 : wmode);
503
+ 2'h3: gmode = 2'h3;
504
+ endcase
505
+ always @(*) begin
506
+ e1 = 1'b0;
507
+ e2 = 1'b0;
508
+ o1 = 1'b0;
509
+ o2 = 1'b0;
510
+ q1 = next_count < {1'b0, pae_thresh};
511
+ q2 = count < {1'b0, pae_thresh};
512
+ case (rmode)
513
+ 2'h0: begin
514
+ e1 = raddr_next[ADDR_WIDTH:2] == waddr_next[ADDR_WIDTH:2];
515
+ e2 = raddr[ADDR_WIDTH:2] == waddr_next[ADDR_WIDTH:2];
516
+ o1 = (raddr_next[ADDR_WIDTH:2] + 1) == waddr_next[ADDR_WIDTH:2];
517
+ o2 = (raddr[ADDR_WIDTH:2] + 1) == waddr_next[ADDR_WIDTH:2];
518
+ end
519
+ 2'h1: begin
520
+ e1 = raddr_next[ADDR_WIDTH:1] == waddr_next[ADDR_WIDTH:1];
521
+ e2 = raddr[ADDR_WIDTH:1] == waddr_next[ADDR_WIDTH:1];
522
+ o1 = (raddr_next[ADDR_WIDTH:1] + 1) == waddr_next[ADDR_WIDTH:1];
523
+ o2 = (raddr[ADDR_WIDTH:1] + 1) == waddr_next[ADDR_WIDTH:1];
524
+ end
525
+ 2'h2: begin
526
+ e1 = raddr_next[ADDR_WIDTH:0] == waddr_next[ADDR_WIDTH:0];
527
+ e2 = raddr[ADDR_WIDTH:0] == waddr_next[ADDR_WIDTH:0];
528
+ o1 = (raddr_next[ADDR_WIDTH:0] + 1) == waddr_next[ADDR_WIDTH:0];
529
+ o2 = (raddr[ADDR_WIDTH:0] + 1) == waddr_next[11:0];
530
+ end
531
+ 2'h3: begin
532
+ e1 = 1'b0;
533
+ e2 = 1'b0;
534
+ o1 = 1'b0;
535
+ o2 = 1'b0;
536
+ end
537
+ endcase
538
+ end
539
+ assign empty_next = (ren_in & !empty ? e1 : e2);
540
+ assign epo_next = (ren_in & !empty ? o1 : o2);
541
+ assign pae_next = (ren_in & !empty ? q1 : q2);
542
+ always @(posedge rclk or negedge rst_n)
543
+ if (~rst_n) begin
544
+ empty <= 1'b1;
545
+ pae <= 1'b1;
546
+ epo <= 1'b0;
547
+ end
548
+ else begin
549
+ empty <= empty_next;
550
+ pae <= pae_next;
551
+ epo <= epo_next;
552
+ end
553
+ assign gc8out_next = (raddr_next >> 1) ^ raddr_next;
554
+ assign gc16out_next = (raddr_next >> 2) ^ (raddr_next >> 1);
555
+ assign gc32out_next = (raddr_next >> 3) ^ (raddr_next >> 2);
556
+ always @(*)
557
+ if (ren_in)
558
+ case (gmode)
559
+ 2'h2: gcout_next = gc8out_next;
560
+ 2'h1: gcout_next = {1'b0, gc16out_next};
561
+ 2'h0: gcout_next = {2'b00, gc32out_next};
562
+ default: gcout_next = 'h0;
563
+ endcase
564
+ else
565
+ gcout_next = 'h0;
566
+ always @(posedge rclk or negedge rst_n)
567
+ if (~rst_n)
568
+ waddr <= 12'h000;
569
+ else
570
+ waddr <= waddr_next;
571
+ always @(posedge rclk or negedge rst_n)
572
+ if (~rst_n) begin
573
+ underflow <= 1'b0;
574
+ bwl_sel <= 2'h0;
575
+ gcout_reg <= 12'h000;
576
+ end
577
+ else if (ren_in) begin
578
+ underflow <= empty;
579
+ if (!empty) begin
580
+ bwl_sel <= raddr_next[1:0];
581
+ gcout_reg <= gcout_next;
582
+ end
583
+ end
584
+ generate
585
+ for (i = 0; i < (ADDR_WIDTH + 1); i = i + 1) begin : genblk1
586
+ assign tmp[i] = ^(gcin >> i);
587
+ end
588
+ endgenerate
589
+ always @(*)
590
+ case (gmode)
591
+ 2'h0: waddr_next = {tmp[ADDR_WIDTH - 2:0], 2'b00} & {{ADDR_WIDTH - 1 {1'b1}}, 2'b00};
592
+ 2'h1: waddr_next = {tmp[ADDR_WIDTH - 1:0], 1'b0} & {{ADDR_WIDTH {1'b1}}, 1'b0};
593
+ 2'h2: waddr_next = {tmp[ADDR_WIDTH:0]} & {ADDR_PLUS_ONE {1'b1}};
594
+ default: waddr_next = {ADDR_PLUS_ONE {1'b0}};
595
+ endcase
596
+ assign ff_raddr_next = ff_raddr + (rmode == 2'h0 ? 'h4 : (rmode == 2'h1 ? 'h2 : 'h1));
597
+ assign raddr_next = raddr + (rmode == 2'h0 ? 'h4 : (rmode == 2'h1 ? 'h2 : 'h1));
598
+ always @(posedge rclk or negedge rst_n)
599
+ if (~rst_n)
600
+ ff_raddr <= 1'sb0;
601
+ else if (empty & ~empty_next)
602
+ ff_raddr <= raddr_next[ADDR_WIDTH - 1:0];
603
+ else if ((ren_in & !empty) & ~empty_next)
604
+ ff_raddr <= ff_raddr_next;
605
+ always @(posedge rclk or negedge rst_n)
606
+ if (~rst_n)
607
+ raddr <= 12'h000;
608
+ else if (ren_in & !empty)
609
+ raddr <= raddr_next;
610
+ always @(*)
611
+ case (FIFO_WIDTH)
612
+ 3'h2: out_raddr = {ff_raddr[ADDR_WIDTH - 1:1], bwl_sel[0]};
613
+ 3'h4: out_raddr = {ff_raddr[ADDR_WIDTH - 1:2], bwl_sel};
614
+ default: out_raddr = ff_raddr[ADDR_WIDTH - 1:0];
615
+ endcase
616
+ assign ren_o = ren_out;
617
+ assign gcout = gcout_reg;
618
+ assign popflags = {empty, epo, pae, underflow};
619
+ endmodule
620
+ `default_nettype none