Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / model / verilog / mem / dram / axis_sram.v
CommitLineData
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
45module 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
69wire a_clk = clk;
70wire [21:0] a_rd_adr0 = {rd_adr0[24:19],rd_adr0[15:0]};
71wire [22:0] b_rd_adr0 = {rd_adr0[24:19],rd_adr0[16:0]};
72wire [23:0] c_rd_adr0 = {rd_adr0[24:19],rd_adr0[17:0]};
73wire [24:0] d_rd_adr0 = {rd_adr0[24:19],rd_adr0[18:0]};
74wire [21:0] a_rd_adr1 = {rd_adr1[24:19],rd_adr1[15:0]};
75wire [22:0] b_rd_adr1 = {rd_adr1[24:19],rd_adr1[16:0]};
76wire [23:0] c_rd_adr1 = {rd_adr1[24:19],rd_adr1[17:0]};
77wire [24:0] d_rd_adr1 = {rd_adr1[24:19],rd_adr1[18:0]};
78wire [127:0] a_dout0;
79wire [127:0] a_dout1;
80wire [ 16:0] a_eout1;
81wire [21:0] a_wr_adr0 = {wr_adr0[24:19],wr_adr0[15:0]};
82wire [22:0] b_wr_adr0 = {wr_adr0[24:19],wr_adr0[16:0]};
83wire [23:0] c_wr_adr0 = {wr_adr0[24:19],wr_adr0[17:0]};
84wire [24:0] d_wr_adr0 = {wr_adr0[24:19],wr_adr0[18:0]};
85wire [127:0] a_din_0 = din_0;
86wire a_we_0 = we_0;
87wire [ 16:0] a_ein_0 = {1'b1,din_0[143:128]};
88
89`ifdef PALLADIUM
90
91`ifdef BLK_1GIG
92reg /*sparse */ [127:0] DRAM [22'h3FFFFF:0];
93assign dout0[127:0] = DRAM[(a_rd_adr0 & 22'h3FFFFF)];
94assign dout1[127:0] = DRAM[(a_rd_adr1 & 22'h3FFFFF)];
95 `endif
96`ifdef BLK_2GIG
97reg /*sparse */ [127:0] DRAM [23'h7FFFFF:0];
98assign dout0[127:0] = DRAM[(b_rd_adr0 & 23'h7FFFFF)];
99assign dout1[127:0] = DRAM[(b_rd_adr1 & 23'h7FFFFF)];
100 `endif
101`ifdef BLK_4GIG
102reg /*sparse */ [127:0] DRAM [24'hFFFFFF:0];
103assign dout0[127:0] = DRAM[(d_rd_adr0 & 24'hFFFFFF)];
104assign dout1[127:0] = DRAM[(d_rd_adr1 & 24'hFFFFFF)];
105 `endif
106`ifdef BLK_8GIG
107reg /*sparse */ [127:0] DRAM [25'h1FFFFFF:0];
108assign dout0[127:0] = DRAM[(d_rd_adr0 & 25'h1FFFFFF)];
109assign dout1[127:0] = DRAM[(d_rd_adr1 & 25'h1FFFFFF)];
110 `endif
111
112wire a0_we_0 = a_we_0 & ~c_wr_adr0[23];
113wire a1_we_0 = a_we_0 & c_wr_adr0[23];
114wire [127:0] a_din_0 = din_0[127:0];
115
116always @(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);
123end
124
125`else // !`ifdef PALLADIUM
126
127wire [15:0] ecc_out;
128dram_ecc_gen ecc_gen ( .data(dout1[127:0]), .ecc(ecc_out[15:0]) );
129
130`ifdef AXIS
131
132assign eout1[ 15:0] = a_eout1[16] ? a_eout1[15:0] : (ecc_out[15:0] ^ {16{rd_adr1[25]}});
133assign dout0[127:0] = a_dout0;
134assign dout1[127:0] = a_dout1;
135
136
137
138`ifdef BLK_1GIG
139axis_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);
149axis_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
161axis_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);
171axis_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
185wire [23:13] tag_addr_a = c_wr_adr0[23:13];
186wire tag_din_a=1'b1;
187axis_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
196wire [23:13] tag_addr_b = c_wr_adr0[23:13];
197wire tag_din_b=1'b1;
198axis_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//}}}
208wire [63:0] a_dout0a;
209wire [63:0] a_dout1a;
210wire [63:0] a_din0a=a_din_0[63:0];
211wire [63:0] a_dout0b;
212wire [63:0] a_dout1b;
213wire [63:0] a_din0b=a_din_0[127:64];
214assign a_dout0={a_dout0b,a_dout0a};
215assign a_dout1={a_dout1b,a_dout1a};
216initial $axis_initmem(0, DRAM);
217initial $axis_initmem(0, DRAM1);
218`ifdef TAGGED_DRAM
219axis_smem #(24, 64, 3, 0, 1'b0, "D", "tag_a") DRAM
220`else
221axis_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
234axis_smem #(24, 64, 3, 0, 1'b0, "D", "tag_b") DRAM1
235`else
236axis_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);
247axis_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
260axis_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
272reg [127:0] din_0_r;
273
274always @(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
280end
281
282`else
283assign eout1[ 15:0] = (ecc_out[15:0] ^ {16{rd_adr1[25]}});
284initial $display("WARNING: storage of ECC codes not supported in this dram model on non-axis platforms");
285
286`ifdef BLK_1GIG
287reg /*sparse */ [127:0] DRAM [22'h3FFFFF:0];
288assign dout0[127:0] = DRAM[(a_rd_adr0 & 22'h3FFFFF)];
289assign dout1[127:0] = DRAM[(a_rd_adr1 & 22'h3FFFFF)];
290`endif
291`ifdef BLK_2GIG
292reg /*sparse */ [127:0] DRAM [23'h7FFFFF:0];
293assign dout0[127:0] = DRAM[(b_rd_adr0 & 23'h7FFFFF)];
294assign dout1[127:0] = DRAM[(b_rd_adr1 & 23'h7FFFFF)];
295`endif
296`ifdef BLK_4GIG
297reg /*sparse */ [127:0] DRAM [24'hFFFFFF:0];
298assign dout0[127:0] = DRAM[(d_rd_adr0 & 24'hFFFFFF)];
299assign dout1[127:0] = DRAM[(d_rd_adr1 & 24'hFFFFFF)];
300`endif
301`ifdef BLK_8GIG
302reg /*sparse */ [127:0] DRAM [25'h1FFFFFF:0];
303assign dout0[127:0] = DRAM[(d_rd_adr0 & 25'h1FFFFFF)];
304assign dout1[127:0] = DRAM[(d_rd_adr1 & 25'h1FFFFFF)];
305 `endif
306
307integer j;
308initial
309begin
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
315end // of initial
316
317wire a0_we_0 = a_we_0 & ~c_wr_adr0[23];
318wire a1_we_0 = a_we_0 & c_wr_adr0[23];
319
320always @(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);
327end
328
329`endif //AXIS
330`endif // !`ifdef PALLADIUM
331
332endmodule
333
334
335
336module 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
390reg /*sparse */ [31:0] DRAM_DIR [16'hFFFF:0];
391assign data0[31:0] = DRAM_DIR[a_adr0];
392assign data1[31:0] = DRAM_DIR[a_adr1];
393assign data2[31:0] = DRAM_DIR[a_adr2];
394assign data3[31:0] = DRAM_DIR[a_adr3];
395assign data4[31:0] = DRAM_DIR[a_adr4];
396 `endif
397`ifdef BLK_2GIG
398reg [31:0] DRAM_DIR [17'h1FFFF:0];
399assign data0[31:0] = DRAM_DIR[b_adr0];
400assign data1[31:0] = DRAM_DIR[b_adr1];
401assign data2[31:0] = DRAM_DIR[b_adr2];
402assign data3[31:0] = DRAM_DIR[b_adr3];
403assign data4[31:0] = DRAM_DIR[b_adr4];
404 `endif
405`ifdef BLK_4GIG
406reg [31:0] DRAM_DIR [18'h3FFFF:0];
407assign data0[31:0] = DRAM_DIR[c_adr0];
408assign data1[31:0] = DRAM_DIR[c_adr1];
409assign data2[31:0] = DRAM_DIR[c_adr2];
410assign data3[31:0] = DRAM_DIR[c_adr3];
411assign data4[31:0] = DRAM_DIR[c_adr4];
412 `endif
413`ifdef BLK_8GIG
414reg [31:0] DRAM_DIR [19'h7FFFF:0];
415assign data0[31:0] = DRAM_DIR[d_adr0];
416assign data1[31:0] = DRAM_DIR[d_adr1];
417assign data2[31:0] = DRAM_DIR[d_adr2];
418assign data3[31:0] = DRAM_DIR[d_adr3];
419assign data4[31:0] = DRAM_DIR[d_adr4];
420 `endif
421
422`else // !`ifdef PALLADIUM
423
424`ifdef AXIS
425assign data0[31:0] = a_data0;
426assign data1[31:0] = a_data1;
427assign data2[31:0] = a_data2;
428assign data3[31:0] = a_data3;
429assign data4[31:0] = a_data4;
430
431`ifdef BLK_1GIG
432axis_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
444axis_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
456axis_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
468axis_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
483reg /*sparse */ [31:0] DRAM_DIR [16'hFFFF:0];
484assign data0[31:0] = DRAM_DIR[a_adr0];
485assign data1[31:0] = DRAM_DIR[a_adr1];
486assign data2[31:0] = DRAM_DIR[a_adr2];
487assign data3[31:0] = DRAM_DIR[a_adr3];
488assign data4[31:0] = DRAM_DIR[a_adr4];
489 `endif
490`ifdef BLK_2GIG
491reg [31:0] DRAM_DIR [17'h1FFFF:0];
492assign data0[31:0] = DRAM_DIR[b_adr0];
493assign data1[31:0] = DRAM_DIR[b_adr1];
494assign data2[31:0] = DRAM_DIR[b_adr2];
495assign data3[31:0] = DRAM_DIR[b_adr3];
496assign data4[31:0] = DRAM_DIR[b_adr4];
497 `endif
498`ifdef BLK_4GIG
499reg [31:0] DRAM_DIR [18'h3FFFF:0];
500assign data0[31:0] = DRAM_DIR[c_adr0];
501assign data1[31:0] = DRAM_DIR[c_adr1];
502assign data2[31:0] = DRAM_DIR[c_adr2];
503assign data3[31:0] = DRAM_DIR[c_adr3];
504assign data4[31:0] = DRAM_DIR[c_adr4];
505 `endif
506`ifdef BLK_8GIG
507reg [31:0] DRAM_DIR [19'h7FFFF:0];
508assign data0[31:0] = DRAM_DIR[d_adr0];
509assign data1[31:0] = DRAM_DIR[d_adr1];
510assign data2[31:0] = DRAM_DIR[d_adr2];
511assign data3[31:0] = DRAM_DIR[d_adr3];
512assign data4[31:0] = DRAM_DIR[d_adr4];
513 `endif
514
515integer j;
516initial
517begin
518 for(j=0 ; j<=65535; j=j+1) begin
519 DRAM_DIR [j] = 32'hDEADBEEF;
520 end
521end // of initial
522
523
524`endif //AXIS
525`endif // !`ifdef PALLADIUM
526
527endmodule
528
529
530module l2data_axis (data_out, rclk, adr, data_in, we, wm);
531
532output [155:0] data_out;
533input rclk;
534input [9:0] adr;
535input [155:0] data_in;
536input we;
537input [155:0] wm;
538
539wire a_rclk = rclk;
540wire [ 9:0] a_adr = adr;
541wire [127:0] a_data_in = {data_in[155:124],data_in[116:85],data_in[77:46],data_in[38:7]};
542wire a_we = we;
543wire [127:0] a_wm = {wm[155:124],wm[116:85],wm[77:46],wm[38:7]};
544wire [155:0] a_data_out;
545wire [127:0] b_data_out;
546wire [127:0] c_data_out;
547
548
549`ifdef AXIS
550axis_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
561assign b_data_out = c_data_out;
562
563/*****************************
564reg [127:0] din_0_r;
565reg [ 9:0] a_adr_r;
566reg [127:0] a_wm_r;
567
568always @(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
576end
577*****************************/
578
579`else
580
581reg [127:0] L2 [1023:0];
582reg [255:0] ERR_BIT;
583
584initial ERR_BIT = 256'h1;
585
586assign b_data_out[127:0] = L2[adr];
587
588wire [128:0] l2_in = (~a_wm[127:0] & b_data_out) | (a_wm[127:0] & a_data_in);
589
590always @(posedge rclk) begin
591 if (we) L2[adr] <= l2_in;
592 ERR_BIT <= {ERR_BIT[254:0], ERR_BIT[255]};
593end
594
595`endif
596
597zzecc_sctag_pgen_32b ecc3 ( .dout(a_data_out[155:124]), .parity(a_data_out[123:117]), .din(b_data_out[127:96]) );
598zzecc_sctag_pgen_32b ecc2 ( .dout(a_data_out[116: 85]), .parity(a_data_out[ 84: 78]), .din(b_data_out[ 95:64]) );
599zzecc_sctag_pgen_32b ecc1 ( .dout(a_data_out[ 77: 46]), .parity(a_data_out[ 45: 39]), .din(b_data_out[ 63:32]) );
600zzecc_sctag_pgen_32b ecc0 ( .dout(a_data_out[ 38: 7]), .parity(a_data_out[ 6: 0]), .din(b_data_out[ 31: 0]) );
601
602assign data_out[155:0] = a_data_out[155:0]; // ^ ERR_BIT[155:0];
603
604/*******************
605module 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
615endmodule
616
617
618
619module l2tag_axis (rclk, adr, we, tag_in, tag_out);
620
621input rclk;
622input [ 9:0] adr;
623input [ 27:0] we;
624input [ 27:0] tag_in;
625output [ 27:0] tag_out;
626
627`ifdef AXIS
628wire a_rclk = rclk;
629wire [ 9:0] a_adr = adr;
630wire [ 27:0] a_we = we;
631wire [ 27:0] a_tag_in = tag_in;
632wire [ 27:0] a_tag_out;
633
634assign tag_out[27:0] = a_tag_out;
635
636axis_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
649reg [ 27:0] L2_TAG [1023:0];
650
651assign tag_out[ 27:0] = L2_TAG[adr];
652
653wire [ 27:0] l2_in = (~we[ 27:0] & tag_out) | (we[ 27:0] & tag_in);
654
655always @(posedge rclk) begin
656 L2_TAG[adr] <= l2_in;
657end
658
659`endif
660
661endmodule
662
663
664module ic_data ( nclk, adr, we, din, dout );
665
666input nclk;
667input [7:0] adr;
668input [543:0] we;
669input [543:0] din;
670output [543:0] dout;
671
672`ifdef AXIS
673wire a_nclk = nclk;
674wire [ 7:0] a_adr = adr;
675wire [543:0] a_we = we;
676wire [543:0] a_din = din;
677wire [543:0] a_dout;
678
679assign dout[543:0] = a_dout;
680
681axis_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
694reg [543:0] IC [255:0];
695
696assign dout[543:0] = IC[adr];
697
698wire [543:0] ic_in = (~we[543:0] & dout) | (we[543:0] & din);
699
700always @(posedge nclk) begin // Clock was inverted
701 IC[adr] <= ic_in;
702end
703
704`endif
705
706endmodule
707
708
709
710module dc_data (nclk, adr, we, wm, din, dout );
711
712input nclk;
713input [6:0] adr;
714input we;
715input [143:0] wm;
716input [143:0] din;
717output [143:0] dout;
718
719`ifdef AXIS
720wire a_nclk = nclk;
721wire [ 6:0] a_adr = adr;
722wire a_we = we;
723wire [143:0] a_wm = wm;
724wire [143:0] a_din = din;
725wire [143:0] a_dout;
726
727assign dout[143:0] = a_dout;
728
729axis_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
742reg [143:0] DC [127:0];
743
744assign dout[143:0] = DC[adr];
745
746wire [143:0] dc_in = (~wm[143:0] & dout) | (wm[143:0] & din);
747
748always @(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);
751end
752
753`endif
754
755endmodule
756
757
758module l1_tag (nclk, adr, we, wm, din, dout );
759
760input nclk;
761input [6:0] adr;
762input we;
763input [131:0] wm;
764input [131:0] din;
765output [131:0] dout;
766
767wire [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
772wire a_nclk = nclk;
773wire [ 6:0] a_adr = adr;
774wire a_we = we;
775wire [131:0] a_wm = wm;
776wire [131:0] a_din = din;
777wire [131:0] a_dout;
778wire [131:0] b_dout;
779
780assign dout[131:0] = a_dout;
781
782axis_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
793wire [131:0] snoop_out = b_dout;
794
795`else
796
797reg [131:0] TG [127:0];
798
799assign dout[131:0] = TG[adr];
800
801wire [131:0] tg_in = (~wm[131:0] & dout) | (wm[131:0] & din);
802
803always @(posedge nclk) begin // Clock was inverted
804 if (we) TG[adr] <= tg_in;
805end
806
807wire [131:0] snoop_out = TG[snoop_adr];
808
809`endif
810
811wire [3:0] snoop_err_dc;
812
813assign 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]);
815assign 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]);
817assign 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]);
819assign 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
822wire [3:0] snoop_err_ic;
823
824assign 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]);
826assign 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]);
828assign 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]);
830assign 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
833endmodule
834
835
836module rf32x108 ( rclk, radr, wadr, ren, we, wm, din, dout );
837
838input rclk;
839input [4:0] radr;
840input [4:0] wadr;
841input ren;
842input we;
843input [107:0] wm;
844input [107:0] din;
845output [107:0] dout;
846
847`ifdef AXIS
848wire a_rclk = rclk;
849wire [ 4:0] a_radr = radr;
850wire [ 4:0] a_wadr = wadr;
851wire a_ren = ren;
852wire a_we = we;
853wire [107:0] a_wm = wm;
854wire [107:0] a_din = din;
855wire [107:0] a_dout;
856
857assign dout[107:0] = a_dout;
858
859axis_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
872reg [107:0] REGF32X108 [31:0];
873reg [107:0] LAST;
874
875integer j;
876initial
877begin
878 for(j=0 ; j<=31; j=j+1) begin
879 REGF32X108 [j] = 108'b0;
880 end
881 LAST = 0;
882end // of initial
883
884
885assign dout[107:0] = ren ? REGF32X108[radr] : LAST;
886
887wire [107:0] rf_in = (~wm[107:0] & REGF32X108[wadr]) | (wm[107:0] & din);
888
889always @(posedge rclk) begin
890 if (we) REGF32X108[wadr] <= rf_in;
891 LAST <= dout;
892end
893
894`endif
895
896endmodule
897
898module rf128x78 ( rclk, radr, wadr, ren, we, wm, din, dout );
899
900input rclk;
901input [6:0] radr;
902input [6:0] wadr;
903input ren;
904input we;
905input [77:0] wm;
906input [77:0] din;
907output [77:0] dout;
908
909`ifdef AXIS
910wire a_rclk = rclk;
911wire [ 6:0] a_radr = radr;
912wire [ 6:0] a_wadr = wadr;
913wire a_ren = ren;
914wire a_we = we;
915wire [ 77:0] a_wm = wm;
916wire [ 77:0] a_din = din;
917wire [ 77:0] a_dout;
918
919assign dout[ 77:0] = a_dout;
920
921axis_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
934reg [ 77:0] REGF128X78 [127:0];
935reg [ 77:0] LAST;
936
937integer j;
938initial
939begin
940 for(j=0 ; j<=127; j=j+1) begin
941 REGF128X78 [j] = 78'b0;
942 end
943 LAST = 0;
944end // of initial
945
946
947assign dout[ 77:0] = ren ? REGF128X78[radr] : LAST;
948
949wire [ 77:0] rf_in = (~wm[ 77:0] & REGF128X78[wadr]) | (wm[ 77:0] & din);
950
951always @(posedge rclk) begin
952 if (we) REGF128X78[wadr] <= rf_in;
953 LAST <= dout;
954end
955
956`endif
957
958endmodule
959
960
961module rf16x128 ( rclk, radr, wadr, ren, we, wm, din, dout );
962
963input rclk;
964input [3:0] radr;
965input [3:0] wadr;
966input ren;
967input we;
968input [127:0] wm;
969input [127:0] din;
970output [127:0] dout;
971
972`ifdef AXIS
973wire a_rclk = rclk;
974wire [ 3:0] a_radr = radr;
975wire [ 3:0] a_wadr = wadr;
976wire a_ren = ren;
977wire a_we = we;
978wire [127:0] a_wm = wm;
979wire [127:0] a_din = din;
980wire [127:0] a_dout;
981
982/*************
983reg [127:0] LAST;
984
985always @(posedge rclk) begin
986 LAST <= a_ren ? a_dout : LAST;
987end
988
989assign dout[127:0] = LAST;
990**************/
991assign dout[127:0] = a_dout;
992
993axis_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
1006reg [127:0] REGF16X128 [15:0];
1007//reg [127:0] LAST;
1008
1009integer j;
1010initial
1011begin
1012 for(j=0 ; j<=15; j=j+1) begin
1013 REGF16X128[j] = 128'b0;
1014 end
1015end // of initial
1016
1017
1018//assign dout[127:0] = LAST;
1019 assign dout[127:0] = REGF16X128[radr];
1020
1021wire [127:0] rf_in = (~wm[127:0] & REGF16X128[wadr]) | (wm[127:0] & din);
1022
1023always @(posedge rclk) begin
1024 if (we) REGF16X128[wadr] <= rf_in;
1025//LAST <= ren ? REGF16X128[radr] : LAST;
1026end
1027
1028`endif
1029
1030endmodule
1031
1032
1033
1034
1035module rf32x80 ( rclk, radr, wadr, ren, we, wm, din, dout );
1036
1037input rclk;
1038input [4:0] radr;
1039input [4:0] wadr;
1040input ren;
1041input we;
1042input [ 79:0] wm;
1043input [ 79:0] din;
1044output [ 79:0] dout;
1045
1046`ifdef AXIS
1047wire a_rclk = rclk;
1048wire [ 4:0] a_radr = radr;
1049wire [ 4:0] a_wadr = wadr;
1050wire a_ren = ren;
1051wire a_we = we;
1052wire [ 79:0] a_wm = wm;
1053wire [ 79:0] a_din = din;
1054wire [ 79:0] a_dout;
1055
1056reg [ 79:0] LAST;
1057
1058always @(posedge rclk) begin
1059 LAST <= a_ren ? a_dout : LAST;
1060end
1061
1062assign dout[ 79:0] = LAST;
1063
1064axis_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
1077reg [ 79:0] REGF32X80 [31:0];
1078reg [ 79:0] LAST;
1079
1080integer j;
1081initial
1082begin
1083 for(j=0 ; j<=31; j=j+1) begin
1084 REGF32X80 [j] = 80'b0;
1085 end
1086 LAST = 0;
1087end // of initial
1088
1089
1090assign dout[ 79:0] = LAST;
1091
1092wire [ 79:0] rf_in = (~wm[ 79:0] & REGF32X80[wadr]) | (wm[ 79:0] & din);
1093
1094always @(posedge rclk) begin
1095 if (we) REGF32X80[wadr] <= rf_in;
1096 LAST <= ren ? REGF32X80[radr] : LAST;
1097end
1098
1099`endif
1100
1101endmodule
1102
1103module rf32x152 ( rclk, radr, wadr, ren, we, wm, din, dout );
1104
1105input rclk;
1106input [4:0] radr;
1107input [4:0] wadr;
1108input ren;
1109input we;
1110input [151:0] wm;
1111input [151:0] din;
1112output [151:0] dout;
1113
1114`ifdef AXIS
1115wire a_rclk = rclk;
1116wire [ 4:0] a_radr = radr;
1117wire [ 4:0] a_wadr = wadr;
1118wire a_ren = ren;
1119wire a_we = we;
1120wire [151:0] a_wm = wm;
1121wire [151:0] a_din = din;
1122wire [151:0] a_dout;
1123
1124reg [151:0] LAST;
1125
1126always @(posedge rclk) begin
1127 LAST <= a_ren ? a_dout : LAST;
1128end
1129
1130assign dout[151:0] = LAST;
1131
1132axis_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
1145reg [151:0] REGF32X152 [31:0];
1146reg [151:0] LAST;
1147
1148integer j;
1149initial
1150begin
1151 for(j=0 ; j<=31; j=j+1) begin
1152 REGF32X152 [j] = 152'b0;
1153 end
1154 LAST = 0;
1155end // of initial
1156
1157
1158assign dout[151:0] = LAST;
1159
1160wire [151:0] rf_in = (~wm[151:0] & REGF32X152[wadr]) | (wm[151:0] & din);
1161
1162always @(posedge rclk) begin
1163 if (we) REGF32X152[wadr] <= rf_in;
1164 LAST <= ren ? REGF32X152[radr] : LAST;
1165end
1166
1167`endif
1168
1169endmodule
1170
1171
1172
1173
1174module rf16x160 ( rdclk, wrclk, radr, wadr, ren, we, wm, din, dout );
1175
1176input rdclk;
1177input wrclk;
1178input [3:0] radr;
1179input [3:0] wadr;
1180input ren;
1181input we;
1182input [159:0] wm;
1183input [159:0] din;
1184output [159:0] dout;
1185
1186`ifdef AXIS
1187wire a_rdclk = rdclk;
1188wire a_wrclk = wrclk;
1189wire [ 3:0] a_radr = radr;
1190wire [ 3:0] a_wadr = wadr;
1191wire a_ren = ren;
1192wire a_we = we;
1193wire [159:0] a_wm = wm;
1194wire [159:0] a_din = din;
1195wire [159:0] a_dout;
1196
1197assign dout[159:0] = a_dout;
1198
1199axis_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
1212reg [159:0] REGF16X160 [15:0];
1213reg [159:0] LAST;
1214
1215integer j;
1216initial
1217begin
1218 for(j=0 ; j<=15; j=j+1) begin
1219 REGF16X160 [j] = 160'b0;
1220 end
1221 LAST = 0;
1222end // of initial
1223
1224
1225assign dout[159:0] = ren ? REGF16X160[radr] : LAST;
1226
1227wire [159:0] rf_in = (~wm[159:0] & REGF16X160[wadr]) | (wm[159:0] & din);
1228
1229always @(posedge wrclk) begin
1230 if (we) REGF16X160[wadr] <= rf_in;
1231end
1232
1233always @(posedge rdclk) begin
1234 LAST <= dout;
1235end
1236
1237`endif
1238
1239endmodule
1240
1241
1242
1243module rf16x65 ( rdclk, wrclk, radr, wadr, ren, we, wm, din, dout );
1244
1245input rdclk;
1246input wrclk;
1247input [3:0] radr;
1248input [3:0] wadr;
1249input ren;
1250input we;
1251input [64:0] wm;
1252input [64:0] din;
1253output [64:0] dout;
1254
1255`ifdef AXIS
1256wire a_rdclk = rdclk;
1257wire a_wrclk = wrclk;
1258wire [ 3:0] a_radr = radr;
1259wire [ 3:0] a_wadr = wadr;
1260wire a_ren = ren;
1261wire a_we = we;
1262wire [ 64:0] a_wm = wm;
1263wire [ 64:0] a_din = din;
1264wire [ 64:0] a_dout;
1265
1266//assign dout[ 64:0] = a_dout;
1267assign dout[ 64:0] = ren ? a_dout : 65'h1FFFFFFFFFFFFFFFF;
1268
1269axis_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
1282reg [ 64:0] REGF16X65 [15:0];
1283reg [ 64:0] LAST;
1284
1285integer j;
1286initial
1287begin
1288 for(j=0 ; j<=15; j=j+1) begin
1289 REGF16X65 [j] = 64'b0;
1290 end
1291 LAST = 0;
1292end // of initial
1293
1294
1295assign dout[ 64:0] = ren ? REGF16X65 [radr] : LAST;
1296
1297wire [ 64:0] rf_in = (~wm[ 64:0] & REGF16X65 [wadr]) | (wm[ 64:0] & din);
1298
1299always @(posedge wrclk) begin
1300 if (we) REGF16X65 [wadr] <= rf_in;
1301end
1302
1303always @(posedge rdclk) begin
1304 //LAST <= dout;
1305 LAST <= 65'h1FFFFFFFFFFFFFFFF;
1306end
1307
1308`endif
1309
1310endmodule
1311
1312module 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
1331assign data0[208:0] = a_data0;
1332assign data1[208:0] = a_data1;
1333
1334axis_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
1347reg /*sparse */ [208:0] DBUFF [20'hFFFFF:0];
1348
1349integer j;
1350initial
1351begin
1352 for(j=0 ; j<=1048575; j=j+1) begin
1353 DBUFF [j] = ~(209'h0);
1354 end
1355end // of initial
1356assign data0[208:0] = DBUFF[adr0];
1357assign data1[208:0] = DBUFF[adr1];
1358
1359`endif
1360
1361endmodule
1362
1363
1364module rf2x32 ( rclk, radr, wadr, ren, we, wm, din, dout );
1365
1366input rclk;
1367input radr;
1368input wadr;
1369input ren;
1370input we;
1371input [ 31:0] wm;
1372input [ 31:0] din;
1373output [ 31:0] dout;
1374
1375`ifdef PALLADIUM
1376
1377reg [ 31:0] REGF2X32 [ 1:0];
1378reg [ 31:0] LAST;
1379
1380integer j;
1381initial
1382begin
1383 for(j=0 ; j<=1 ; j=j+1) begin
1384 REGF2X32 [j] = 32'b0;
1385 end
1386 LAST = 0;
1387end // of initial
1388
1389
1390assign dout[ 31:0] = LAST;
1391
1392wire [ 31:0] rf_in = (~wm[ 31:0] & REGF2X32[wadr]) | (wm[ 31:0] & din);
1393
1394always @(posedge rclk) begin
1395 if (we) REGF2X32[wadr] <= rf_in;
1396 LAST <= ren ? REGF2X32[radr] : LAST;
1397end
1398
1399`else
1400
1401`ifdef AXIS
1402wire a_rclk = rclk;
1403wire [2:0] a_radr = {2'b0, radr}; // AXIS memory must have more than 4 entries
1404wire [2:0] a_wadr = {2'b0, wadr};
1405wire a_ren = ren;
1406wire a_we = we;
1407wire [ 31:0] a_wm = wm;
1408wire [ 31:0] a_din = din;
1409wire [ 31:0] a_dout;
1410
1411reg [ 31:0] LAST;
1412
1413always @(posedge rclk) begin
1414 LAST <= a_ren ? a_dout : LAST;
1415end
1416
1417assign dout[ 31:0] = LAST;
1418
1419axis_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
1432reg [ 31:0] REGF2X32 [ 1:0];
1433reg [ 31:0] LAST;
1434
1435integer j;
1436initial
1437begin
1438 for(j=0 ; j<=1 ; j=j+1) begin
1439 REGF2X32 [j] = 32'b0;
1440 end
1441 LAST = 0;
1442end // of initial
1443
1444
1445assign dout[ 31:0] = LAST;
1446
1447wire [ 31:0] rf_in = (~wm[ 31:0] & REGF2X32[wadr]) | (wm[ 31:0] & din);
1448
1449always @(posedge rclk) begin
1450 if (we) REGF2X32[wadr] <= rf_in;
1451 LAST <= ren ? REGF2X32[radr] : LAST;
1452end
1453
1454`endif //AXIS
1455`endif // !`ifdef PALLADIUM
1456
1457endmodule
1458
1459