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,133 @@
|
|
|
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
|
+
// DFF, asynchronous set/reset, enable
|
|
18
|
+
module \$_DFFSRE_PNNP_ (C, S, R, E, D, Q);
|
|
19
|
+
input C;
|
|
20
|
+
input S;
|
|
21
|
+
input R;
|
|
22
|
+
input E;
|
|
23
|
+
input D;
|
|
24
|
+
output Q;
|
|
25
|
+
dffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(S));
|
|
26
|
+
endmodule
|
|
27
|
+
|
|
28
|
+
module \$_DFFSRE_NNNP_ (C, S, R, E, D, Q);
|
|
29
|
+
input C;
|
|
30
|
+
input S;
|
|
31
|
+
input R;
|
|
32
|
+
input E;
|
|
33
|
+
input D;
|
|
34
|
+
output Q;
|
|
35
|
+
dffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(S));
|
|
36
|
+
endmodule
|
|
37
|
+
|
|
38
|
+
// DFF, synchronous set or reset, enable
|
|
39
|
+
module \$_SDFFE_PN0P_ (D, C, R, E, Q);
|
|
40
|
+
input D;
|
|
41
|
+
input C;
|
|
42
|
+
input R;
|
|
43
|
+
input E;
|
|
44
|
+
output Q;
|
|
45
|
+
sdffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(1'b1));
|
|
46
|
+
endmodule
|
|
47
|
+
|
|
48
|
+
module \$_SDFFE_PN1P_ (D, C, R, E, Q);
|
|
49
|
+
input D;
|
|
50
|
+
input C;
|
|
51
|
+
input R;
|
|
52
|
+
input E;
|
|
53
|
+
output Q;
|
|
54
|
+
sdffsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(R));
|
|
55
|
+
endmodule
|
|
56
|
+
|
|
57
|
+
module \$_SDFFE_NN0P_ (D, C, R, E, Q);
|
|
58
|
+
input D;
|
|
59
|
+
input C;
|
|
60
|
+
input R;
|
|
61
|
+
input E;
|
|
62
|
+
output Q;
|
|
63
|
+
sdffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(R), .S(1'b1));
|
|
64
|
+
endmodule
|
|
65
|
+
|
|
66
|
+
module \$_SDFFE_NN1P_ (D, C, R, E, Q);
|
|
67
|
+
input D;
|
|
68
|
+
input C;
|
|
69
|
+
input R;
|
|
70
|
+
input E;
|
|
71
|
+
output Q;
|
|
72
|
+
sdffnsre _TECHMAP_REPLACE_ (.Q(Q), .D(D), .C(C), .E(E), .R(1'b1), .S(R));
|
|
73
|
+
endmodule
|
|
74
|
+
|
|
75
|
+
// Latch, no set/reset, no enable
|
|
76
|
+
module \$_DLATCH_P_ (input E, D, output Q);
|
|
77
|
+
latchsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(1'b1), .S(1'b1));
|
|
78
|
+
endmodule
|
|
79
|
+
|
|
80
|
+
module \$_DLATCH_N_ (input E, D, output Q);
|
|
81
|
+
latchnsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(1'b1), .S(1'b1));
|
|
82
|
+
endmodule
|
|
83
|
+
|
|
84
|
+
// Latch with async set and reset and enable
|
|
85
|
+
module \$_DLATCHSR_PPP_ (input E, S, R, D, output Q);
|
|
86
|
+
latchsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(!R), .S(!S));
|
|
87
|
+
endmodule
|
|
88
|
+
|
|
89
|
+
module \$_DLATCHSR_NPP_ (input E, S, R, D, output Q);
|
|
90
|
+
latchnsre _TECHMAP_REPLACE_ (.D(D), .Q(Q), .E(1'b1), .G(E), .R(!R), .S(!S));
|
|
91
|
+
endmodule
|
|
92
|
+
|
|
93
|
+
module \$__SHREG_DFF_P_ (D, Q, C);
|
|
94
|
+
input D;
|
|
95
|
+
input C;
|
|
96
|
+
output Q;
|
|
97
|
+
|
|
98
|
+
parameter DEPTH = 2;
|
|
99
|
+
|
|
100
|
+
reg [DEPTH-2:0] q;
|
|
101
|
+
|
|
102
|
+
genvar i;
|
|
103
|
+
generate for (i = 0; i < DEPTH; i = i + 1) begin: slice
|
|
104
|
+
|
|
105
|
+
// First in chain
|
|
106
|
+
generate if (i == 0) begin
|
|
107
|
+
sh_dff #() shreg_beg (
|
|
108
|
+
.Q(q[i]),
|
|
109
|
+
.D(D),
|
|
110
|
+
.C(C)
|
|
111
|
+
);
|
|
112
|
+
end endgenerate
|
|
113
|
+
// Middle in chain
|
|
114
|
+
generate if (i > 0 && i != DEPTH-1) begin
|
|
115
|
+
sh_dff #() shreg_mid (
|
|
116
|
+
.Q(q[i]),
|
|
117
|
+
.D(q[i-1]),
|
|
118
|
+
.C(C)
|
|
119
|
+
);
|
|
120
|
+
end endgenerate
|
|
121
|
+
// Last in chain
|
|
122
|
+
generate if (i == DEPTH-1) begin
|
|
123
|
+
sh_dff #() shreg_end (
|
|
124
|
+
.Q(Q),
|
|
125
|
+
.D(q[i-1]),
|
|
126
|
+
.C(C)
|
|
127
|
+
);
|
|
128
|
+
end endgenerate
|
|
129
|
+
end: slice
|
|
130
|
+
endgenerate
|
|
131
|
+
|
|
132
|
+
endmodule
|
|
133
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
ram block $__QLF_TDP36K {
|
|
2
|
+
init any;
|
|
3
|
+
byte 9;
|
|
4
|
+
option "SPLIT" 0 {
|
|
5
|
+
abits 15;
|
|
6
|
+
widths 1 2 4 9 18 36 per_port;
|
|
7
|
+
}
|
|
8
|
+
option "SPLIT" 1 {
|
|
9
|
+
abits 14;
|
|
10
|
+
widths 1 2 4 9 18 per_port;
|
|
11
|
+
}
|
|
12
|
+
cost 65;
|
|
13
|
+
port srsw "A" "B" {
|
|
14
|
+
width tied;
|
|
15
|
+
clock posedge;
|
|
16
|
+
# wen causes read even when ren is low
|
|
17
|
+
# map clken = wen || ren
|
|
18
|
+
clken;
|
|
19
|
+
wrbe_separate;
|
|
20
|
+
rdwr old;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,483 @@
|
|
|
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 \$__QLF_TDP36K (PORT_A_CLK, PORT_A_ADDR, PORT_A_WR_DATA, PORT_A_WR_EN, PORT_A_WR_BE, PORT_A_CLK_EN, PORT_A_RD_DATA,
|
|
18
|
+
PORT_B_CLK, PORT_B_ADDR, PORT_B_WR_DATA, PORT_B_WR_EN, PORT_B_WR_BE, PORT_B_CLK_EN, PORT_B_RD_DATA);
|
|
19
|
+
|
|
20
|
+
parameter INIT = 0;
|
|
21
|
+
|
|
22
|
+
parameter OPTION_SPLIT = 0;
|
|
23
|
+
|
|
24
|
+
parameter PORT_A_WIDTH = 1;
|
|
25
|
+
parameter PORT_A_WR_BE_WIDTH = 1;
|
|
26
|
+
|
|
27
|
+
parameter PORT_B_WIDTH = 1;
|
|
28
|
+
parameter PORT_B_WR_BE_WIDTH = 1;
|
|
29
|
+
|
|
30
|
+
input PORT_A_CLK;
|
|
31
|
+
input [14:0] PORT_A_ADDR;
|
|
32
|
+
input [PORT_A_WIDTH-1:0] PORT_A_WR_DATA;
|
|
33
|
+
input PORT_A_WR_EN;
|
|
34
|
+
input [PORT_A_WR_BE_WIDTH-1:0] PORT_A_WR_BE;
|
|
35
|
+
input PORT_A_CLK_EN;
|
|
36
|
+
output [PORT_A_WIDTH-1:0] PORT_A_RD_DATA;
|
|
37
|
+
|
|
38
|
+
input PORT_B_CLK;
|
|
39
|
+
input [14:0] PORT_B_ADDR;
|
|
40
|
+
input [PORT_B_WIDTH-1:0] PORT_B_WR_DATA;
|
|
41
|
+
input PORT_B_WR_EN;
|
|
42
|
+
input [PORT_B_WR_BE_WIDTH-1:0] PORT_B_WR_BE;
|
|
43
|
+
input PORT_B_CLK_EN;
|
|
44
|
+
output [PORT_B_WIDTH-1:0] PORT_B_RD_DATA;
|
|
45
|
+
|
|
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 [36863:0] pack_init;
|
|
79
|
+
integer i;
|
|
80
|
+
reg [35:0] ri;
|
|
81
|
+
for (i = 0; i < (OPTION_SPLIT ? 512 : 1024); i = i + 1) begin
|
|
82
|
+
ri = INIT[i*36 +: 36];
|
|
83
|
+
pack_init[i*36 +: 36] = {ri[35], ri[26], ri[34:27], ri[25:18],
|
|
84
|
+
ri[17], ri[8], ri[16:9], ri[7:0]};
|
|
85
|
+
end
|
|
86
|
+
if (OPTION_SPLIT)
|
|
87
|
+
pack_init[36863:18432] = 18432'bx;
|
|
88
|
+
endfunction
|
|
89
|
+
|
|
90
|
+
wire REN_A1_i;
|
|
91
|
+
wire REN_A2_i;
|
|
92
|
+
|
|
93
|
+
wire REN_B1_i;
|
|
94
|
+
wire REN_B2_i;
|
|
95
|
+
|
|
96
|
+
wire WEN_A1_i;
|
|
97
|
+
wire WEN_A2_i;
|
|
98
|
+
|
|
99
|
+
wire WEN_B1_i;
|
|
100
|
+
wire WEN_B2_i;
|
|
101
|
+
|
|
102
|
+
wire [1:0] BE_A1_i;
|
|
103
|
+
wire [1:0] BE_A2_i;
|
|
104
|
+
|
|
105
|
+
wire [1:0] BE_B1_i;
|
|
106
|
+
wire [1:0] BE_B2_i;
|
|
107
|
+
|
|
108
|
+
wire [14:0] ADDR_A1_i;
|
|
109
|
+
wire [13:0] ADDR_A2_i;
|
|
110
|
+
|
|
111
|
+
wire [14:0] ADDR_B1_i;
|
|
112
|
+
wire [13:0] ADDR_B2_i;
|
|
113
|
+
|
|
114
|
+
wire [17:0] WDATA_A1_i;
|
|
115
|
+
wire [17:0] WDATA_A2_i;
|
|
116
|
+
|
|
117
|
+
wire [17:0] WDATA_B1_i;
|
|
118
|
+
wire [17:0] WDATA_B2_i;
|
|
119
|
+
|
|
120
|
+
wire [17:0] RDATA_A1_o;
|
|
121
|
+
wire [17:0] RDATA_A2_o;
|
|
122
|
+
|
|
123
|
+
wire [17:0] RDATA_B1_o;
|
|
124
|
+
wire [17:0] RDATA_B2_o;
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
// Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
|
|
128
|
+
localparam [ 2:0] RMODE_A1_i = mode(PORT_A_WIDTH);
|
|
129
|
+
localparam [ 2:0] WMODE_A1_i = mode(PORT_A_WIDTH);
|
|
130
|
+
localparam [ 2:0] RMODE_A2_i = mode(PORT_A_WIDTH);
|
|
131
|
+
localparam [ 2:0] WMODE_A2_i = mode(PORT_A_WIDTH);
|
|
132
|
+
|
|
133
|
+
localparam [ 2:0] RMODE_B1_i = mode(PORT_B_WIDTH);
|
|
134
|
+
localparam [ 2:0] WMODE_B1_i = mode(PORT_B_WIDTH);
|
|
135
|
+
localparam [ 2:0] RMODE_B2_i = mode(PORT_B_WIDTH);
|
|
136
|
+
localparam [ 2:0] WMODE_B2_i = mode(PORT_B_WIDTH);
|
|
137
|
+
|
|
138
|
+
assign REN_A1_i = PORT_A_CLK_EN;
|
|
139
|
+
assign WEN_A1_i = PORT_A_CLK_EN & PORT_A_WR_EN;
|
|
140
|
+
assign {BE_A2_i, BE_A1_i} = PORT_A_WR_BE;
|
|
141
|
+
|
|
142
|
+
assign REN_B1_i = PORT_B_CLK_EN;
|
|
143
|
+
assign WEN_B1_i = PORT_B_CLK_EN & PORT_B_WR_EN;
|
|
144
|
+
assign {BE_B2_i, BE_B1_i} = PORT_B_WR_BE;
|
|
145
|
+
|
|
146
|
+
case (PORT_A_WIDTH)
|
|
147
|
+
9: assign { WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A_WR_DATA;
|
|
148
|
+
18: assign { WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A_WR_DATA;
|
|
149
|
+
36: assign { WDATA_A2_i[17], WDATA_A2_i[15:8], WDATA_A2_i[16], WDATA_A2_i[7:0], WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0]} = PORT_A_WR_DATA;
|
|
150
|
+
default: assign WDATA_A1_i = PORT_A_WR_DATA; // 1,2,4
|
|
151
|
+
endcase
|
|
152
|
+
|
|
153
|
+
case (PORT_B_WIDTH)
|
|
154
|
+
9: assign { WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B_WR_DATA;
|
|
155
|
+
18: assign { WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B_WR_DATA;
|
|
156
|
+
36: assign { WDATA_B2_i[17], WDATA_B2_i[15:8], WDATA_B2_i[16], WDATA_B2_i[7:0], WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0]} = PORT_B_WR_DATA;
|
|
157
|
+
default: assign WDATA_B1_i = PORT_B_WR_DATA; // 1,2,4
|
|
158
|
+
endcase
|
|
159
|
+
|
|
160
|
+
case (PORT_A_WIDTH)
|
|
161
|
+
9: assign PORT_A_RD_DATA = { RDATA_A1_o[16], RDATA_A1_o[7:0] };
|
|
162
|
+
18: assign PORT_A_RD_DATA = { RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0] };
|
|
163
|
+
36: assign PORT_A_RD_DATA = { RDATA_A2_o[17], RDATA_A2_o[15:8], RDATA_A2_o[16], RDATA_A2_o[7:0], RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0]};
|
|
164
|
+
default: assign PORT_A_RD_DATA = RDATA_A1_o; // 1,2,4
|
|
165
|
+
endcase
|
|
166
|
+
|
|
167
|
+
case (PORT_B_WIDTH)
|
|
168
|
+
9: assign PORT_B_RD_DATA = { RDATA_B1_o[16], RDATA_B1_o[7:0] };
|
|
169
|
+
18: assign PORT_B_RD_DATA = { RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0] };
|
|
170
|
+
36: assign PORT_B_RD_DATA = { RDATA_B2_o[17], RDATA_B2_o[15:8], RDATA_B2_o[16], RDATA_B2_o[7:0], RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0]};
|
|
171
|
+
default: assign PORT_B_RD_DATA = RDATA_B1_o; // 1,2,4
|
|
172
|
+
endcase
|
|
173
|
+
|
|
174
|
+
defparam _TECHMAP_REPLACE_.MODE_BITS = { 1'b0,
|
|
175
|
+
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,
|
|
176
|
+
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
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
(* is_inferred = 1 *)
|
|
180
|
+
(* is_split = 0 *)
|
|
181
|
+
(* was_split_candidate = OPTION_SPLIT *)
|
|
182
|
+
(* port_a_width = PORT_A_WIDTH *)
|
|
183
|
+
(* port_b_width = PORT_B_WIDTH *)
|
|
184
|
+
TDP36K #(
|
|
185
|
+
.RAM_INIT(pack_init()),
|
|
186
|
+
) _TECHMAP_REPLACE_ (
|
|
187
|
+
.RESET_ni(1'b1),
|
|
188
|
+
|
|
189
|
+
.CLK_A1_i(PORT_A_CLK),
|
|
190
|
+
.ADDR_A1_i(PORT_A_ADDR),
|
|
191
|
+
.WEN_A1_i(WEN_A1_i),
|
|
192
|
+
.BE_A1_i(BE_A1_i),
|
|
193
|
+
.WDATA_A1_i(WDATA_A1_i),
|
|
194
|
+
.REN_A1_i(REN_A1_i),
|
|
195
|
+
.RDATA_A1_o(RDATA_A1_o),
|
|
196
|
+
|
|
197
|
+
.CLK_A2_i(PORT_A_CLK),
|
|
198
|
+
.ADDR_A2_i(PORT_A_ADDR[13:0]),
|
|
199
|
+
.WEN_A2_i(WEN_A1_i),
|
|
200
|
+
.BE_A2_i(BE_A2_i),
|
|
201
|
+
.WDATA_A2_i(WDATA_A2_i),
|
|
202
|
+
.REN_A2_i(REN_A1_i),
|
|
203
|
+
.RDATA_A2_o(RDATA_A2_o),
|
|
204
|
+
|
|
205
|
+
.CLK_B1_i(PORT_B_CLK),
|
|
206
|
+
.ADDR_B1_i(PORT_B_ADDR),
|
|
207
|
+
.WEN_B1_i(WEN_B1_i),
|
|
208
|
+
.BE_B1_i(BE_B1_i),
|
|
209
|
+
.WDATA_B1_i(WDATA_B1_i),
|
|
210
|
+
.REN_B1_i(REN_B1_i),
|
|
211
|
+
.RDATA_B1_o(RDATA_B1_o),
|
|
212
|
+
|
|
213
|
+
.CLK_B2_i(PORT_B_CLK),
|
|
214
|
+
.ADDR_B2_i(PORT_B_ADDR[13:0]),
|
|
215
|
+
.WEN_B2_i(WEN_B1_i),
|
|
216
|
+
.BE_B2_i(BE_B2_i),
|
|
217
|
+
.WDATA_B2_i(WDATA_B2_i),
|
|
218
|
+
.REN_B2_i(REN_B1_i),
|
|
219
|
+
.RDATA_B2_o(RDATA_B2_o),
|
|
220
|
+
|
|
221
|
+
.FLUSH1_i(1'b0),
|
|
222
|
+
.FLUSH2_i(1'b0)
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
endmodule
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
module \$__QLF_TDP36K_MERGED (...);
|
|
229
|
+
|
|
230
|
+
parameter INIT1 = 0;
|
|
231
|
+
|
|
232
|
+
parameter PORT_A1_WIDTH = 1;
|
|
233
|
+
parameter PORT_B1_WIDTH = 1;
|
|
234
|
+
|
|
235
|
+
parameter PORT_A1_WR_BE_WIDTH = 1;
|
|
236
|
+
parameter PORT_B1_WR_BE_WIDTH = 1;
|
|
237
|
+
|
|
238
|
+
input PORT_A1_CLK;
|
|
239
|
+
input [14:0] PORT_A1_ADDR;
|
|
240
|
+
input [PORT_A1_WIDTH-1:0] PORT_A1_WR_DATA;
|
|
241
|
+
input PORT_A1_WR_EN;
|
|
242
|
+
input [PORT_A1_WR_BE_WIDTH-1:0] PORT_A1_WR_BE;
|
|
243
|
+
input PORT_A1_CLK_EN;
|
|
244
|
+
output [PORT_A1_WIDTH-1:0] PORT_A1_RD_DATA;
|
|
245
|
+
|
|
246
|
+
input PORT_B1_CLK;
|
|
247
|
+
input [14:0] PORT_B1_ADDR;
|
|
248
|
+
input [PORT_B1_WIDTH-1:0] PORT_B1_WR_DATA;
|
|
249
|
+
input PORT_B1_WR_EN;
|
|
250
|
+
input [PORT_B1_WR_BE_WIDTH-1:0] PORT_B1_WR_BE;
|
|
251
|
+
input PORT_B1_CLK_EN;
|
|
252
|
+
output [PORT_B1_WIDTH-1:0] PORT_B1_RD_DATA;
|
|
253
|
+
|
|
254
|
+
parameter INIT2 = 0;
|
|
255
|
+
|
|
256
|
+
parameter PORT_A2_WIDTH = 1;
|
|
257
|
+
parameter PORT_B2_WIDTH = 1;
|
|
258
|
+
parameter PORT_A2_WR_BE_WIDTH = 1;
|
|
259
|
+
parameter PORT_B2_WR_BE_WIDTH = 1;
|
|
260
|
+
|
|
261
|
+
input PORT_A2_CLK;
|
|
262
|
+
input [14:0] PORT_A2_ADDR;
|
|
263
|
+
input [PORT_A2_WIDTH-1:0] PORT_A2_WR_DATA;
|
|
264
|
+
input PORT_A2_WR_EN;
|
|
265
|
+
input [PORT_A2_WR_BE_WIDTH-1:0] PORT_A2_WR_BE;
|
|
266
|
+
input PORT_A2_CLK_EN;
|
|
267
|
+
output [PORT_A2_WIDTH-1:0] PORT_A2_RD_DATA;
|
|
268
|
+
|
|
269
|
+
input PORT_B2_CLK;
|
|
270
|
+
input [14:0] PORT_B2_ADDR;
|
|
271
|
+
input [PORT_B2_WIDTH-1:0] PORT_B2_WR_DATA;
|
|
272
|
+
input PORT_B2_WR_EN;
|
|
273
|
+
input [PORT_B2_WR_BE_WIDTH-1:0] PORT_B2_WR_BE;
|
|
274
|
+
input PORT_B2_CLK_EN;
|
|
275
|
+
output [PORT_B2_WIDTH-1:0] PORT_B2_RD_DATA;
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
// Fixed mode settings
|
|
279
|
+
localparam [ 0:0] SYNC_FIFO1_i = 1'd0;
|
|
280
|
+
localparam [ 0:0] FMODE1_i = 1'd0;
|
|
281
|
+
localparam [ 0:0] POWERDN1_i = 1'd0;
|
|
282
|
+
localparam [ 0:0] SLEEP1_i = 1'd0;
|
|
283
|
+
localparam [ 0:0] PROTECT1_i = 1'd0;
|
|
284
|
+
localparam [11:0] UPAE1_i = 12'd10;
|
|
285
|
+
localparam [11:0] UPAF1_i = 12'd10;
|
|
286
|
+
|
|
287
|
+
localparam [ 0:0] SYNC_FIFO2_i = 1'd0;
|
|
288
|
+
localparam [ 0:0] FMODE2_i = 1'd0;
|
|
289
|
+
localparam [ 0:0] POWERDN2_i = 1'd0;
|
|
290
|
+
localparam [ 0:0] SLEEP2_i = 1'd0;
|
|
291
|
+
localparam [ 0:0] PROTECT2_i = 1'd0;
|
|
292
|
+
localparam [10:0] UPAE2_i = 11'd10;
|
|
293
|
+
localparam [10:0] UPAF2_i = 11'd10;
|
|
294
|
+
|
|
295
|
+
// Width mode function
|
|
296
|
+
function [2:0] mode;
|
|
297
|
+
input integer width;
|
|
298
|
+
case (width)
|
|
299
|
+
1: mode = 3'b101;
|
|
300
|
+
2: mode = 3'b110;
|
|
301
|
+
4: mode = 3'b100;
|
|
302
|
+
8,9: mode = 3'b001;
|
|
303
|
+
16, 18: mode = 3'b010;
|
|
304
|
+
default: mode = 3'b000;
|
|
305
|
+
endcase
|
|
306
|
+
endfunction
|
|
307
|
+
|
|
308
|
+
function [36863:0] pack_init;
|
|
309
|
+
integer i;
|
|
310
|
+
reg [35:0] ri;
|
|
311
|
+
for (i = 0; i < 1024; i = i + 1) begin
|
|
312
|
+
ri = {INIT2[i*18 +: 18], INIT1[i*18 +: 18]};
|
|
313
|
+
pack_init[i*36 +: 36] = {ri[35], ri[26], ri[34:27], ri[25:18], ri[17], ri[8], ri[16:9], ri[7:0]};
|
|
314
|
+
end
|
|
315
|
+
endfunction
|
|
316
|
+
|
|
317
|
+
wire REN_A1_i;
|
|
318
|
+
wire REN_A2_i;
|
|
319
|
+
|
|
320
|
+
wire REN_B1_i;
|
|
321
|
+
wire REN_B2_i;
|
|
322
|
+
|
|
323
|
+
wire WEN_A1_i;
|
|
324
|
+
wire WEN_A2_i;
|
|
325
|
+
|
|
326
|
+
wire WEN_B1_i;
|
|
327
|
+
wire WEN_B2_i;
|
|
328
|
+
|
|
329
|
+
wire [1:0] BE_A1_i;
|
|
330
|
+
wire [1:0] BE_A2_i;
|
|
331
|
+
|
|
332
|
+
wire [1:0] BE_B1_i;
|
|
333
|
+
wire [1:0] BE_B2_i;
|
|
334
|
+
|
|
335
|
+
wire [14:0] ADDR_A1_i;
|
|
336
|
+
wire [13:0] ADDR_A2_i;
|
|
337
|
+
|
|
338
|
+
wire [14:0] ADDR_B1_i;
|
|
339
|
+
wire [13:0] ADDR_B2_i;
|
|
340
|
+
|
|
341
|
+
wire [17:0] WDATA_A1_i;
|
|
342
|
+
wire [17:0] WDATA_A2_i;
|
|
343
|
+
|
|
344
|
+
wire [17:0] WDATA_B1_i;
|
|
345
|
+
wire [17:0] WDATA_B2_i;
|
|
346
|
+
|
|
347
|
+
wire [17:0] RDATA_A1_o;
|
|
348
|
+
wire [17:0] RDATA_A2_o;
|
|
349
|
+
|
|
350
|
+
wire [17:0] RDATA_B1_o;
|
|
351
|
+
wire [17:0] RDATA_B2_o;
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
// Set port width mode (In non-split mode A2/B2 is not active. Set same values anyway to match previous behavior.)
|
|
355
|
+
localparam [ 2:0] RMODE_A1_i = mode(PORT_A1_WIDTH);
|
|
356
|
+
localparam [ 2:0] WMODE_A1_i = mode(PORT_A1_WIDTH);
|
|
357
|
+
localparam [ 2:0] RMODE_B1_i = mode(PORT_B1_WIDTH);
|
|
358
|
+
localparam [ 2:0] WMODE_B1_i = mode(PORT_B1_WIDTH);
|
|
359
|
+
|
|
360
|
+
localparam [ 2:0] RMODE_A2_i = mode(PORT_A2_WIDTH);
|
|
361
|
+
localparam [ 2:0] WMODE_A2_i = mode(PORT_A2_WIDTH);
|
|
362
|
+
localparam [ 2:0] RMODE_B2_i = mode(PORT_B2_WIDTH);
|
|
363
|
+
localparam [ 2:0] WMODE_B2_i = mode(PORT_B2_WIDTH);
|
|
364
|
+
|
|
365
|
+
assign REN_A1_i = PORT_A1_CLK_EN;
|
|
366
|
+
assign WEN_A1_i = PORT_A1_CLK_EN & PORT_A1_WR_EN;
|
|
367
|
+
assign BE_A1_i = PORT_A1_WR_BE;
|
|
368
|
+
|
|
369
|
+
assign REN_B1_i = PORT_B1_CLK_EN;
|
|
370
|
+
assign WEN_B1_i = PORT_B1_CLK_EN & PORT_B1_WR_EN;
|
|
371
|
+
assign BE_B1_i = PORT_B1_WR_BE;
|
|
372
|
+
|
|
373
|
+
assign REN_A2_i = PORT_A2_CLK_EN;
|
|
374
|
+
assign WEN_A2_i = PORT_A2_CLK_EN & PORT_A2_WR_EN;
|
|
375
|
+
assign BE_A2_i = PORT_A2_WR_BE;
|
|
376
|
+
|
|
377
|
+
assign REN_B2_i = PORT_B2_CLK_EN;
|
|
378
|
+
assign WEN_B2_i = PORT_B2_CLK_EN & PORT_B2_WR_EN;
|
|
379
|
+
assign BE_B2_i = PORT_B2_WR_BE;
|
|
380
|
+
|
|
381
|
+
assign ADDR_A1_i = PORT_A1_ADDR;
|
|
382
|
+
assign ADDR_B1_i = PORT_B1_ADDR;
|
|
383
|
+
assign ADDR_A2_i = PORT_A2_ADDR;
|
|
384
|
+
assign ADDR_B2_i = PORT_B2_ADDR;
|
|
385
|
+
|
|
386
|
+
case (PORT_A1_WIDTH)
|
|
387
|
+
9: assign { WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A1_WR_DATA;
|
|
388
|
+
18: assign { WDATA_A1_i[17], WDATA_A1_i[15:8], WDATA_A1_i[16], WDATA_A1_i[7:0] } = PORT_A1_WR_DATA;
|
|
389
|
+
default: assign WDATA_A1_i = PORT_A1_WR_DATA; // 1,2,4,8,16
|
|
390
|
+
endcase
|
|
391
|
+
|
|
392
|
+
case (PORT_B1_WIDTH)
|
|
393
|
+
9: assign { WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B1_WR_DATA;
|
|
394
|
+
18: assign { WDATA_B1_i[17], WDATA_B1_i[15:8], WDATA_B1_i[16], WDATA_B1_i[7:0] } = PORT_B1_WR_DATA;
|
|
395
|
+
default: assign WDATA_B1_i = PORT_B1_WR_DATA; // 1,2,4,8,16
|
|
396
|
+
endcase
|
|
397
|
+
|
|
398
|
+
case (PORT_A1_WIDTH)
|
|
399
|
+
9: assign PORT_A1_RD_DATA = { RDATA_A1_o[16], RDATA_A1_o[7:0] };
|
|
400
|
+
18: assign PORT_A1_RD_DATA = { RDATA_A1_o[17], RDATA_A1_o[15:8], RDATA_A1_o[16], RDATA_A1_o[7:0] };
|
|
401
|
+
default: assign PORT_A1_RD_DATA = RDATA_A1_o; // 1,2,4,8,16
|
|
402
|
+
endcase
|
|
403
|
+
|
|
404
|
+
case (PORT_B1_WIDTH)
|
|
405
|
+
9: assign PORT_B1_RD_DATA = { RDATA_B1_o[16], RDATA_B1_o[7:0] };
|
|
406
|
+
18: assign PORT_B1_RD_DATA = { RDATA_B1_o[17], RDATA_B1_o[15:8], RDATA_B1_o[16], RDATA_B1_o[7:0] };
|
|
407
|
+
default: assign PORT_B1_RD_DATA = RDATA_B1_o; // 1,2,4,8,16
|
|
408
|
+
endcase
|
|
409
|
+
|
|
410
|
+
case (PORT_A2_WIDTH)
|
|
411
|
+
9: assign { WDATA_A2_i[16], WDATA_A2_i[7:0] } = PORT_A2_WR_DATA;
|
|
412
|
+
18: assign { WDATA_A2_i[17], WDATA_A2_i[15:8], WDATA_A2_i[16], WDATA_A2_i[7:0] } = PORT_A2_WR_DATA;
|
|
413
|
+
default: assign WDATA_A2_i = PORT_A2_WR_DATA; // 1,2,4,8,16
|
|
414
|
+
endcase
|
|
415
|
+
|
|
416
|
+
case (PORT_B2_WIDTH)
|
|
417
|
+
9: assign { WDATA_B2_i[16], WDATA_B2_i[7:0] } = PORT_B2_WR_DATA;
|
|
418
|
+
18: assign { WDATA_B2_i[17], WDATA_B2_i[15:8], WDATA_B2_i[16], WDATA_B2_i[7:0] } = PORT_B2_WR_DATA;
|
|
419
|
+
default: assign WDATA_B2_i = PORT_B2_WR_DATA; // 1,2,4,8,16
|
|
420
|
+
endcase
|
|
421
|
+
|
|
422
|
+
case (PORT_A2_WIDTH)
|
|
423
|
+
9: assign PORT_A2_RD_DATA = { RDATA_A2_o[16], RDATA_A2_o[7:0] };
|
|
424
|
+
18: assign PORT_A2_RD_DATA = { RDATA_A2_o[17], RDATA_A2_o[15:8], RDATA_A2_o[16], RDATA_A2_o[7:0] };
|
|
425
|
+
default: assign PORT_A2_RD_DATA = RDATA_A2_o; // 1,2,4,8,16
|
|
426
|
+
endcase
|
|
427
|
+
|
|
428
|
+
case (PORT_B2_WIDTH)
|
|
429
|
+
9: assign PORT_B2_RD_DATA = { RDATA_B2_o[16], RDATA_B2_o[7:0] };
|
|
430
|
+
18: assign PORT_B2_RD_DATA = { RDATA_B2_o[17], RDATA_B2_o[15:8], RDATA_B2_o[16], RDATA_B2_o[7:0] };
|
|
431
|
+
default: assign PORT_B2_RD_DATA = RDATA_B2_o; // 1,2,4,8,16
|
|
432
|
+
endcase
|
|
433
|
+
|
|
434
|
+
defparam _TECHMAP_REPLACE_.MODE_BITS = {1'b1,
|
|
435
|
+
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,
|
|
436
|
+
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
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
(* is_inferred = 1 *)
|
|
440
|
+
(* is_split = 1 *)
|
|
441
|
+
(* port_a1_width = PORT_A1_WIDTH *)
|
|
442
|
+
(* port_a2_width = PORT_A2_WIDTH *)
|
|
443
|
+
(* port_b1_width = PORT_B1_WIDTH *)
|
|
444
|
+
(* port_b2_width = PORT_B2_WIDTH *)
|
|
445
|
+
TDP36K #(
|
|
446
|
+
.RAM_INIT(pack_init()),
|
|
447
|
+
) _TECHMAP_REPLACE_ (
|
|
448
|
+
.RESET_ni(1'b1),
|
|
449
|
+
.WDATA_A1_i(WDATA_A1_i),
|
|
450
|
+
.WDATA_A2_i(WDATA_A2_i),
|
|
451
|
+
.RDATA_A1_o(RDATA_A1_o),
|
|
452
|
+
.RDATA_A2_o(RDATA_A2_o),
|
|
453
|
+
.ADDR_A1_i(ADDR_A1_i),
|
|
454
|
+
.ADDR_A2_i(ADDR_A2_i),
|
|
455
|
+
.CLK_A1_i(PORT_A1_CLK),
|
|
456
|
+
.CLK_A2_i(PORT_A2_CLK),
|
|
457
|
+
.REN_A1_i(REN_A1_i),
|
|
458
|
+
.REN_A2_i(REN_A2_i),
|
|
459
|
+
.WEN_A1_i(WEN_A1_i),
|
|
460
|
+
.WEN_A2_i(WEN_A2_i),
|
|
461
|
+
.BE_A1_i(BE_A1_i),
|
|
462
|
+
.BE_A2_i(BE_A2_i),
|
|
463
|
+
|
|
464
|
+
.WDATA_B1_i(WDATA_B1_i),
|
|
465
|
+
.WDATA_B2_i(WDATA_B2_i),
|
|
466
|
+
.RDATA_B1_o(RDATA_B1_o),
|
|
467
|
+
.RDATA_B2_o(RDATA_B2_o),
|
|
468
|
+
.ADDR_B1_i(ADDR_B1_i),
|
|
469
|
+
.ADDR_B2_i(ADDR_B2_i),
|
|
470
|
+
.CLK_B1_i(PORT_B1_CLK),
|
|
471
|
+
.CLK_B2_i(PORT_B2_CLK),
|
|
472
|
+
.REN_B1_i(REN_B1_i),
|
|
473
|
+
.REN_B2_i(REN_B2_i),
|
|
474
|
+
.WEN_B1_i(WEN_B1_i),
|
|
475
|
+
.WEN_B2_i(WEN_B2_i),
|
|
476
|
+
.BE_B1_i(BE_B1_i),
|
|
477
|
+
.BE_B2_i(BE_B2_i),
|
|
478
|
+
|
|
479
|
+
.FLUSH1_i(1'b0),
|
|
480
|
+
.FLUSH2_i(1'b0)
|
|
481
|
+
);
|
|
482
|
+
|
|
483
|
+
endmodule
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
`default_nettype none
|
|
2
|
+
module sram1024x18 (
|
|
3
|
+
clk_a,
|
|
4
|
+
cen_a,
|
|
5
|
+
wen_a,
|
|
6
|
+
addr_a,
|
|
7
|
+
wmsk_a,
|
|
8
|
+
wdata_a,
|
|
9
|
+
rdata_a,
|
|
10
|
+
clk_b,
|
|
11
|
+
cen_b,
|
|
12
|
+
wen_b,
|
|
13
|
+
addr_b,
|
|
14
|
+
wmsk_b,
|
|
15
|
+
wdata_b,
|
|
16
|
+
rdata_b
|
|
17
|
+
);
|
|
18
|
+
parameter [1024*18-1:0] init = 18431'bx;
|
|
19
|
+
(* clkbuf_sink *)
|
|
20
|
+
input wire clk_a;
|
|
21
|
+
input wire cen_a;
|
|
22
|
+
input wire wen_a;
|
|
23
|
+
input wire [9:0] addr_a;
|
|
24
|
+
input wire [17:0] wmsk_a;
|
|
25
|
+
input wire [17:0] wdata_a;
|
|
26
|
+
output reg [17:0] rdata_a;
|
|
27
|
+
(* clkbuf_sink *)
|
|
28
|
+
input wire clk_b;
|
|
29
|
+
input wire cen_b;
|
|
30
|
+
input wire wen_b;
|
|
31
|
+
input wire [9:0] addr_b;
|
|
32
|
+
input wire [17:0] wmsk_b;
|
|
33
|
+
input wire [17:0] wdata_b;
|
|
34
|
+
output reg [17:0] rdata_b;
|
|
35
|
+
reg [17:0] ram [1023:0];
|
|
36
|
+
integer i;
|
|
37
|
+
initial begin
|
|
38
|
+
for (i = 0; i < 1024; i = i + 1) begin
|
|
39
|
+
ram[i] = init[18*i +: 18];
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
always @(posedge clk_a) begin
|
|
44
|
+
if (!cen_a) begin
|
|
45
|
+
if (!wen_a)
|
|
46
|
+
for (i = 0; i < 18; i++) begin
|
|
47
|
+
if (!wmsk_a[i]) ram[addr_a][i] <= wdata_a[i];
|
|
48
|
+
end
|
|
49
|
+
rdata_a <= ram[addr_a];
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
always @(posedge clk_b) begin
|
|
54
|
+
if (!cen_b) begin
|
|
55
|
+
if (!wen_b)
|
|
56
|
+
for (i = 0; i < 18; i++) begin
|
|
57
|
+
if (!wmsk_b[i]) ram[addr_b][i] <= wdata_b[i];
|
|
58
|
+
end
|
|
59
|
+
rdata_b <= ram[addr_b];
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
endmodule
|
|
64
|
+
|