Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: axis_sram.v | |
4 | // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved | |
5 | // 4150 Network Circle, Santa Clara, California 95054, U.S.A. | |
6 | // | |
7 | // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
8 | // | |
9 | // This program is free software; you can redistribute it and/or modify | |
10 | // it under the terms of the GNU General Public License as published by | |
11 | // the Free Software Foundation; version 2 of the License. | |
12 | // | |
13 | // This program is distributed in the hope that it will be useful, | |
14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | // GNU General Public License for more details. | |
17 | // | |
18 | // You should have received a copy of the GNU General Public License | |
19 | // along with this program; if not, write to the Free Software | |
20 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | // | |
22 | // For the avoidance of doubt, and except that if any non-GPL license | |
23 | // choice is available it will apply instead, Sun elects to use only | |
24 | // the General Public License version 2 (GPLv2) at this time for any | |
25 | // software where a choice of GPL license versions is made | |
26 | // available with the language indicating that GPLv2 or any later version | |
27 | // may be used, or where a choice of which version of the GPL is applied is | |
28 | // otherwise unspecified. | |
29 | // | |
30 | // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
31 | // CA 95054 USA or visit www.sun.com if you need additional information or | |
32 | // have any questions. | |
33 | // | |
34 | // ========== Copyright Header End ============================================ | |
35 | `ifndef BLK_1GIG | |
36 | `ifndef BLK_2GIG | |
37 | `ifndef BLK_4GIG | |
38 | `ifndef BLK_8GIG | |
39 | `define BLK_1GIG | |
40 | `endif | |
41 | `endif | |
42 | `endif | |
43 | `endif | |
44 | ||
45 | module dram_data ( | |
46 | clk, | |
47 | rd_adr0, | |
48 | rd_adr1, | |
49 | dout0, | |
50 | dout1, | |
51 | eout1, | |
52 | wr_adr0, | |
53 | we_0, | |
54 | din_0, | |
55 | dram_dump | |
56 | ); | |
57 | ||
58 | input clk; | |
59 | input [24:0] rd_adr0; | |
60 | input [25:0] rd_adr1; // Bit 25 is address parity | |
61 | output [127:0] dout0; | |
62 | output [127:0] dout1; | |
63 | output [ 15:0] eout1; | |
64 | input [25:0] wr_adr0; | |
65 | input we_0; | |
66 | input [143:0] din_0; | |
67 | input dram_dump; | |
68 | ||
69 | wire a_clk = clk; | |
70 | wire [21:0] a_rd_adr0 = {rd_adr0[24:19],rd_adr0[15:0]}; | |
71 | wire [22:0] b_rd_adr0 = {rd_adr0[24:19],rd_adr0[16:0]}; | |
72 | wire [23:0] c_rd_adr0 = {rd_adr0[24:19],rd_adr0[17:0]}; | |
73 | wire [24:0] d_rd_adr0 = {rd_adr0[24:19],rd_adr0[18:0]}; | |
74 | wire [21:0] a_rd_adr1 = {rd_adr1[24:19],rd_adr1[15:0]}; | |
75 | wire [22:0] b_rd_adr1 = {rd_adr1[24:19],rd_adr1[16:0]}; | |
76 | wire [23:0] c_rd_adr1 = {rd_adr1[24:19],rd_adr1[17:0]}; | |
77 | wire [24:0] d_rd_adr1 = {rd_adr1[24:19],rd_adr1[18:0]}; | |
78 | wire [127:0] a_dout0; | |
79 | wire [127:0] a_dout1; | |
80 | wire [ 16:0] a_eout1; | |
81 | wire [21:0] a_wr_adr0 = {wr_adr0[24:19],wr_adr0[15:0]}; | |
82 | wire [22:0] b_wr_adr0 = {wr_adr0[24:19],wr_adr0[16:0]}; | |
83 | wire [23:0] c_wr_adr0 = {wr_adr0[24:19],wr_adr0[17:0]}; | |
84 | wire [24:0] d_wr_adr0 = {wr_adr0[24:19],wr_adr0[18:0]}; | |
85 | wire [127:0] a_din_0 = din_0; | |
86 | wire a_we_0 = we_0; | |
87 | wire [ 16:0] a_ein_0 = {1'b1,din_0[143:128]}; | |
88 | ||
89 | `ifdef PALLADIUM | |
90 | ||
91 | `ifdef BLK_1GIG | |
92 | reg /*sparse */ [127:0] DRAM [22'h3FFFFF:0]; | |
93 | assign dout0[127:0] = DRAM[(a_rd_adr0 & 22'h3FFFFF)]; | |
94 | assign dout1[127:0] = DRAM[(a_rd_adr1 & 22'h3FFFFF)]; | |
95 | `endif | |
96 | `ifdef BLK_2GIG | |
97 | reg /*sparse */ [127:0] DRAM [23'h7FFFFF:0]; | |
98 | assign dout0[127:0] = DRAM[(b_rd_adr0 & 23'h7FFFFF)]; | |
99 | assign dout1[127:0] = DRAM[(b_rd_adr1 & 23'h7FFFFF)]; | |
100 | `endif | |
101 | `ifdef BLK_4GIG | |
102 | reg /*sparse */ [127:0] DRAM [24'hFFFFFF:0]; | |
103 | assign dout0[127:0] = DRAM[(d_rd_adr0 & 24'hFFFFFF)]; | |
104 | assign dout1[127:0] = DRAM[(d_rd_adr1 & 24'hFFFFFF)]; | |
105 | `endif | |
106 | `ifdef BLK_8GIG | |
107 | reg /*sparse */ [127:0] DRAM [25'h1FFFFFF:0]; | |
108 | assign dout0[127:0] = DRAM[(d_rd_adr0 & 25'h1FFFFFF)]; | |
109 | assign dout1[127:0] = DRAM[(d_rd_adr1 & 25'h1FFFFFF)]; | |
110 | `endif | |
111 | ||
112 | wire a0_we_0 = a_we_0 & ~c_wr_adr0[23]; | |
113 | wire a1_we_0 = a_we_0 & c_wr_adr0[23]; | |
114 | wire [127:0] a_din_0 = din_0[127:0]; | |
115 | ||
116 | always @(posedge clk) begin | |
117 | `ifdef BLK_1GIG if (a_we_0) DRAM[(a_wr_adr0 & 22'h3FFFFF)] <= din_0; `endif | |
118 | `ifdef BLK_2GIG if (a_we_0) DRAM[(b_wr_adr0 & 23'h7FFFFF)] <= din_0; `endif | |
119 | `ifdef BLK_4GIG if (a0_we_0) DRAM [(c_wr_adr0 & 24'hFFFFFF)] <= din_0; `endif | |
120 | `ifdef BLK_8GIG if (a_we_0) DRAM[(d_wr_adr0 & 25'h1FFFFFF)] <= din_0; `endif | |
121 | ||
122 | if (we_0 & dram_dump) $display("WD=%h", din_0); | |
123 | end | |
124 | ||
125 | `else // !`ifdef PALLADIUM | |
126 | ||
127 | wire [15:0] ecc_out; | |
128 | dram_ecc_gen ecc_gen ( .data(dout1[127:0]), .ecc(ecc_out[15:0]) ); | |
129 | ||
130 | `ifdef AXIS | |
131 | ||
132 | assign eout1[ 15:0] = a_eout1[16] ? a_eout1[15:0] : (ecc_out[15:0] ^ {16{rd_adr1[25]}}); | |
133 | assign dout0[127:0] = a_dout0; | |
134 | assign dout1[127:0] = a_dout1; | |
135 | ||
136 | ||
137 | ||
138 | `ifdef BLK_1GIG | |
139 | axis_smem #(22, 128, 3, 0) DRAM | |
140 | ( | |
141 | {128'bz, a_dout0, a_dout1 }, // Data Out | |
142 | {a_din_0, 128'bz, 128'bz }, // Data In | |
143 | {a_wr_adr0, a_rd_adr0, a_rd_adr1}, // Address | |
144 | {a_we_0, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
145 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
146 | {a_clk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
147 | {128'bz, 128'bz, 128'bz } // Mask | |
148 | ); | |
149 | axis_smem #(22, 17 , 2, 0) DRAM_ECC | |
150 | ( | |
151 | { 17'bz, a_eout1 }, // Data Out | |
152 | {a_ein_0, 17'bz }, // Data In | |
153 | {a_wr_adr0, a_rd_adr1}, // Address | |
154 | {a_we_0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
155 | {1'b1, 1'b1 }, // Chip Enable | |
156 | {a_clk, 1'bz }, // Clocks : 1'bz means asynchronous | |
157 | { 17'bz, 17'bz } // Mask | |
158 | ); | |
159 | `endif | |
160 | `ifdef BLK_2GIG | |
161 | axis_smem #(23, 128, 3, 0) DRAM | |
162 | ( | |
163 | {128'bz, a_dout0, a_dout1 }, // Data Out | |
164 | {a_din_0, 128'bz, 128'bz }, // Data In | |
165 | {b_wr_adr0, b_rd_adr0, b_rd_adr1}, // Address | |
166 | {a_we_0, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
167 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
168 | {a_clk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
169 | {128'bz, 128'bz, 128'bz } // Mask | |
170 | ); | |
171 | axis_smem #(23, 17 , 2, 0) DRAM_ECC | |
172 | ( | |
173 | { 17'bz, a_eout1 }, // Data Out | |
174 | {a_ein_0, 17'bz }, // Data In | |
175 | {b_wr_adr0, b_rd_adr1}, // Address | |
176 | {a_we_0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
177 | {1'b1, 1'b1 }, // Chip Enable | |
178 | {a_clk, 1'bz }, // Clocks : 1'bz means asynchronous | |
179 | { 17'bz, 17'bz } // Mask | |
180 | ); | |
181 | `endif | |
182 | `ifdef BLK_4GIG | |
183 | //{{{ | |
184 | `ifdef TAGGED_DRAM | |
185 | wire [23:13] tag_addr_a = c_wr_adr0[23:13]; | |
186 | wire tag_din_a=1'b1; | |
187 | axis_smem #(24-13, 1, 1, 0, 1'b0) tag_a ( | |
188 | {1'bz}, | |
189 | {tag_din_a}, | |
190 | {tag_addr_a}, | |
191 | {a_we_0}, | |
192 | {1'b1}, | |
193 | {a_clk}, | |
194 | {1'bz}); | |
195 | ||
196 | wire [23:13] tag_addr_b = c_wr_adr0[23:13]; | |
197 | wire tag_din_b=1'b1; | |
198 | axis_smem #(24-13, 1, 1, 0, 1'b0) tag_b ( | |
199 | {1'bz}, | |
200 | {tag_din_b}, | |
201 | {tag_addr_b}, | |
202 | {a_we_0}, | |
203 | {1'b1}, | |
204 | {a_clk}, | |
205 | {1'bz}); | |
206 | `endif | |
207 | //}}} | |
208 | wire [63:0] a_dout0a; | |
209 | wire [63:0] a_dout1a; | |
210 | wire [63:0] a_din0a=a_din_0[63:0]; | |
211 | wire [63:0] a_dout0b; | |
212 | wire [63:0] a_dout1b; | |
213 | wire [63:0] a_din0b=a_din_0[127:64]; | |
214 | assign a_dout0={a_dout0b,a_dout0a}; | |
215 | assign a_dout1={a_dout1b,a_dout1a}; | |
216 | initial $axis_initmem(0, DRAM); | |
217 | initial $axis_initmem(0, DRAM1); | |
218 | `ifdef TAGGED_DRAM | |
219 | axis_smem #(24, 64, 3, 0, 1'b0, "D", "tag_a") DRAM | |
220 | `else | |
221 | axis_smem #(24, 64, 3, 0) DRAM | |
222 | `endif | |
223 | ( | |
224 | {64'bz, a_dout0a, a_dout1a }, // Data Out | |
225 | {a_din0a, 64'bz, 64'bz }, // Data In | |
226 | {c_wr_adr0, c_rd_adr0, c_rd_adr1}, // Address | |
227 | {a_we_0, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
228 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
229 | {a_clk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
230 | {64'bz, 64'bz, 64'bz } // Mask | |
231 | ); | |
232 | ||
233 | `ifdef TAGGED_DRAM | |
234 | axis_smem #(24, 64, 3, 0, 1'b0, "D", "tag_b") DRAM1 | |
235 | `else | |
236 | axis_smem #(24, 64, 3, 0) DRAM1 | |
237 | `endif | |
238 | ( | |
239 | {64'bz, a_dout0b, a_dout1b }, // Data Out | |
240 | {a_din0b, 64'bz, 64'bz }, // Data In | |
241 | {c_wr_adr0, c_rd_adr0, c_rd_adr1}, // Address | |
242 | {a_we_0, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
243 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
244 | {a_clk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
245 | {64'bz, 64'bz, 64'bz } // Mask | |
246 | ); | |
247 | axis_smem #(24, 17 , 2, 0) DRAM_ECC | |
248 | ( | |
249 | { 17'bz, a_eout1 }, // Data Out | |
250 | {a_ein_0, 17'bz }, // Data In | |
251 | {c_wr_adr0, c_rd_adr1}, // Address | |
252 | {a_we_0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
253 | {1'b1, 1'b1 }, // Chip Enable | |
254 | {a_clk, 1'bz }, // Clocks : 1'bz means asynchronous | |
255 | { 17'bz, 17'bz } // Mask | |
256 | ); | |
257 | ||
258 | `endif | |
259 | `ifdef BLK_8GIG | |
260 | axis_smem #(25, 128, 3, 0) DRAM | |
261 | ( | |
262 | {128'bz, a_dout0, a_dout1 }, // Data Out | |
263 | {a_din_0, 128'bz, 128'bz }, // Data In | |
264 | {d_wr_adr0, d_rd_adr0, d_rd_adr1}, // Address | |
265 | {a_we_0, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
266 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
267 | {a_clk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
268 | {128'bz, 128'bz, 128'bz } // Mask | |
269 | ); | |
270 | `endif | |
271 | ||
272 | reg [127:0] din_0_r; | |
273 | ||
274 | always @(posedge clk) begin | |
275 | din_0_r <= din_0; | |
276 | if (we_0 & dram_dump) | |
277 | begin // axis tbcall_region | |
278 | $display("WD=%h", din_0_r); | |
279 | end | |
280 | end | |
281 | ||
282 | `else | |
283 | assign eout1[ 15:0] = (ecc_out[15:0] ^ {16{rd_adr1[25]}}); | |
284 | initial $display("WARNING: storage of ECC codes not supported in this dram model on non-axis platforms"); | |
285 | ||
286 | `ifdef BLK_1GIG | |
287 | reg /*sparse */ [127:0] DRAM [22'h3FFFFF:0]; | |
288 | assign dout0[127:0] = DRAM[(a_rd_adr0 & 22'h3FFFFF)]; | |
289 | assign dout1[127:0] = DRAM[(a_rd_adr1 & 22'h3FFFFF)]; | |
290 | `endif | |
291 | `ifdef BLK_2GIG | |
292 | reg /*sparse */ [127:0] DRAM [23'h7FFFFF:0]; | |
293 | assign dout0[127:0] = DRAM[(b_rd_adr0 & 23'h7FFFFF)]; | |
294 | assign dout1[127:0] = DRAM[(b_rd_adr1 & 23'h7FFFFF)]; | |
295 | `endif | |
296 | `ifdef BLK_4GIG | |
297 | reg /*sparse */ [127:0] DRAM [24'hFFFFFF:0]; | |
298 | assign dout0[127:0] = DRAM[(d_rd_adr0 & 24'hFFFFFF)]; | |
299 | assign dout1[127:0] = DRAM[(d_rd_adr1 & 24'hFFFFFF)]; | |
300 | `endif | |
301 | `ifdef BLK_8GIG | |
302 | reg /*sparse */ [127:0] DRAM [25'h1FFFFFF:0]; | |
303 | assign dout0[127:0] = DRAM[(d_rd_adr0 & 25'h1FFFFFF)]; | |
304 | assign dout1[127:0] = DRAM[(d_rd_adr1 & 25'h1FFFFFF)]; | |
305 | `endif | |
306 | ||
307 | integer j; | |
308 | initial | |
309 | begin | |
310 | `ifdef BLK_1GIG for (j=22'h3F0000 ; j<=22'h3FFFFF ; j=j+1) DRAM [j] = 128'h0; `endif | |
311 | `ifdef BLK_2GIG for (j=23'h7E0000 ; j<=23'h7FFFFF ; j=j+1) DRAM [j] = 128'h0; `endif | |
312 | `ifdef BLK_4GIG for (j=23'h7C0000 ; j<=24'h7FFFFF ; j=j+1) DRAM [j] = 128'h0; `endif | |
313 | `ifdef BLK_4GIG for (j=20'h00000 ; j<=24'hFFFFF ; j=j+1) DRAM [j] = 128'h0; `endif | |
314 | `ifdef BLK_8GIG for (j=25'h1F80000; j<=25'h1FFFFFF; j=j+1) DRAM [j] = 128'h0; `endif | |
315 | end // of initial | |
316 | ||
317 | wire a0_we_0 = a_we_0 & ~c_wr_adr0[23]; | |
318 | wire a1_we_0 = a_we_0 & c_wr_adr0[23]; | |
319 | ||
320 | always @(posedge clk) begin | |
321 | `ifdef BLK_1GIG if (a_we_0) DRAM[(a_wr_adr0 & 22'h3FFFFF)] <= din_0; `endif | |
322 | `ifdef BLK_2GIG if (a_we_0) DRAM[(b_wr_adr0 & 23'h7FFFFF)] <= din_0; `endif | |
323 | `ifdef BLK_4GIG if (a0_we_0) DRAM [(c_wr_adr0 & 24'hFFFFFF)] <= din_0; `endif | |
324 | `ifdef BLK_8GIG if (a_we_0) DRAM[(d_wr_adr0 & 25'h1FFFFFF)] <= din_0; `endif | |
325 | ||
326 | if (we_0 & dram_dump) $display("WD=%h", din_0); | |
327 | end | |
328 | ||
329 | `endif //AXIS | |
330 | `endif // !`ifdef PALLADIUM | |
331 | ||
332 | endmodule | |
333 | ||
334 | ||
335 | ||
336 | module dram_dir ( | |
337 | adr0, | |
338 | adr1, | |
339 | adr2, | |
340 | adr3, | |
341 | adr4, | |
342 | data0, | |
343 | data1, | |
344 | data2, | |
345 | data3, | |
346 | data4 | |
347 | ); | |
348 | ||
349 | ||
350 | input [18:0] adr0; | |
351 | input [18:0] adr1; | |
352 | input [18:0] adr2; | |
353 | input [18:0] adr3; | |
354 | input [18:0] adr4; | |
355 | output [31:0] data0; | |
356 | output [31:0] data1; | |
357 | output [31:0] data2; | |
358 | output [31:0] data3; | |
359 | output [31:0] data4; | |
360 | ||
361 | wire [15:0] a_adr0 = adr0[15:0]; | |
362 | wire [15:0] a_adr1 = adr1[15:0]; | |
363 | wire [15:0] a_adr2 = adr2[15:0]; | |
364 | wire [15:0] a_adr3 = adr3[15:0]; | |
365 | wire [15:0] a_adr4 = adr4[15:0]; | |
366 | wire [16:0] b_adr0 = adr0[16:0]; | |
367 | wire [16:0] b_adr1 = adr1[16:0]; | |
368 | wire [16:0] b_adr2 = adr2[16:0]; | |
369 | wire [16:0] b_adr3 = adr3[16:0]; | |
370 | wire [16:0] b_adr4 = adr4[16:0]; | |
371 | wire [17:0] c_adr0 = adr0[17:0]; | |
372 | wire [17:0] c_adr1 = adr1[17:0]; | |
373 | wire [17:0] c_adr2 = adr2[17:0]; | |
374 | wire [17:0] c_adr3 = adr3[17:0]; | |
375 | wire [17:0] c_adr4 = adr4[17:0]; | |
376 | wire [18:0] d_adr0 = adr0[18:0]; | |
377 | wire [18:0] d_adr1 = adr1[18:0]; | |
378 | wire [18:0] d_adr2 = adr2[18:0]; | |
379 | wire [18:0] d_adr3 = adr3[18:0]; | |
380 | wire [18:0] d_adr4 = adr4[18:0]; | |
381 | wire [31:0] a_data0; | |
382 | wire [31:0] a_data1; | |
383 | wire [31:0] a_data2; | |
384 | wire [31:0] a_data3; | |
385 | wire [31:0] a_data4; | |
386 | ||
387 | `ifdef PALLADIUM | |
388 | ||
389 | `ifdef BLK_1GIG | |
390 | reg /*sparse */ [31:0] DRAM_DIR [16'hFFFF:0]; | |
391 | assign data0[31:0] = DRAM_DIR[a_adr0]; | |
392 | assign data1[31:0] = DRAM_DIR[a_adr1]; | |
393 | assign data2[31:0] = DRAM_DIR[a_adr2]; | |
394 | assign data3[31:0] = DRAM_DIR[a_adr3]; | |
395 | assign data4[31:0] = DRAM_DIR[a_adr4]; | |
396 | `endif | |
397 | `ifdef BLK_2GIG | |
398 | reg [31:0] DRAM_DIR [17'h1FFFF:0]; | |
399 | assign data0[31:0] = DRAM_DIR[b_adr0]; | |
400 | assign data1[31:0] = DRAM_DIR[b_adr1]; | |
401 | assign data2[31:0] = DRAM_DIR[b_adr2]; | |
402 | assign data3[31:0] = DRAM_DIR[b_adr3]; | |
403 | assign data4[31:0] = DRAM_DIR[b_adr4]; | |
404 | `endif | |
405 | `ifdef BLK_4GIG | |
406 | reg [31:0] DRAM_DIR [18'h3FFFF:0]; | |
407 | assign data0[31:0] = DRAM_DIR[c_adr0]; | |
408 | assign data1[31:0] = DRAM_DIR[c_adr1]; | |
409 | assign data2[31:0] = DRAM_DIR[c_adr2]; | |
410 | assign data3[31:0] = DRAM_DIR[c_adr3]; | |
411 | assign data4[31:0] = DRAM_DIR[c_adr4]; | |
412 | `endif | |
413 | `ifdef BLK_8GIG | |
414 | reg [31:0] DRAM_DIR [19'h7FFFF:0]; | |
415 | assign data0[31:0] = DRAM_DIR[d_adr0]; | |
416 | assign data1[31:0] = DRAM_DIR[d_adr1]; | |
417 | assign data2[31:0] = DRAM_DIR[d_adr2]; | |
418 | assign data3[31:0] = DRAM_DIR[d_adr3]; | |
419 | assign data4[31:0] = DRAM_DIR[d_adr4]; | |
420 | `endif | |
421 | ||
422 | `else // !`ifdef PALLADIUM | |
423 | ||
424 | `ifdef AXIS | |
425 | assign data0[31:0] = a_data0; | |
426 | assign data1[31:0] = a_data1; | |
427 | assign data2[31:0] = a_data2; | |
428 | assign data3[31:0] = a_data3; | |
429 | assign data4[31:0] = a_data4; | |
430 | ||
431 | `ifdef BLK_1GIG | |
432 | axis_smem #(16, 32, 5, 0) DRAM_DIR | |
433 | ( | |
434 | {a_data0, a_data1, a_data2, a_data3, a_data4}, // Data Out | |
435 | {32'bz , 32'bz, 32'bz, 32'bz, 32'bz}, // Data In | |
436 | {a_adr0 , a_adr1, a_adr2, a_adr3, a_adr4 }, // Address | |
437 | {1'b0 , 1'b0 , 1'b0, 1'b0, 1'b0 }, // Write Enable : 1'b0 means always read | |
438 | {1'b1 , 1'b1 , 1'b1, 1'b1, 1'b1 }, // Chip Enable | |
439 | {1'bz , 1'bz , 1'bz, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
440 | {32'bz , 32'bz , 32'bz, 32'bz, 32'bz } // Mask | |
441 | ); | |
442 | `endif | |
443 | `ifdef BLK_2GIG | |
444 | axis_smem #(17, 32, 5, 0) DRAM_DIR | |
445 | ( | |
446 | {a_data0, a_data1, a_data2, a_data3, a_data4}, // Data Out | |
447 | {32'bz , 32'bz, 32'bz, 32'bz, 32'bz}, // Data In | |
448 | {b_adr0 , b_adr1, b_adr2, b_adr3, b_adr4 }, // Address | |
449 | {1'b0 , 1'b0 , 1'b0, 1'b0, 1'b0 }, // Write Enable : 1'b0 means always read | |
450 | {1'b1 , 1'b1 , 1'b1, 1'b1, 1'b1 }, // Chip Enable | |
451 | {1'bz , 1'bz , 1'bz, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
452 | {32'bz , 32'bz , 32'bz, 32'bz, 32'bz } // Mask | |
453 | ); | |
454 | `endif | |
455 | `ifdef BLK_4GIG | |
456 | axis_smem #(18, 32, 5, 0) DRAM_DIR | |
457 | ( | |
458 | {a_data0, a_data1, a_data2, a_data3, a_data4}, // Data Out | |
459 | {32'bz , 32'bz, 32'bz, 32'bz, 32'bz}, // Data In | |
460 | {c_adr0 , c_adr1, c_adr2, c_adr3, c_adr4 }, // Address | |
461 | {1'b0 , 1'b0 , 1'b0, 1'b0, 1'b0 }, // Write Enable : 1'b0 means always read | |
462 | {1'b1 , 1'b1 , 1'b1, 1'b1, 1'b1 }, // Chip Enable | |
463 | {1'bz , 1'bz , 1'bz, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
464 | {32'bz , 32'bz , 32'bz, 32'bz, 32'bz } // Mask | |
465 | ); | |
466 | `endif | |
467 | `ifdef BLK_8GIG | |
468 | axis_smem #(19, 32, 5, 0) DRAM_DIR | |
469 | ( | |
470 | {a_data0, a_data1, a_data2, a_data3, a_data4}, // Data Out | |
471 | {32'bz , 32'bz, 32'bz, 32'bz, 32'bz}, // Data In | |
472 | {d_adr0 , d_adr1, d_adr2, d_adr3, d_adr4 }, // Address | |
473 | {1'b0 , 1'b0 , 1'b0, 1'b0, 1'b0 }, // Write Enable : 1'b0 means always read | |
474 | {1'b1 , 1'b1 , 1'b1, 1'b1, 1'b1 }, // Chip Enable | |
475 | {1'bz , 1'bz , 1'bz, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
476 | {32'bz , 32'bz , 32'bz, 32'bz, 32'bz } // Mask | |
477 | ); | |
478 | `endif | |
479 | ||
480 | `else | |
481 | ||
482 | `ifdef BLK_1GIG | |
483 | reg /*sparse */ [31:0] DRAM_DIR [16'hFFFF:0]; | |
484 | assign data0[31:0] = DRAM_DIR[a_adr0]; | |
485 | assign data1[31:0] = DRAM_DIR[a_adr1]; | |
486 | assign data2[31:0] = DRAM_DIR[a_adr2]; | |
487 | assign data3[31:0] = DRAM_DIR[a_adr3]; | |
488 | assign data4[31:0] = DRAM_DIR[a_adr4]; | |
489 | `endif | |
490 | `ifdef BLK_2GIG | |
491 | reg [31:0] DRAM_DIR [17'h1FFFF:0]; | |
492 | assign data0[31:0] = DRAM_DIR[b_adr0]; | |
493 | assign data1[31:0] = DRAM_DIR[b_adr1]; | |
494 | assign data2[31:0] = DRAM_DIR[b_adr2]; | |
495 | assign data3[31:0] = DRAM_DIR[b_adr3]; | |
496 | assign data4[31:0] = DRAM_DIR[b_adr4]; | |
497 | `endif | |
498 | `ifdef BLK_4GIG | |
499 | reg [31:0] DRAM_DIR [18'h3FFFF:0]; | |
500 | assign data0[31:0] = DRAM_DIR[c_adr0]; | |
501 | assign data1[31:0] = DRAM_DIR[c_adr1]; | |
502 | assign data2[31:0] = DRAM_DIR[c_adr2]; | |
503 | assign data3[31:0] = DRAM_DIR[c_adr3]; | |
504 | assign data4[31:0] = DRAM_DIR[c_adr4]; | |
505 | `endif | |
506 | `ifdef BLK_8GIG | |
507 | reg [31:0] DRAM_DIR [19'h7FFFF:0]; | |
508 | assign data0[31:0] = DRAM_DIR[d_adr0]; | |
509 | assign data1[31:0] = DRAM_DIR[d_adr1]; | |
510 | assign data2[31:0] = DRAM_DIR[d_adr2]; | |
511 | assign data3[31:0] = DRAM_DIR[d_adr3]; | |
512 | assign data4[31:0] = DRAM_DIR[d_adr4]; | |
513 | `endif | |
514 | ||
515 | integer j; | |
516 | initial | |
517 | begin | |
518 | for(j=0 ; j<=65535; j=j+1) begin | |
519 | DRAM_DIR [j] = 32'hDEADBEEF; | |
520 | end | |
521 | end // of initial | |
522 | ||
523 | ||
524 | `endif //AXIS | |
525 | `endif // !`ifdef PALLADIUM | |
526 | ||
527 | endmodule | |
528 | ||
529 | ||
530 | module l2data_axis (data_out, rclk, adr, data_in, we, wm); | |
531 | ||
532 | output [155:0] data_out; | |
533 | input rclk; | |
534 | input [9:0] adr; | |
535 | input [155:0] data_in; | |
536 | input we; | |
537 | input [155:0] wm; | |
538 | ||
539 | wire a_rclk = rclk; | |
540 | wire [ 9:0] a_adr = adr; | |
541 | wire [127:0] a_data_in = {data_in[155:124],data_in[116:85],data_in[77:46],data_in[38:7]}; | |
542 | wire a_we = we; | |
543 | wire [127:0] a_wm = {wm[155:124],wm[116:85],wm[77:46],wm[38:7]}; | |
544 | wire [155:0] a_data_out; | |
545 | wire [127:0] b_data_out; | |
546 | wire [127:0] c_data_out; | |
547 | ||
548 | ||
549 | `ifdef AXIS | |
550 | axis_smem #(10, 128, 2, 0) L2 | |
551 | ( | |
552 | {128'bz, c_data_out }, // Data Out | |
553 | {a_data_in, 128'bz }, // Data In | |
554 | {a_adr, a_adr }, // Address | |
555 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
556 | {1'b1, 1'b1 }, // Chip Enable | |
557 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
558 | {a_wm, 128'bz } // Mask | |
559 | ); | |
560 | ||
561 | assign b_data_out = c_data_out; | |
562 | ||
563 | /***************************** | |
564 | reg [127:0] din_0_r; | |
565 | reg [ 9:0] a_adr_r; | |
566 | reg [127:0] a_wm_r; | |
567 | ||
568 | always @(posedge a_rclk) begin | |
569 | din_0_r <= a_data_in; | |
570 | a_adr_r <= a_adr; | |
571 | a_wm_r <= a_wm; | |
572 | if (a_we & l2_dump) | |
573 | begin // axis tbcall_region | |
574 | $display("L2 ADR=%h WM=%h WD=%h", a_adr_r, a_wm_r, din_0_r); | |
575 | end | |
576 | end | |
577 | *****************************/ | |
578 | ||
579 | `else | |
580 | ||
581 | reg [127:0] L2 [1023:0]; | |
582 | reg [255:0] ERR_BIT; | |
583 | ||
584 | initial ERR_BIT = 256'h1; | |
585 | ||
586 | assign b_data_out[127:0] = L2[adr]; | |
587 | ||
588 | wire [128:0] l2_in = (~a_wm[127:0] & b_data_out) | (a_wm[127:0] & a_data_in); | |
589 | ||
590 | always @(posedge rclk) begin | |
591 | if (we) L2[adr] <= l2_in; | |
592 | ERR_BIT <= {ERR_BIT[254:0], ERR_BIT[255]}; | |
593 | end | |
594 | ||
595 | `endif | |
596 | ||
597 | zzecc_sctag_pgen_32b ecc3 ( .dout(a_data_out[155:124]), .parity(a_data_out[123:117]), .din(b_data_out[127:96]) ); | |
598 | zzecc_sctag_pgen_32b ecc2 ( .dout(a_data_out[116: 85]), .parity(a_data_out[ 84: 78]), .din(b_data_out[ 95:64]) ); | |
599 | zzecc_sctag_pgen_32b ecc1 ( .dout(a_data_out[ 77: 46]), .parity(a_data_out[ 45: 39]), .din(b_data_out[ 63:32]) ); | |
600 | zzecc_sctag_pgen_32b ecc0 ( .dout(a_data_out[ 38: 7]), .parity(a_data_out[ 6: 0]), .din(b_data_out[ 31: 0]) ); | |
601 | ||
602 | assign data_out[155:0] = a_data_out[155:0]; // ^ ERR_BIT[155:0]; | |
603 | ||
604 | /******************* | |
605 | module zzecc_sctag_pgen_32b ( dout, parity, din); | |
606 | ||
607 | //Output: 32bit dout and 7bit parity bit | |
608 | output[31:0] dout; | |
609 | output [6:0] parity; | |
610 | ||
611 | //Input: 32bit data din | |
612 | input [31:0] din; | |
613 | *******************/ | |
614 | ||
615 | endmodule | |
616 | ||
617 | ||
618 | ||
619 | module l2tag_axis (rclk, adr, we, tag_in, tag_out); | |
620 | ||
621 | input rclk; | |
622 | input [ 9:0] adr; | |
623 | input [ 27:0] we; | |
624 | input [ 27:0] tag_in; | |
625 | output [ 27:0] tag_out; | |
626 | ||
627 | `ifdef AXIS | |
628 | wire a_rclk = rclk; | |
629 | wire [ 9:0] a_adr = adr; | |
630 | wire [ 27:0] a_we = we; | |
631 | wire [ 27:0] a_tag_in = tag_in; | |
632 | wire [ 27:0] a_tag_out; | |
633 | ||
634 | assign tag_out[27:0] = a_tag_out; | |
635 | ||
636 | axis_smem #(10, 28, 2, 0) L2_TAG | |
637 | ( | |
638 | { 28'bz, a_tag_out }, // Data Out | |
639 | {a_tag_in, 28'bz }, // Data In | |
640 | {a_adr, a_adr }, // Address | |
641 | {1'b1, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
642 | {1'b1, 1'b1 }, // Chip Enable | |
643 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
644 | {a_we, 28'bz } // Mask | |
645 | ); | |
646 | ||
647 | `else | |
648 | ||
649 | reg [ 27:0] L2_TAG [1023:0]; | |
650 | ||
651 | assign tag_out[ 27:0] = L2_TAG[adr]; | |
652 | ||
653 | wire [ 27:0] l2_in = (~we[ 27:0] & tag_out) | (we[ 27:0] & tag_in); | |
654 | ||
655 | always @(posedge rclk) begin | |
656 | L2_TAG[adr] <= l2_in; | |
657 | end | |
658 | ||
659 | `endif | |
660 | ||
661 | endmodule | |
662 | ||
663 | ||
664 | module ic_data ( nclk, adr, we, din, dout ); | |
665 | ||
666 | input nclk; | |
667 | input [7:0] adr; | |
668 | input [543:0] we; | |
669 | input [543:0] din; | |
670 | output [543:0] dout; | |
671 | ||
672 | `ifdef AXIS | |
673 | wire a_nclk = nclk; | |
674 | wire [ 7:0] a_adr = adr; | |
675 | wire [543:0] a_we = we; | |
676 | wire [543:0] a_din = din; | |
677 | wire [543:0] a_dout; | |
678 | ||
679 | assign dout[543:0] = a_dout; | |
680 | ||
681 | axis_smem #(8, 544, 2, 0) IC | |
682 | ( | |
683 | {544'bz, a_dout }, // Data Out | |
684 | {a_din, 544'bz }, // Data In | |
685 | {a_adr, a_adr }, // Address | |
686 | {1'b1, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
687 | {1'b1, 1'b1 }, // Chip Enable | |
688 | {a_nclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
689 | {a_we, 544'bz } // Mask | |
690 | ); | |
691 | ||
692 | `else | |
693 | ||
694 | reg [543:0] IC [255:0]; | |
695 | ||
696 | assign dout[543:0] = IC[adr]; | |
697 | ||
698 | wire [543:0] ic_in = (~we[543:0] & dout) | (we[543:0] & din); | |
699 | ||
700 | always @(posedge nclk) begin // Clock was inverted | |
701 | IC[adr] <= ic_in; | |
702 | end | |
703 | ||
704 | `endif | |
705 | ||
706 | endmodule | |
707 | ||
708 | ||
709 | ||
710 | module dc_data (nclk, adr, we, wm, din, dout ); | |
711 | ||
712 | input nclk; | |
713 | input [6:0] adr; | |
714 | input we; | |
715 | input [143:0] wm; | |
716 | input [143:0] din; | |
717 | output [143:0] dout; | |
718 | ||
719 | `ifdef AXIS | |
720 | wire a_nclk = nclk; | |
721 | wire [ 6:0] a_adr = adr; | |
722 | wire a_we = we; | |
723 | wire [143:0] a_wm = wm; | |
724 | wire [143:0] a_din = din; | |
725 | wire [143:0] a_dout; | |
726 | ||
727 | assign dout[143:0] = a_dout; | |
728 | ||
729 | axis_smem #(7, 144, 2, 0) DC | |
730 | ( | |
731 | {144'bz, a_dout }, // Data Out | |
732 | {a_din, 144'bz }, // Data In | |
733 | {a_adr, a_adr }, // Address | |
734 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
735 | {1'b1, 1'b1 }, // Chip Enable | |
736 | {a_nclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
737 | {a_wm, 144'bz } // Mask | |
738 | ); | |
739 | ||
740 | `else | |
741 | ||
742 | reg [143:0] DC [127:0]; | |
743 | ||
744 | assign dout[143:0] = DC[adr]; | |
745 | ||
746 | wire [143:0] dc_in = (~wm[143:0] & dout) | (wm[143:0] & din); | |
747 | ||
748 | always @(posedge nclk) begin // Clock was inverted | |
749 | if (we) DC[adr] <= dc_in; | |
750 | //if (we) $display(" DC write ADR=%h, DATA=%h", adr, dc_in); | |
751 | end | |
752 | ||
753 | `endif | |
754 | ||
755 | endmodule | |
756 | ||
757 | ||
758 | module l1_tag (nclk, adr, we, wm, din, dout ); | |
759 | ||
760 | input nclk; | |
761 | input [6:0] adr; | |
762 | input we; | |
763 | input [131:0] wm; | |
764 | input [131:0] din; | |
765 | output [131:0] dout; | |
766 | ||
767 | wire [6:0] snoop_adr = (test_cmp.cmp_sat.SNOOP_CNT == 4) ? {test_cmp.cmp_sat.dram_adr_inclusive[11:6], 1'b0} : | |
768 | (test_cmp.cmp_sat.SNOOP_CNT == 5) ? {test_cmp.cmp_sat.dram_adr_inclusive[11:6], 1'b1} : | |
769 | {test_cmp.cmp_sat.dram_adr_inclusive[10:6], test_cmp.cmp_sat.SNOOP_CNT[1:0]}; | |
770 | ||
771 | `ifdef AXIS | |
772 | wire a_nclk = nclk; | |
773 | wire [ 6:0] a_adr = adr; | |
774 | wire a_we = we; | |
775 | wire [131:0] a_wm = wm; | |
776 | wire [131:0] a_din = din; | |
777 | wire [131:0] a_dout; | |
778 | wire [131:0] b_dout; | |
779 | ||
780 | assign dout[131:0] = a_dout; | |
781 | ||
782 | axis_smem #(7, 132, 3, 0) TG | |
783 | ( | |
784 | {132'bz, a_dout, b_dout }, // Data Out | |
785 | {a_din, 132'bz, 132'bz }, // Data In | |
786 | {a_adr, a_adr, snoop_adr }, // Address | |
787 | {a_we, 1'b0, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
788 | {1'b1, 1'b1, 1'b1 }, // Chip Enable | |
789 | {a_nclk, 1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
790 | {a_wm, 132'bz, 132'bz } // Mask | |
791 | ); | |
792 | ||
793 | wire [131:0] snoop_out = b_dout; | |
794 | ||
795 | `else | |
796 | ||
797 | reg [131:0] TG [127:0]; | |
798 | ||
799 | assign dout[131:0] = TG[adr]; | |
800 | ||
801 | wire [131:0] tg_in = (~wm[131:0] & dout) | (wm[131:0] & din); | |
802 | ||
803 | always @(posedge nclk) begin // Clock was inverted | |
804 | if (we) TG[adr] <= tg_in; | |
805 | end | |
806 | ||
807 | wire [131:0] snoop_out = TG[snoop_adr]; | |
808 | ||
809 | `endif | |
810 | ||
811 | wire [3:0] snoop_err_dc; | |
812 | ||
813 | assign snoop_err_dc[0] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
814 | (test_cmp.cmp_sat.dram_adr_inclusive[36:11] == snoop_out[ 25: 0]); | |
815 | assign snoop_err_dc[1] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
816 | (test_cmp.cmp_sat.dram_adr_inclusive[36:11] == snoop_out[ 58:33]); | |
817 | assign snoop_err_dc[2] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
818 | (test_cmp.cmp_sat.dram_adr_inclusive[36:11] == snoop_out[ 91:66]); | |
819 | assign snoop_err_dc[3] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
820 | (test_cmp.cmp_sat.dram_adr_inclusive[36:11] == snoop_out[124:99]); | |
821 | ||
822 | wire [3:0] snoop_err_ic; | |
823 | ||
824 | assign snoop_err_ic[0] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
825 | (test_cmp.cmp_sat.dram_adr_inclusive[36:12] == snoop_out[ 24: 0]); | |
826 | assign snoop_err_ic[1] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
827 | (test_cmp.cmp_sat.dram_adr_inclusive[36:12] == snoop_out[ 57:33]); | |
828 | assign snoop_err_ic[2] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
829 | (test_cmp.cmp_sat.dram_adr_inclusive[36:12] == snoop_out[ 90:66]); | |
830 | assign snoop_err_ic[3] = (test_cmp.cmp_sat.dram_adr_inclusive != 0) & | |
831 | (test_cmp.cmp_sat.dram_adr_inclusive[36:12] == snoop_out[123:99]); | |
832 | ||
833 | endmodule | |
834 | ||
835 | ||
836 | module rf32x108 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
837 | ||
838 | input rclk; | |
839 | input [4:0] radr; | |
840 | input [4:0] wadr; | |
841 | input ren; | |
842 | input we; | |
843 | input [107:0] wm; | |
844 | input [107:0] din; | |
845 | output [107:0] dout; | |
846 | ||
847 | `ifdef AXIS | |
848 | wire a_rclk = rclk; | |
849 | wire [ 4:0] a_radr = radr; | |
850 | wire [ 4:0] a_wadr = wadr; | |
851 | wire a_ren = ren; | |
852 | wire a_we = we; | |
853 | wire [107:0] a_wm = wm; | |
854 | wire [107:0] a_din = din; | |
855 | wire [107:0] a_dout; | |
856 | ||
857 | assign dout[107:0] = a_dout; | |
858 | ||
859 | axis_smem #(5, 108, 2, 0) REGF32X108 | |
860 | ( | |
861 | {108'bz, a_dout }, // Data Out | |
862 | {a_din, 108'bz }, // Data In | |
863 | {a_wadr, a_radr }, // Address | |
864 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
865 | {1'b1, a_ren }, // Chip Enable | |
866 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
867 | {a_wm, 108'bz } // Mask | |
868 | ); | |
869 | ||
870 | `else | |
871 | ||
872 | reg [107:0] REGF32X108 [31:0]; | |
873 | reg [107:0] LAST; | |
874 | ||
875 | integer j; | |
876 | initial | |
877 | begin | |
878 | for(j=0 ; j<=31; j=j+1) begin | |
879 | REGF32X108 [j] = 108'b0; | |
880 | end | |
881 | LAST = 0; | |
882 | end // of initial | |
883 | ||
884 | ||
885 | assign dout[107:0] = ren ? REGF32X108[radr] : LAST; | |
886 | ||
887 | wire [107:0] rf_in = (~wm[107:0] & REGF32X108[wadr]) | (wm[107:0] & din); | |
888 | ||
889 | always @(posedge rclk) begin | |
890 | if (we) REGF32X108[wadr] <= rf_in; | |
891 | LAST <= dout; | |
892 | end | |
893 | ||
894 | `endif | |
895 | ||
896 | endmodule | |
897 | ||
898 | module rf128x78 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
899 | ||
900 | input rclk; | |
901 | input [6:0] radr; | |
902 | input [6:0] wadr; | |
903 | input ren; | |
904 | input we; | |
905 | input [77:0] wm; | |
906 | input [77:0] din; | |
907 | output [77:0] dout; | |
908 | ||
909 | `ifdef AXIS | |
910 | wire a_rclk = rclk; | |
911 | wire [ 6:0] a_radr = radr; | |
912 | wire [ 6:0] a_wadr = wadr; | |
913 | wire a_ren = ren; | |
914 | wire a_we = we; | |
915 | wire [ 77:0] a_wm = wm; | |
916 | wire [ 77:0] a_din = din; | |
917 | wire [ 77:0] a_dout; | |
918 | ||
919 | assign dout[ 77:0] = a_dout; | |
920 | ||
921 | axis_smem #(7, 78, 2, 0) REGF128X78 | |
922 | ( | |
923 | { 78'bz, a_dout }, // Data Out | |
924 | {a_din, 78'bz }, // Data In | |
925 | {a_wadr, a_radr }, // Address | |
926 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
927 | {1'b1, a_ren }, // Chip Enable | |
928 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
929 | {a_wm, 78'bz } // Mask | |
930 | ); | |
931 | ||
932 | `else | |
933 | ||
934 | reg [ 77:0] REGF128X78 [127:0]; | |
935 | reg [ 77:0] LAST; | |
936 | ||
937 | integer j; | |
938 | initial | |
939 | begin | |
940 | for(j=0 ; j<=127; j=j+1) begin | |
941 | REGF128X78 [j] = 78'b0; | |
942 | end | |
943 | LAST = 0; | |
944 | end // of initial | |
945 | ||
946 | ||
947 | assign dout[ 77:0] = ren ? REGF128X78[radr] : LAST; | |
948 | ||
949 | wire [ 77:0] rf_in = (~wm[ 77:0] & REGF128X78[wadr]) | (wm[ 77:0] & din); | |
950 | ||
951 | always @(posedge rclk) begin | |
952 | if (we) REGF128X78[wadr] <= rf_in; | |
953 | LAST <= dout; | |
954 | end | |
955 | ||
956 | `endif | |
957 | ||
958 | endmodule | |
959 | ||
960 | ||
961 | module rf16x128 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
962 | ||
963 | input rclk; | |
964 | input [3:0] radr; | |
965 | input [3:0] wadr; | |
966 | input ren; | |
967 | input we; | |
968 | input [127:0] wm; | |
969 | input [127:0] din; | |
970 | output [127:0] dout; | |
971 | ||
972 | `ifdef AXIS | |
973 | wire a_rclk = rclk; | |
974 | wire [ 3:0] a_radr = radr; | |
975 | wire [ 3:0] a_wadr = wadr; | |
976 | wire a_ren = ren; | |
977 | wire a_we = we; | |
978 | wire [127:0] a_wm = wm; | |
979 | wire [127:0] a_din = din; | |
980 | wire [127:0] a_dout; | |
981 | ||
982 | /************* | |
983 | reg [127:0] LAST; | |
984 | ||
985 | always @(posedge rclk) begin | |
986 | LAST <= a_ren ? a_dout : LAST; | |
987 | end | |
988 | ||
989 | assign dout[127:0] = LAST; | |
990 | **************/ | |
991 | assign dout[127:0] = a_dout; | |
992 | ||
993 | axis_smem #(4,128, 2, 0) REGF32X80 | |
994 | ( | |
995 | {128'bz, a_dout }, // Data Out | |
996 | {a_din, 128'bz }, // Data In | |
997 | {a_wadr, a_radr }, // Address | |
998 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
999 | {1'b1, a_ren }, // Chip Enable | |
1000 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1001 | {a_wm, 128'bz } // Mask | |
1002 | ); | |
1003 | ||
1004 | `else | |
1005 | ||
1006 | reg [127:0] REGF16X128 [15:0]; | |
1007 | //reg [127:0] LAST; | |
1008 | ||
1009 | integer j; | |
1010 | initial | |
1011 | begin | |
1012 | for(j=0 ; j<=15; j=j+1) begin | |
1013 | REGF16X128[j] = 128'b0; | |
1014 | end | |
1015 | end // of initial | |
1016 | ||
1017 | ||
1018 | //assign dout[127:0] = LAST; | |
1019 | assign dout[127:0] = REGF16X128[radr]; | |
1020 | ||
1021 | wire [127:0] rf_in = (~wm[127:0] & REGF16X128[wadr]) | (wm[127:0] & din); | |
1022 | ||
1023 | always @(posedge rclk) begin | |
1024 | if (we) REGF16X128[wadr] <= rf_in; | |
1025 | //LAST <= ren ? REGF16X128[radr] : LAST; | |
1026 | end | |
1027 | ||
1028 | `endif | |
1029 | ||
1030 | endmodule | |
1031 | ||
1032 | ||
1033 | ||
1034 | ||
1035 | module rf32x80 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
1036 | ||
1037 | input rclk; | |
1038 | input [4:0] radr; | |
1039 | input [4:0] wadr; | |
1040 | input ren; | |
1041 | input we; | |
1042 | input [ 79:0] wm; | |
1043 | input [ 79:0] din; | |
1044 | output [ 79:0] dout; | |
1045 | ||
1046 | `ifdef AXIS | |
1047 | wire a_rclk = rclk; | |
1048 | wire [ 4:0] a_radr = radr; | |
1049 | wire [ 4:0] a_wadr = wadr; | |
1050 | wire a_ren = ren; | |
1051 | wire a_we = we; | |
1052 | wire [ 79:0] a_wm = wm; | |
1053 | wire [ 79:0] a_din = din; | |
1054 | wire [ 79:0] a_dout; | |
1055 | ||
1056 | reg [ 79:0] LAST; | |
1057 | ||
1058 | always @(posedge rclk) begin | |
1059 | LAST <= a_ren ? a_dout : LAST; | |
1060 | end | |
1061 | ||
1062 | assign dout[ 79:0] = LAST; | |
1063 | ||
1064 | axis_smem #(5, 80, 2, 0) REGF32X80 | |
1065 | ( | |
1066 | { 80'bz, a_dout }, // Data Out | |
1067 | {a_din, 80'bz }, // Data In | |
1068 | {a_wadr, a_radr }, // Address | |
1069 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
1070 | {1'b1, a_ren }, // Chip Enable | |
1071 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1072 | {a_wm, 80'bz } // Mask | |
1073 | ); | |
1074 | ||
1075 | `else | |
1076 | ||
1077 | reg [ 79:0] REGF32X80 [31:0]; | |
1078 | reg [ 79:0] LAST; | |
1079 | ||
1080 | integer j; | |
1081 | initial | |
1082 | begin | |
1083 | for(j=0 ; j<=31; j=j+1) begin | |
1084 | REGF32X80 [j] = 80'b0; | |
1085 | end | |
1086 | LAST = 0; | |
1087 | end // of initial | |
1088 | ||
1089 | ||
1090 | assign dout[ 79:0] = LAST; | |
1091 | ||
1092 | wire [ 79:0] rf_in = (~wm[ 79:0] & REGF32X80[wadr]) | (wm[ 79:0] & din); | |
1093 | ||
1094 | always @(posedge rclk) begin | |
1095 | if (we) REGF32X80[wadr] <= rf_in; | |
1096 | LAST <= ren ? REGF32X80[radr] : LAST; | |
1097 | end | |
1098 | ||
1099 | `endif | |
1100 | ||
1101 | endmodule | |
1102 | ||
1103 | module rf32x152 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
1104 | ||
1105 | input rclk; | |
1106 | input [4:0] radr; | |
1107 | input [4:0] wadr; | |
1108 | input ren; | |
1109 | input we; | |
1110 | input [151:0] wm; | |
1111 | input [151:0] din; | |
1112 | output [151:0] dout; | |
1113 | ||
1114 | `ifdef AXIS | |
1115 | wire a_rclk = rclk; | |
1116 | wire [ 4:0] a_radr = radr; | |
1117 | wire [ 4:0] a_wadr = wadr; | |
1118 | wire a_ren = ren; | |
1119 | wire a_we = we; | |
1120 | wire [151:0] a_wm = wm; | |
1121 | wire [151:0] a_din = din; | |
1122 | wire [151:0] a_dout; | |
1123 | ||
1124 | reg [151:0] LAST; | |
1125 | ||
1126 | always @(posedge rclk) begin | |
1127 | LAST <= a_ren ? a_dout : LAST; | |
1128 | end | |
1129 | ||
1130 | assign dout[151:0] = LAST; | |
1131 | ||
1132 | axis_smem #(5, 152, 2, 0) REGF32X152 | |
1133 | ( | |
1134 | {152'bz, a_dout }, // Data Out | |
1135 | {a_din, 152'bz }, // Data In | |
1136 | {a_wadr, a_radr }, // Address | |
1137 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
1138 | {1'b1, a_ren }, // Chip Enable | |
1139 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1140 | {a_wm, 152'bz } // Mask | |
1141 | ); | |
1142 | ||
1143 | `else | |
1144 | ||
1145 | reg [151:0] REGF32X152 [31:0]; | |
1146 | reg [151:0] LAST; | |
1147 | ||
1148 | integer j; | |
1149 | initial | |
1150 | begin | |
1151 | for(j=0 ; j<=31; j=j+1) begin | |
1152 | REGF32X152 [j] = 152'b0; | |
1153 | end | |
1154 | LAST = 0; | |
1155 | end // of initial | |
1156 | ||
1157 | ||
1158 | assign dout[151:0] = LAST; | |
1159 | ||
1160 | wire [151:0] rf_in = (~wm[151:0] & REGF32X152[wadr]) | (wm[151:0] & din); | |
1161 | ||
1162 | always @(posedge rclk) begin | |
1163 | if (we) REGF32X152[wadr] <= rf_in; | |
1164 | LAST <= ren ? REGF32X152[radr] : LAST; | |
1165 | end | |
1166 | ||
1167 | `endif | |
1168 | ||
1169 | endmodule | |
1170 | ||
1171 | ||
1172 | ||
1173 | ||
1174 | module rf16x160 ( rdclk, wrclk, radr, wadr, ren, we, wm, din, dout ); | |
1175 | ||
1176 | input rdclk; | |
1177 | input wrclk; | |
1178 | input [3:0] radr; | |
1179 | input [3:0] wadr; | |
1180 | input ren; | |
1181 | input we; | |
1182 | input [159:0] wm; | |
1183 | input [159:0] din; | |
1184 | output [159:0] dout; | |
1185 | ||
1186 | `ifdef AXIS | |
1187 | wire a_rdclk = rdclk; | |
1188 | wire a_wrclk = wrclk; | |
1189 | wire [ 3:0] a_radr = radr; | |
1190 | wire [ 3:0] a_wadr = wadr; | |
1191 | wire a_ren = ren; | |
1192 | wire a_we = we; | |
1193 | wire [159:0] a_wm = wm; | |
1194 | wire [159:0] a_din = din; | |
1195 | wire [159:0] a_dout; | |
1196 | ||
1197 | assign dout[159:0] = a_dout; | |
1198 | ||
1199 | axis_smem #(4, 160, 2, 0) REGF16X160 | |
1200 | ( | |
1201 | {160'bz, a_dout }, // Data Out | |
1202 | {a_din, 160'bz }, // Data In | |
1203 | {a_wadr, a_radr }, // Address | |
1204 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
1205 | {1'b1, a_ren }, // Chip Enable | |
1206 | {a_wrclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1207 | {a_wm, 160'bz } // Mask | |
1208 | ); | |
1209 | ||
1210 | `else | |
1211 | ||
1212 | reg [159:0] REGF16X160 [15:0]; | |
1213 | reg [159:0] LAST; | |
1214 | ||
1215 | integer j; | |
1216 | initial | |
1217 | begin | |
1218 | for(j=0 ; j<=15; j=j+1) begin | |
1219 | REGF16X160 [j] = 160'b0; | |
1220 | end | |
1221 | LAST = 0; | |
1222 | end // of initial | |
1223 | ||
1224 | ||
1225 | assign dout[159:0] = ren ? REGF16X160[radr] : LAST; | |
1226 | ||
1227 | wire [159:0] rf_in = (~wm[159:0] & REGF16X160[wadr]) | (wm[159:0] & din); | |
1228 | ||
1229 | always @(posedge wrclk) begin | |
1230 | if (we) REGF16X160[wadr] <= rf_in; | |
1231 | end | |
1232 | ||
1233 | always @(posedge rdclk) begin | |
1234 | LAST <= dout; | |
1235 | end | |
1236 | ||
1237 | `endif | |
1238 | ||
1239 | endmodule | |
1240 | ||
1241 | ||
1242 | ||
1243 | module rf16x65 ( rdclk, wrclk, radr, wadr, ren, we, wm, din, dout ); | |
1244 | ||
1245 | input rdclk; | |
1246 | input wrclk; | |
1247 | input [3:0] radr; | |
1248 | input [3:0] wadr; | |
1249 | input ren; | |
1250 | input we; | |
1251 | input [64:0] wm; | |
1252 | input [64:0] din; | |
1253 | output [64:0] dout; | |
1254 | ||
1255 | `ifdef AXIS | |
1256 | wire a_rdclk = rdclk; | |
1257 | wire a_wrclk = wrclk; | |
1258 | wire [ 3:0] a_radr = radr; | |
1259 | wire [ 3:0] a_wadr = wadr; | |
1260 | wire a_ren = ren; | |
1261 | wire a_we = we; | |
1262 | wire [ 64:0] a_wm = wm; | |
1263 | wire [ 64:0] a_din = din; | |
1264 | wire [ 64:0] a_dout; | |
1265 | ||
1266 | //assign dout[ 64:0] = a_dout; | |
1267 | assign dout[ 64:0] = ren ? a_dout : 65'h1FFFFFFFFFFFFFFFF; | |
1268 | ||
1269 | axis_smem #(4, 65, 2, 0) REGF16X65 | |
1270 | ( | |
1271 | { 65'bz, a_dout }, // Data Out | |
1272 | {a_din, 65'bz }, // Data In | |
1273 | {a_wadr, a_radr }, // Address | |
1274 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
1275 | {1'b1, a_ren }, // Chip Enable | |
1276 | {a_wrclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1277 | {a_wm, 65'bz } // Mask | |
1278 | ); | |
1279 | ||
1280 | `else | |
1281 | ||
1282 | reg [ 64:0] REGF16X65 [15:0]; | |
1283 | reg [ 64:0] LAST; | |
1284 | ||
1285 | integer j; | |
1286 | initial | |
1287 | begin | |
1288 | for(j=0 ; j<=15; j=j+1) begin | |
1289 | REGF16X65 [j] = 64'b0; | |
1290 | end | |
1291 | LAST = 0; | |
1292 | end // of initial | |
1293 | ||
1294 | ||
1295 | assign dout[ 64:0] = ren ? REGF16X65 [radr] : LAST; | |
1296 | ||
1297 | wire [ 64:0] rf_in = (~wm[ 64:0] & REGF16X65 [wadr]) | (wm[ 64:0] & din); | |
1298 | ||
1299 | always @(posedge wrclk) begin | |
1300 | if (we) REGF16X65 [wadr] <= rf_in; | |
1301 | end | |
1302 | ||
1303 | always @(posedge rdclk) begin | |
1304 | //LAST <= dout; | |
1305 | LAST <= 65'h1FFFFFFFFFFFFFFFF; | |
1306 | end | |
1307 | ||
1308 | `endif | |
1309 | ||
1310 | endmodule | |
1311 | ||
1312 | module dbuff_mem ( | |
1313 | adr0, | |
1314 | adr1, | |
1315 | data0, | |
1316 | data1 | |
1317 | ); | |
1318 | ||
1319 | ||
1320 | input [19:0] adr0; | |
1321 | input [19:0] adr1; | |
1322 | output [208:0] data0; | |
1323 | output [208:0] data1; | |
1324 | ||
1325 | `ifdef AXIS | |
1326 | wire [19:0] a_adr0 = adr0; | |
1327 | wire [19:0] a_adr1 = adr1; | |
1328 | wire [208:0] a_data0; | |
1329 | wire [208:0] a_data1; | |
1330 | ||
1331 | assign data0[208:0] = a_data0; | |
1332 | assign data1[208:0] = a_data1; | |
1333 | ||
1334 | axis_smem #(20, 209, 2, 0) DBUFF | |
1335 | ( | |
1336 | {a_data0, a_data1}, // Data Out | |
1337 | {209'bz, 209'bz }, // Data In | |
1338 | {a_adr0, a_adr1 }, // Address | |
1339 | {1'b0, 1'b0 }, // Write Enable : 1'b0 means always read | |
1340 | {1'b1, 1'b1 }, // Chip Enable | |
1341 | {1'bz, 1'bz }, // Clocks : 1'bz means asynchronous | |
1342 | {209'bz, 209'bz } // Mask | |
1343 | ); | |
1344 | ||
1345 | `else | |
1346 | ||
1347 | reg /*sparse */ [208:0] DBUFF [20'hFFFFF:0]; | |
1348 | ||
1349 | integer j; | |
1350 | initial | |
1351 | begin | |
1352 | for(j=0 ; j<=1048575; j=j+1) begin | |
1353 | DBUFF [j] = ~(209'h0); | |
1354 | end | |
1355 | end // of initial | |
1356 | assign data0[208:0] = DBUFF[adr0]; | |
1357 | assign data1[208:0] = DBUFF[adr1]; | |
1358 | ||
1359 | `endif | |
1360 | ||
1361 | endmodule | |
1362 | ||
1363 | ||
1364 | module rf2x32 ( rclk, radr, wadr, ren, we, wm, din, dout ); | |
1365 | ||
1366 | input rclk; | |
1367 | input radr; | |
1368 | input wadr; | |
1369 | input ren; | |
1370 | input we; | |
1371 | input [ 31:0] wm; | |
1372 | input [ 31:0] din; | |
1373 | output [ 31:0] dout; | |
1374 | ||
1375 | `ifdef PALLADIUM | |
1376 | ||
1377 | reg [ 31:0] REGF2X32 [ 1:0]; | |
1378 | reg [ 31:0] LAST; | |
1379 | ||
1380 | integer j; | |
1381 | initial | |
1382 | begin | |
1383 | for(j=0 ; j<=1 ; j=j+1) begin | |
1384 | REGF2X32 [j] = 32'b0; | |
1385 | end | |
1386 | LAST = 0; | |
1387 | end // of initial | |
1388 | ||
1389 | ||
1390 | assign dout[ 31:0] = LAST; | |
1391 | ||
1392 | wire [ 31:0] rf_in = (~wm[ 31:0] & REGF2X32[wadr]) | (wm[ 31:0] & din); | |
1393 | ||
1394 | always @(posedge rclk) begin | |
1395 | if (we) REGF2X32[wadr] <= rf_in; | |
1396 | LAST <= ren ? REGF2X32[radr] : LAST; | |
1397 | end | |
1398 | ||
1399 | `else | |
1400 | ||
1401 | `ifdef AXIS | |
1402 | wire a_rclk = rclk; | |
1403 | wire [2:0] a_radr = {2'b0, radr}; // AXIS memory must have more than 4 entries | |
1404 | wire [2:0] a_wadr = {2'b0, wadr}; | |
1405 | wire a_ren = ren; | |
1406 | wire a_we = we; | |
1407 | wire [ 31:0] a_wm = wm; | |
1408 | wire [ 31:0] a_din = din; | |
1409 | wire [ 31:0] a_dout; | |
1410 | ||
1411 | reg [ 31:0] LAST; | |
1412 | ||
1413 | always @(posedge rclk) begin | |
1414 | LAST <= a_ren ? a_dout : LAST; | |
1415 | end | |
1416 | ||
1417 | assign dout[ 31:0] = LAST; | |
1418 | ||
1419 | axis_smem #(3, 32, 2, 0) REGF2X32 | |
1420 | ( | |
1421 | { 32'bz, a_dout }, // Data Out | |
1422 | {a_din, 32'bz }, // Data In | |
1423 | {a_wadr, a_radr }, // Address | |
1424 | {a_we, 1'b0 }, // Write Enable : Active High , 1'b0 means always read | |
1425 | {1'b1, a_ren }, // Chip Enable | |
1426 | {a_rclk, 1'bz }, // Clocks : 1'bz means asynchronous | |
1427 | {a_wm, 32'bz } // Mask | |
1428 | ); | |
1429 | ||
1430 | `else | |
1431 | ||
1432 | reg [ 31:0] REGF2X32 [ 1:0]; | |
1433 | reg [ 31:0] LAST; | |
1434 | ||
1435 | integer j; | |
1436 | initial | |
1437 | begin | |
1438 | for(j=0 ; j<=1 ; j=j+1) begin | |
1439 | REGF2X32 [j] = 32'b0; | |
1440 | end | |
1441 | LAST = 0; | |
1442 | end // of initial | |
1443 | ||
1444 | ||
1445 | assign dout[ 31:0] = LAST; | |
1446 | ||
1447 | wire [ 31:0] rf_in = (~wm[ 31:0] & REGF2X32[wadr]) | (wm[ 31:0] & din); | |
1448 | ||
1449 | always @(posedge rclk) begin | |
1450 | if (we) REGF2X32[wadr] <= rf_in; | |
1451 | LAST <= ren ? REGF2X32[radr] : LAST; | |
1452 | end | |
1453 | ||
1454 | `endif //AXIS | |
1455 | `endif // !`ifdef PALLADIUM | |
1456 | ||
1457 | endmodule | |
1458 | ||
1459 |