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,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
|
yowasp_yosys/share/include/backends/cxxrtl/{cxxrtl_capi.cc → runtime/cxxrtl/capi/cxxrtl_capi.cc}
RENAMED
|
@@ -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 <
|
|
22
|
-
#include <
|
|
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 `
|
|
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 <
|
|
22
|
-
#include <
|
|
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
|
|
20
|
-
#define
|
|
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 <
|
|
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
|
-
|
|
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
|
|
@@ -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%
|
|
138
|
-
.DATA_WIDTH_B($sformatf("X%
|
|
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%
|
|
302
|
-
.DATA_WIDTH_R($sformatf("X%
|
|
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%
|
|
393
|
-
.DATA_WIDTH_R($sformatf("X%
|
|
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
|
-
|
|
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
|