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,117 @@
1
+ module constgtge(C, A, B, Y);
2
+ parameter A_WIDTH = 0;
3
+ parameter B_WIDTH = 0;
4
+
5
+ (* force_downto *)
6
+ input [A_WIDTH-1:0] A;
7
+ (* force_downto *)
8
+ input [B_WIDTH-1:0] B;
9
+ output Y;
10
+ input C;
11
+
12
+ wire [A_WIDTH:0] ch;
13
+ genvar n;
14
+ generate
15
+ if (B_WIDTH > A_WIDTH) begin
16
+ // Fail
17
+ end else begin
18
+ assign ch[0] = C;
19
+ for (n = 0; n < A_WIDTH; n = n + 1) begin
20
+ if (n < B_WIDTH) begin
21
+ assign ch[n + 1] = B[n] ? (ch[n] && A[n]) : (ch[n] || A[n]);
22
+ end else begin
23
+ assign ch[n + 1] = ch[n] || A[n];
24
+ end
25
+ end
26
+ assign Y = ch[A_WIDTH];
27
+ end
28
+ endgenerate
29
+ endmodule
30
+
31
+ module constltle(C, A, B, Y);
32
+ parameter A_WIDTH = 0;
33
+ parameter B_WIDTH = 0;
34
+
35
+ (* force_downto *)
36
+ input [A_WIDTH-1:0] A;
37
+ (* force_downto *)
38
+ input [B_WIDTH-1:0] B;
39
+ output Y;
40
+ input C;
41
+
42
+ wire [A_WIDTH:0] ch;
43
+ genvar n;
44
+ generate
45
+ if (B_WIDTH > A_WIDTH) begin
46
+ // Fail
47
+ end else begin
48
+ assign ch[0] = C;
49
+ for (n = 0; n < A_WIDTH; n = n + 1) begin
50
+ if (n < B_WIDTH) begin
51
+ assign ch[n + 1] = !B[n] ? (ch[n] && !A[n]) : (ch[n] || !A[n]);
52
+ end else begin
53
+ assign ch[n + 1] = ch[n] && !A[n];
54
+ end
55
+ end
56
+ assign Y = ch[A_WIDTH];
57
+ end
58
+ endgenerate
59
+ endmodule
60
+
61
+ (* techmap_celltype = "$ge $gt $le $lt" *)
62
+ module _map_const_cmp_(A, B, Y);
63
+ parameter A_WIDTH = 0;
64
+ parameter B_WIDTH = 0;
65
+ parameter Y_WIDTH = 0;
66
+ parameter A_SIGNED = 0;
67
+ parameter B_SIGNED = 0;
68
+
69
+ (* force_downto *)
70
+ input [A_WIDTH-1:0] A;
71
+ (* force_downto *)
72
+ input [B_WIDTH-1:0] B;
73
+ (* force_downto *)
74
+ output [Y_WIDTH-1:0] Y;
75
+
76
+ parameter _TECHMAP_CELLTYPE_ = "";
77
+
78
+ parameter _TECHMAP_CONSTMSK_A_ = 0;
79
+ parameter _TECHMAP_CONSTVAL_A_ = 0;
80
+ parameter _TECHMAP_CONSTMSK_B_ = 0;
81
+ parameter _TECHMAP_CONSTVAL_B_ = 0;
82
+
83
+ wire [1023:0] _TECHMAP_DO_ = "opt -fast;";
84
+
85
+ wire [A_WIDTH:0] ch;
86
+
87
+ genvar n;
88
+ generate
89
+ if (Y_WIDTH != 1 || A_SIGNED || B_SIGNED)
90
+ wire _TECHMAP_FAIL_ = 1;
91
+ else if (&_TECHMAP_CONSTMSK_A_) begin
92
+ if (A_WIDTH > B_WIDTH)
93
+ wire _TECHMAP_FAIL_ = 1;
94
+ else if (_TECHMAP_CELLTYPE_ == "$lt" || _TECHMAP_CELLTYPE_ == "$le")
95
+ constgtge #(.A_WIDTH(B_WIDTH), .B_WIDTH(A_WIDTH))
96
+ _TECHMAP_REPLACE_(.A(B), .B(A), .Y(Y),
97
+ .C(_TECHMAP_CELLTYPE_ == "$lt"));
98
+ else
99
+ constltle #(.A_WIDTH(B_WIDTH), .B_WIDTH(A_WIDTH))
100
+ _TECHMAP_REPLACE_(.A(B), .B(A), .Y(Y),
101
+ .C(_TECHMAP_CELLTYPE_ == "$gt"));
102
+ end else if (&_TECHMAP_CONSTMSK_B_) begin
103
+ if (B_WIDTH > A_WIDTH)
104
+ wire _TECHMAP_FAIL_ = 1;
105
+ else if (_TECHMAP_CELLTYPE_ == "$lt" || _TECHMAP_CELLTYPE_ == "$le")
106
+ constltle #(.A_WIDTH(A_WIDTH), .B_WIDTH(B_WIDTH))
107
+ _TECHMAP_REPLACE_(.A(A), .B(B), .Y(Y),
108
+ .C(_TECHMAP_CELLTYPE_ == "$le"));
109
+ else
110
+ constgtge #(.A_WIDTH(A_WIDTH), .B_WIDTH(B_WIDTH))
111
+ _TECHMAP_REPLACE_(.A(A), .B(B), .Y(Y),
112
+ .C(_TECHMAP_CELLTYPE_ == "$ge"));
113
+ end else
114
+ wire _TECHMAP_FAIL_ = 1;
115
+ endgenerate
116
+
117
+ endmodule
@@ -16,10 +16,10 @@
16
16
  *
17
17
  */
18
18
 
19
- // This file is a part of the CXXRTL C API. It should be used together with `cxxrtl_capi.h`.
19
+ // This file is a part of the CXXRTL C API. It should be used together with `cxxrtl/capi/cxxrtl_capi.h`.
20
20
 
21
- #include <backends/cxxrtl/cxxrtl.h>
22
- #include <backends/cxxrtl/cxxrtl_capi.h>
21
+ #include <cxxrtl/capi/cxxrtl_capi.h>
22
+ #include <cxxrtl/cxxrtl.h>
23
23
 
24
24
  struct _cxxrtl_handle {
25
25
  std::unique_ptr<cxxrtl::module> module;
@@ -16,10 +16,10 @@
16
16
  *
17
17
  */
18
18
 
19
- // This file is a part of the CXXRTL C API. It should be used together with `cxxrtl_vcd_capi.h`.
19
+ // This file is a part of the CXXRTL C API. It should be used together with `cxxrtl/capi/cxxrtl_capi_vcd.h`.
20
20
 
21
- #include <backends/cxxrtl/cxxrtl_vcd.h>
22
- #include <backends/cxxrtl/cxxrtl_vcd_capi.h>
21
+ #include <cxxrtl/capi/cxxrtl_capi_vcd.h>
22
+ #include <cxxrtl/cxxrtl_vcd.h>
23
23
 
24
24
  extern const cxxrtl::debug_items &cxxrtl_debug_items_from_handle(cxxrtl_handle handle);
25
25
 
@@ -16,8 +16,8 @@
16
16
  *
17
17
  */
18
18
 
19
- #ifndef CXXRTL_VCD_CAPI_H
20
- #define CXXRTL_VCD_CAPI_H
19
+ #ifndef CXXRTL_CAPI_VCD_H
20
+ #define CXXRTL_CAPI_VCD_H
21
21
 
22
22
  // This file is a part of the CXXRTL C API. It should be used together with `cxxrtl_vcd_capi.cc`.
23
23
  //
@@ -27,7 +27,7 @@
27
27
  #include <stddef.h>
28
28
  #include <stdint.h>
29
29
 
30
- #include <backends/cxxrtl/cxxrtl_capi.h>
30
+ #include <cxxrtl/capi/cxxrtl_capi.h>
31
31
 
32
32
  #ifdef __cplusplus
33
33
  extern "C" {
@@ -39,7 +39,8 @@
39
39
  #include <functional>
40
40
  #include <sstream>
41
41
 
42
- #include <backends/cxxrtl/cxxrtl_capi.h>
42
+ // `cxxrtl::debug_item` has to inherit from `cxxrtl_object` to satisfy strict aliasing requirements.
43
+ #include <cxxrtl/capi/cxxrtl_capi.h>
43
44
 
44
45
  #ifndef __has_attribute
45
46
  # define __has_attribute(x) 0
@@ -19,7 +19,7 @@
19
19
  #ifndef CXXRTL_VCD_H
20
20
  #define CXXRTL_VCD_H
21
21
 
22
- #include <backends/cxxrtl/cxxrtl.h>
22
+ #include <cxxrtl/cxxrtl.h>
23
23
 
24
24
  namespace cxxrtl {
25
25
 
@@ -921,6 +921,9 @@ public:
921
921
  RTLIL::SigSpec extract(int offset, int length = 1) const;
922
922
  RTLIL::SigSpec extract_end(int offset) const { return extract(offset, width_ - offset); }
923
923
 
924
+ RTLIL::SigBit lsb() const { log_assert(width_); return (*this)[0]; };
925
+ RTLIL::SigBit msb() const { log_assert(width_); return (*this)[width_ - 1]; };
926
+
924
927
  void append(const RTLIL::SigSpec &signal);
925
928
  inline void append(Wire *wire) { append(RTLIL::SigSpec(wire)); }
926
929
  inline void append(const RTLIL::SigChunk &chunk) { append(RTLIL::SigSpec(chunk)); }
@@ -134,8 +134,8 @@ DP16K #(
134
134
  .INITVAL_3D($sformatf("0x%080x", init_slice('h3d))),
135
135
  .INITVAL_3E($sformatf("0x%080x", init_slice('h3e))),
136
136
  .INITVAL_3F($sformatf("0x%080x", init_slice('h3f))),
137
- .DATA_WIDTH_A($sformatf("X%d", PORT_A_WIDTH)),
138
- .DATA_WIDTH_B($sformatf("X%d", PORT_B_WIDTH)),
137
+ .DATA_WIDTH_A($sformatf("X%0d", PORT_A_WIDTH)),
138
+ .DATA_WIDTH_B($sformatf("X%0d", PORT_B_WIDTH)),
139
139
  .OUTREG_A("BYPASSED"),
140
140
  .OUTREG_B("BYPASSED"),
141
141
  .RESETMODE_A(PORT_A_OPTION_RESETMODE),
@@ -298,8 +298,8 @@ PDPSC16K #(
298
298
  .INITVAL_3D($sformatf("0x%080x", init_slice('h3d))),
299
299
  .INITVAL_3E($sformatf("0x%080x", init_slice('h3e))),
300
300
  .INITVAL_3F($sformatf("0x%080x", init_slice('h3f))),
301
- .DATA_WIDTH_W($sformatf("X%d", PORT_W_WIDTH)),
302
- .DATA_WIDTH_R($sformatf("X%d", PORT_R_WIDTH)),
301
+ .DATA_WIDTH_W($sformatf("X%0d", PORT_W_WIDTH)),
302
+ .DATA_WIDTH_R($sformatf("X%0d", PORT_R_WIDTH)),
303
303
  .OUTREG("BYPASSED"),
304
304
  .RESETMODE(PORT_R_OPTION_RESETMODE),
305
305
  .ASYNC_RST_RELEASE(PORT_R_OPTION_RESETMODE),
@@ -389,8 +389,8 @@ PDP16K #(
389
389
  .INITVAL_3D($sformatf("0x%080x", init_slice('h3d))),
390
390
  .INITVAL_3E($sformatf("0x%080x", init_slice('h3e))),
391
391
  .INITVAL_3F($sformatf("0x%080x", init_slice('h3f))),
392
- .DATA_WIDTH_W($sformatf("X%d", PORT_W_WIDTH)),
393
- .DATA_WIDTH_R($sformatf("X%d", PORT_R_WIDTH)),
392
+ .DATA_WIDTH_W($sformatf("X%0d", PORT_W_WIDTH)),
393
+ .DATA_WIDTH_R($sformatf("X%0d", PORT_R_WIDTH)),
394
394
  .OUTREG("BYPASSED"),
395
395
  .RESETMODE(PORT_R_OPTION_RESETMODE),
396
396
  .ASYNC_RST_RELEASE(PORT_R_OPTION_RESETMODE),
@@ -351,11 +351,14 @@ class WriteWitness:
351
351
  self.out.name("steps")
352
352
  self.out.begin_array()
353
353
 
354
- def step(self, values):
354
+ def step(self, values, skip_x=False):
355
355
  if not self.header_written:
356
356
  self.write_header()
357
357
 
358
- self.out.value({"bits": values.pack(self.sigmap)})
358
+ packed = values.pack(self.sigmap)
359
+ if skip_x:
360
+ packed = packed.replace('x', '?')
361
+ self.out.value({"bits": packed})
359
362
 
360
363
  self.t += 1
361
364
 
@@ -390,6 +393,9 @@ class ReadWitness:
390
393
 
391
394
  self.bits = [step["bits"] for step in data["steps"]]
392
395
 
396
+ def skip_x(self):
397
+ self.bits = [step.replace('x', '?') for step in self.bits]
398
+
393
399
  def init_step(self):
394
400
  return self.step(0)
395
401
 
@@ -327,3 +327,80 @@ module qlal4s3b_cell_macro (
327
327
  );
328
328
 
329
329
  endmodule
330
+
331
+ (* abc9_lut=1, lib_whitebox *)
332
+ module LUT1 (
333
+ output O,
334
+ input I0
335
+ );
336
+ parameter [1:0] INIT = 0;
337
+ parameter EQN = "(I0)";
338
+
339
+ // These timings are for PolarPro 3E; other families will need updating.
340
+ specify
341
+ (I0 => O) = 698; // FS -> FZ
342
+ endspecify
343
+
344
+ assign O = I0 ? INIT[1] : INIT[0];
345
+ endmodule
346
+
347
+ // TZ TSL TAB
348
+ (* abc9_lut=2, lib_whitebox *)
349
+ module LUT2 (
350
+ output O,
351
+ input I0, I1
352
+ );
353
+ parameter [3:0] INIT = 4'h0;
354
+ parameter EQN = "(I0)";
355
+
356
+ // These timings are for PolarPro 3E; other families will need updating.
357
+ specify
358
+ (I0 => O) = 1251; // TAB -> TZ
359
+ (I1 => O) = 1406; // TSL -> TZ
360
+ endspecify
361
+
362
+ wire [1:0] s1 = I1 ? INIT[3:2] : INIT[1:0];
363
+ assign O = I0 ? s1[1] : s1[0];
364
+ endmodule
365
+
366
+ (* abc9_lut=2, lib_whitebox *)
367
+ module LUT3 (
368
+ output O,
369
+ input I0, I1, I2
370
+ );
371
+ parameter [7:0] INIT = 8'h0;
372
+ parameter EQN = "(I0)";
373
+
374
+ // These timings are for PolarPro 3E; other families will need updating.
375
+ specify
376
+ (I0 => O) = 1251; // TAB -> TZ
377
+ (I1 => O) = 1406; // TSL -> TZ
378
+ (I2 => O) = 1699; // ('TA1', 'TA2', 'TB1', 'TB2') -> TZ
379
+ endspecify
380
+
381
+ wire [3:0] s2 = I2 ? INIT[7:4] : INIT[3:0];
382
+ wire [1:0] s1 = I1 ? s2[3:2] : s2[1:0];
383
+ assign O = I0 ? s1[1] : s1[0];
384
+ endmodule
385
+
386
+ (* abc9_lut=4, lib_whitebox *)
387
+ module LUT4 (
388
+ output O,
389
+ input I0, I1, I2, I3
390
+ );
391
+ parameter [15:0] INIT = 16'h0;
392
+ parameter EQN = "(I0)";
393
+
394
+ // These timings are for PolarPro 3E; other families will need updating.
395
+ specify
396
+ (I0 => O) = 995; // TBS -> CZ
397
+ (I1 => O) = 1437; // ('TAB', 'BAB') -> CZ
398
+ (I2 => O) = 1593; // ('TSL', 'BSL') -> CZ
399
+ (I3 => O) = 1887; // ('TA1', 'TA2', 'TB1', 'TB2', 'BA1', 'BA2', 'BB1', 'BB2') -> CZ
400
+ endspecify
401
+
402
+ wire [7:0] s3 = I3 ? INIT[15:8] : INIT[7:0];
403
+ wire [3:0] s2 = I2 ? s3[7:4] : s3[3:0];
404
+ wire [1:0] s1 = I1 ? s2[3:2] : s2[1:0];
405
+ assign O = I0 ? s1[1] : s1[0];
406
+ endmodule
@@ -0,0 +1,344 @@
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 TDP18K_FIFO (
19
+ RMODE_A_i,
20
+ RMODE_B_i,
21
+ WMODE_A_i,
22
+ WMODE_B_i,
23
+ WEN_A_i,
24
+ WEN_B_i,
25
+ REN_A_i,
26
+ REN_B_i,
27
+ CLK_A_i,
28
+ CLK_B_i,
29
+ BE_A_i,
30
+ BE_B_i,
31
+ ADDR_A_i,
32
+ ADDR_B_i,
33
+ WDATA_A_i,
34
+ WDATA_B_i,
35
+ RDATA_A_o,
36
+ RDATA_B_o,
37
+ EMPTY_o,
38
+ EPO_o,
39
+ EWM_o,
40
+ UNDERRUN_o,
41
+ FULL_o,
42
+ FMO_o,
43
+ FWM_o,
44
+ OVERRUN_o,
45
+ FLUSH_ni,
46
+ FMODE_i,
47
+ );
48
+ parameter SYNC_FIFO_i = 1'b0;
49
+ parameter POWERDN_i = 1'b0;
50
+ parameter SLEEP_i = 1'b0;
51
+ parameter PROTECT_i = 1'b0;
52
+ parameter UPAF_i = 11'b0;
53
+ parameter UPAE_i = 11'b0;
54
+ parameter [18*1024-1:0] INIT_i = 18431'bx;
55
+
56
+ input wire [2:0] RMODE_A_i;
57
+ input wire [2:0] RMODE_B_i;
58
+ input wire [2:0] WMODE_A_i;
59
+ input wire [2:0] WMODE_B_i;
60
+ input wire WEN_A_i;
61
+ input wire WEN_B_i;
62
+ input wire REN_A_i;
63
+ input wire REN_B_i;
64
+ (* clkbuf_sink *)
65
+ input wire CLK_A_i;
66
+ (* clkbuf_sink *)
67
+ input wire CLK_B_i;
68
+ input wire [1:0] BE_A_i;
69
+ input wire [1:0] BE_B_i;
70
+ input wire [13:0] ADDR_A_i;
71
+ input wire [13:0] ADDR_B_i;
72
+ input wire [17:0] WDATA_A_i;
73
+ input wire [17:0] WDATA_B_i;
74
+ output reg [17:0] RDATA_A_o;
75
+ output reg [17:0] RDATA_B_o;
76
+ output wire EMPTY_o;
77
+ output wire EPO_o;
78
+ output wire EWM_o;
79
+ output wire UNDERRUN_o;
80
+ output wire FULL_o;
81
+ output wire FMO_o;
82
+ output wire FWM_o;
83
+ output wire OVERRUN_o;
84
+ input wire FLUSH_ni;
85
+ input wire FMODE_i;
86
+ reg [17:0] wmsk_a;
87
+ reg [17:0] wmsk_b;
88
+ wire [8:0] addr_a;
89
+ wire [8:0] addr_b;
90
+ reg [4:0] addr_a_d;
91
+ reg [4:0] addr_b_d;
92
+ wire [17:0] ram_rdata_a;
93
+ wire [17:0] ram_rdata_b;
94
+ reg [17:0] aligned_wdata_a;
95
+ reg [17:0] aligned_wdata_b;
96
+ wire ren_o;
97
+ wire [10:0] ff_raddr;
98
+ wire [10:0] ff_waddr;
99
+ wire [13:0] ram_addr_a;
100
+ wire [13:0] ram_addr_b;
101
+ wire [3:0] ram_waddr_a;
102
+ wire [3:0] ram_waddr_b;
103
+ wire initn;
104
+ wire smux_rclk;
105
+ wire smux_wclk;
106
+ wire real_fmode;
107
+ wire [3:0] raw_fflags;
108
+ reg [1:0] fifo_rmode;
109
+ reg [1:0] fifo_wmode;
110
+ wire smux_clk_a;
111
+ wire smux_clk_b;
112
+ wire ram_ren_a;
113
+ wire ram_ren_b;
114
+ wire ram_wen_a;
115
+ wire ram_wen_b;
116
+ wire cen_a;
117
+ wire cen_b;
118
+ wire cen_a_n;
119
+ wire cen_b_n;
120
+ wire ram_wen_a_n;
121
+ wire ram_wen_b_n;
122
+ localparam MODE_9 = 3'b001;
123
+ always @(*) begin
124
+ fifo_rmode = (RMODE_B_i == MODE_9 ? 2'b10 : 2'b01);
125
+ fifo_wmode = (WMODE_A_i == MODE_9 ? 2'b10 : 2'b01);
126
+ end
127
+ assign smux_clk_a = CLK_A_i;
128
+ assign smux_clk_b = CLK_B_i;
129
+ assign real_fmode = FMODE_i;
130
+ assign ram_ren_b = real_fmode ? ren_o : REN_B_i;
131
+ assign ram_wen_a = FMODE_i ? ~FULL_o & WEN_A_i : WEN_A_i;
132
+ assign ram_ren_a = FMODE_i ? 0 : REN_A_i;
133
+ assign ram_wen_b = FMODE_i ? 1'b0 : WEN_B_i;
134
+ assign cen_b = ram_ren_b | ram_wen_b;
135
+ assign cen_a = ram_ren_a | ram_wen_a;
136
+ assign ram_waddr_b = real_fmode ? {ff_raddr[0], 3'b000} : ADDR_B_i[3:0];
137
+ assign ram_waddr_a = real_fmode ? {ff_waddr[0], 3'b000} : ADDR_A_i[3:0];
138
+ assign ram_addr_b = real_fmode ? {ff_raddr[10:0], 3'h0} : {ADDR_B_i[13:4], addr_b_d[3:0]};
139
+ assign ram_addr_a = real_fmode ? {ff_waddr[10:0], 3'h0} : {ADDR_A_i[13:4], addr_a_d[3:0]};
140
+ always @(posedge CLK_A_i) addr_a_d[3:0] <= ADDR_A_i[3:0];
141
+ always @(posedge CLK_B_i) addr_b_d[3:0] <= ADDR_B_i[3:0];
142
+ assign cen_a_n = ~cen_a;
143
+ assign ram_wen_a_n = ~ram_wen_a;
144
+ assign cen_b_n = ~cen_b;
145
+ assign ram_wen_b_n = ~ram_wen_b;
146
+
147
+ sram1024x18 #(
148
+ .init(INIT_i)
149
+ ) uram(
150
+ .clk_a(smux_clk_a),
151
+ .cen_a(cen_a_n),
152
+ .wen_a(ram_wen_a_n),
153
+ .addr_a(ram_addr_a[13:4]),
154
+ .wmsk_a(wmsk_a),
155
+ .wdata_a(aligned_wdata_a),
156
+ .rdata_a(ram_rdata_a),
157
+ .clk_b(smux_clk_b),
158
+ .cen_b(cen_b_n),
159
+ .wen_b(ram_wen_b_n),
160
+ .addr_b(ram_addr_b[13:4]),
161
+ .wmsk_b(wmsk_b),
162
+ .wdata_b(aligned_wdata_b),
163
+ .rdata_b(ram_rdata_b)
164
+ );
165
+ fifo_ctl #(
166
+ .ADDR_WIDTH(11),
167
+ .FIFO_WIDTH(2),
168
+ .DEPTH(6)
169
+ ) fifo_ctl(
170
+ .rclk(smux_clk_b),
171
+ .rst_R_n(FLUSH_ni),
172
+ .wclk(smux_clk_a),
173
+ .rst_W_n(FLUSH_ni),
174
+ .ren(REN_B_i),
175
+ .wen(ram_wen_a),
176
+ .sync(SYNC_FIFO_i),
177
+ .rmode(fifo_rmode),
178
+ .wmode(fifo_wmode),
179
+ .ren_o(ren_o),
180
+ .fflags({FULL_o, FMO_o, FWM_o, OVERRUN_o, EMPTY_o, EPO_o, EWM_o, UNDERRUN_o}),
181
+ .raddr(ff_raddr),
182
+ .waddr(ff_waddr),
183
+ .upaf(UPAF_i),
184
+ .upae(UPAE_i)
185
+ );
186
+ localparam MODE_1 = 3'b101;
187
+ localparam MODE_18 = 3'b010;
188
+ localparam MODE_2 = 3'b110;
189
+ localparam MODE_4 = 3'b100;
190
+ always @(*) begin : WDATA_MODE_SEL
191
+ if (ram_wen_a == 1) begin
192
+ case (WMODE_A_i)
193
+ MODE_18: begin
194
+ aligned_wdata_a = WDATA_A_i;
195
+ {wmsk_a[17], wmsk_a[15:8]} = (FMODE_i ? 9'h000 : (BE_A_i[1] ? 9'h000 : 9'h1ff));
196
+ {wmsk_a[16], wmsk_a[7:0]} = (FMODE_i ? 9'h000 : (BE_A_i[0] ? 9'h000 : 9'h1ff));
197
+ end
198
+ MODE_9: begin
199
+ aligned_wdata_a = {{2 {WDATA_A_i[16]}}, {2 {WDATA_A_i[7:0]}}};
200
+ {wmsk_a[17], wmsk_a[15:8]} = (ram_waddr_a[3] ? 9'h000 : 9'h1ff);
201
+ {wmsk_a[16], wmsk_a[7:0]} = (ram_waddr_a[3] ? 9'h1ff : 9'h000);
202
+ end
203
+ MODE_4: begin
204
+ aligned_wdata_a = {2'b00, {4 {WDATA_A_i[3:0]}}};
205
+ wmsk_a[17:16] = 2'b00;
206
+ wmsk_a[15:12] = (ram_waddr_a[3:2] == 2'b11 ? 4'h0 : 4'hf);
207
+ wmsk_a[11:8] = (ram_waddr_a[3:2] == 2'b10 ? 4'h0 : 4'hf);
208
+ wmsk_a[7:4] = (ram_waddr_a[3:2] == 2'b01 ? 4'h0 : 4'hf);
209
+ wmsk_a[3:0] = (ram_waddr_a[3:2] == 2'b00 ? 4'h0 : 4'hf);
210
+ end
211
+ MODE_2: begin
212
+ aligned_wdata_a = {2'b00, {8 {WDATA_A_i[1:0]}}};
213
+ wmsk_a[17:16] = 2'b00;
214
+ wmsk_a[15:14] = (ram_waddr_a[3:1] == 3'b111 ? 2'h0 : 2'h3);
215
+ wmsk_a[13:12] = (ram_waddr_a[3:1] == 3'b110 ? 2'h0 : 2'h3);
216
+ wmsk_a[11:10] = (ram_waddr_a[3:1] == 3'b101 ? 2'h0 : 2'h3);
217
+ wmsk_a[9:8] = (ram_waddr_a[3:1] == 3'b100 ? 2'h0 : 2'h3);
218
+ wmsk_a[7:6] = (ram_waddr_a[3:1] == 3'b011 ? 2'h0 : 2'h3);
219
+ wmsk_a[5:4] = (ram_waddr_a[3:1] == 3'b010 ? 2'h0 : 2'h3);
220
+ wmsk_a[3:2] = (ram_waddr_a[3:1] == 3'b001 ? 2'h0 : 2'h3);
221
+ wmsk_a[1:0] = (ram_waddr_a[3:1] == 3'b000 ? 2'h0 : 2'h3);
222
+ end
223
+ MODE_1: begin
224
+ aligned_wdata_a = {2'b00, {16 {WDATA_A_i[0]}}};
225
+ wmsk_a = 18'h0ffff;
226
+ wmsk_a[{1'b0, ram_waddr_a[3:0]}] = 0;
227
+ end
228
+ default: wmsk_a = 18'h3ffff;
229
+ endcase
230
+ end
231
+ else begin
232
+ aligned_wdata_a = 18'h00000;
233
+ wmsk_a = 18'h3ffff;
234
+ end
235
+ if (ram_wen_b == 1)
236
+ case (WMODE_B_i)
237
+ MODE_18: begin
238
+ aligned_wdata_b = WDATA_B_i;
239
+ {wmsk_b[17], wmsk_b[15:8]} = (BE_B_i[1] ? 9'h000 : 9'h1ff);
240
+ {wmsk_b[16], wmsk_b[7:0]} = (BE_B_i[0] ? 9'h000 : 9'h1ff);
241
+ end
242
+ MODE_9: begin
243
+ aligned_wdata_b = {{2 {WDATA_B_i[16]}}, {2 {WDATA_B_i[7:0]}}};
244
+ {wmsk_b[17], wmsk_b[15:8]} = (ram_waddr_b[3] ? 9'h000 : 9'h1ff);
245
+ {wmsk_b[16], wmsk_b[7:0]} = (ram_waddr_b[3] ? 9'h1ff : 9'h000);
246
+ end
247
+ MODE_4: begin
248
+ aligned_wdata_b = {2'b00, {4 {WDATA_B_i[3:0]}}};
249
+ wmsk_b[17:16] = 2'b00;
250
+ wmsk_b[15:12] = (ram_waddr_b[3:2] == 2'b11 ? 4'h0 : 4'hf);
251
+ wmsk_b[11:8] = (ram_waddr_b[3:2] == 2'b10 ? 4'h0 : 4'hf);
252
+ wmsk_b[7:4] = (ram_waddr_b[3:2] == 2'b01 ? 4'h0 : 4'hf);
253
+ wmsk_b[3:0] = (ram_waddr_b[3:2] == 2'b00 ? 4'h0 : 4'hf);
254
+ end
255
+ MODE_2: begin
256
+ aligned_wdata_b = {2'b00, {8 {WDATA_B_i[1:0]}}};
257
+ wmsk_b[17:16] = 2'b00;
258
+ wmsk_b[15:14] = (ram_waddr_b[3:1] == 3'b111 ? 2'h0 : 2'h3);
259
+ wmsk_b[13:12] = (ram_waddr_b[3:1] == 3'b110 ? 2'h0 : 2'h3);
260
+ wmsk_b[11:10] = (ram_waddr_b[3:1] == 3'b101 ? 2'h0 : 2'h3);
261
+ wmsk_b[9:8] = (ram_waddr_b[3:1] == 3'b100 ? 2'h0 : 2'h3);
262
+ wmsk_b[7:6] = (ram_waddr_b[3:1] == 3'b011 ? 2'h0 : 2'h3);
263
+ wmsk_b[5:4] = (ram_waddr_b[3:1] == 3'b010 ? 2'h0 : 2'h3);
264
+ wmsk_b[3:2] = (ram_waddr_b[3:1] == 3'b001 ? 2'h0 : 2'h3);
265
+ wmsk_b[1:0] = (ram_waddr_b[3:1] == 3'b000 ? 2'h0 : 2'h3);
266
+ end
267
+ MODE_1: begin
268
+ aligned_wdata_b = {2'b00, {16 {WDATA_B_i[0]}}};
269
+ wmsk_b = 18'h0ffff;
270
+ wmsk_b[{1'b0, ram_waddr_b[3:0]}] = 0;
271
+ end
272
+ default: wmsk_b = 18'h3ffff;
273
+ endcase
274
+ else begin
275
+ aligned_wdata_b = 18'b000000000000000000;
276
+ wmsk_b = 18'h3ffff;
277
+ end
278
+ end
279
+ always @(*) begin : RDATA_A_MODE_SEL
280
+ case (RMODE_A_i)
281
+ default: RDATA_A_o = 18'h00000;
282
+ MODE_18: RDATA_A_o = ram_rdata_a;
283
+ MODE_9: begin
284
+ {RDATA_A_o[17], RDATA_A_o[15:8]} = 9'h000;
285
+ {RDATA_A_o[16], RDATA_A_o[7:0]} = (ram_addr_a[3] ? {ram_rdata_a[17], ram_rdata_a[15:8]} : {ram_rdata_a[16], ram_rdata_a[7:0]});
286
+ end
287
+ MODE_4: begin
288
+ RDATA_A_o[17:4] = 14'h0000;
289
+ case (ram_addr_a[3:2])
290
+ 3: RDATA_A_o[3:0] = ram_rdata_a[15:12];
291
+ 2: RDATA_A_o[3:0] = ram_rdata_a[11:8];
292
+ 1: RDATA_A_o[3:0] = ram_rdata_a[7:4];
293
+ 0: RDATA_A_o[3:0] = ram_rdata_a[3:0];
294
+ endcase
295
+ end
296
+ MODE_2: begin
297
+ RDATA_A_o[17:2] = 16'h0000;
298
+ case (ram_addr_a[3:1])
299
+ 7: RDATA_A_o[1:0] = ram_rdata_a[15:14];
300
+ 6: RDATA_A_o[1:0] = ram_rdata_a[13:12];
301
+ 5: RDATA_A_o[1:0] = ram_rdata_a[11:10];
302
+ 4: RDATA_A_o[1:0] = ram_rdata_a[9:8];
303
+ 3: RDATA_A_o[1:0] = ram_rdata_a[7:6];
304
+ 2: RDATA_A_o[1:0] = ram_rdata_a[5:4];
305
+ 1: RDATA_A_o[1:0] = ram_rdata_a[3:2];
306
+ 0: RDATA_A_o[1:0] = ram_rdata_a[1:0];
307
+ endcase
308
+ end
309
+ MODE_1: begin
310
+ RDATA_A_o[17:1] = 17'h00000;
311
+ RDATA_A_o[0] = ram_rdata_a[ram_addr_a[3:0]];
312
+ end
313
+ endcase
314
+ end
315
+ always @(*)
316
+ case (RMODE_B_i)
317
+ default: RDATA_B_o = 18'h15566;
318
+ MODE_18: RDATA_B_o = ram_rdata_b;
319
+ MODE_9: begin
320
+ {RDATA_B_o[17], RDATA_B_o[15:8]} = 9'b000000000;
321
+ {RDATA_B_o[16], RDATA_B_o[7:0]} = (ram_addr_b[3] ? {ram_rdata_b[17], ram_rdata_b[15:8]} : {ram_rdata_b[16], ram_rdata_b[7:0]});
322
+ end
323
+ MODE_4:
324
+ case (ram_addr_b[3:2])
325
+ 3: RDATA_B_o[3:0] = ram_rdata_b[15:12];
326
+ 2: RDATA_B_o[3:0] = ram_rdata_b[11:8];
327
+ 1: RDATA_B_o[3:0] = ram_rdata_b[7:4];
328
+ 0: RDATA_B_o[3:0] = ram_rdata_b[3:0];
329
+ endcase
330
+ MODE_2:
331
+ case (ram_addr_b[3:1])
332
+ 7: RDATA_B_o[1:0] = ram_rdata_b[15:14];
333
+ 6: RDATA_B_o[1:0] = ram_rdata_b[13:12];
334
+ 5: RDATA_B_o[1:0] = ram_rdata_b[11:10];
335
+ 4: RDATA_B_o[1:0] = ram_rdata_b[9:8];
336
+ 3: RDATA_B_o[1:0] = ram_rdata_b[7:6];
337
+ 2: RDATA_B_o[1:0] = ram_rdata_b[5:4];
338
+ 1: RDATA_B_o[1:0] = ram_rdata_b[3:2];
339
+ 0: RDATA_B_o[1:0] = ram_rdata_b[1:0];
340
+ endcase
341
+ MODE_1: RDATA_B_o[0] = ram_rdata_b[{1'b0, ram_addr_b[3:0]}];
342
+ endcase
343
+ endmodule
344
+ `default_nettype none