Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: n2_l2d_16kb_cust.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 | module n2_l2d_16kb_cust ( | |
36 | waysel_c4, | |
37 | waysel_err_c3, | |
38 | set_c3b, | |
39 | coloff_c3b_l, | |
40 | coloff_c4_l, | |
41 | coloff_c5, | |
42 | wen_c3b, | |
43 | readen_c5, | |
44 | worden_c3b, | |
45 | l1clk, | |
46 | wrd_lo0_b_l, | |
47 | wrd_lo1_b_l, | |
48 | wrd_hi0_b_l, | |
49 | wrd_hi1_b_l, | |
50 | red_adr, | |
51 | cred, | |
52 | tstmodclk_l, | |
53 | wee_l, | |
54 | vnw_ary, | |
55 | saout_lo0_bc_l, | |
56 | saout_lo1_bc_l, | |
57 | saout_hi0_bc_l, | |
58 | saout_hi1_bc_l); | |
59 | wire coloff_c3b_l_unused; | |
60 | wire bank_select; | |
61 | wire coloff_c4; | |
62 | wire [7:0] set_c4; | |
63 | wire [1:0] spare_word_enable; | |
64 | wire select_red_odd; | |
65 | wire select_red_even; | |
66 | ||
67 | ||
68 | ||
69 | input [7:0] waysel_c4; | |
70 | input waysel_err_c3; // Active when multiple way sel is on | |
71 | input [8:0] set_c3b; // After b-latch | |
72 | input coloff_c3b_l; // After b-latch+inv | |
73 | input coloff_c4_l; // stage+inv | |
74 | input [1:0] coloff_c5; // 2-stage | |
75 | input wen_c3b; // Write-enable, after b-latch | |
76 | input readen_c5; // | |
77 | input [3:0] worden_c3b; // After b-latch | |
78 | input l1clk; // After l1clk hdr | |
79 | input [19:0] wrd_lo0_b_l; // | |
80 | input [18:0] wrd_lo1_b_l; // | |
81 | input [19:0] wrd_hi0_b_l; // | |
82 | input [18:0] wrd_hi1_b_l; // | |
83 | input [9:0] red_adr; // Redudancy address | |
84 | input [77:0] cred; // Redudancy address | |
85 | input tstmodclk_l; //NEW | |
86 | input wee_l; //NEW | |
87 | input vnw_ary; //NEW | |
88 | ||
89 | //output bnken_lat; // Address latch enable (1.5cycle) | |
90 | output [19:0] saout_lo0_bc_l; // C5bc output from senseamp | |
91 | output [18:0] saout_lo1_bc_l; // C5bc output from senseamp | |
92 | output [19:0] saout_hi0_bc_l; // C5bc output from senseamp | |
93 | output [18:0] saout_hi1_bc_l; // C5bc output from senseamp | |
94 | ||
95 | //reg rd_data_out_sel_c5b; | |
96 | //reg select_read_data_c5b; | |
97 | reg select_read_data_c5b_hi_rgt; | |
98 | reg select_read_data_c5b_hi_lft; | |
99 | reg select_read_data_c5b_lo_rgt; | |
100 | reg select_read_data_c5b_lo_lft; | |
101 | reg select_read_data_all_c5b; | |
102 | reg select_read_red_all_c5b; | |
103 | ||
104 | //reg select_read_red_c5b; | |
105 | reg select_read_red_c5b_hi_rgt; | |
106 | reg select_read_red_c5b_hi_lft; | |
107 | reg select_read_red_c5b_lo_rgt; | |
108 | reg select_read_red_c5b_lo_lft; | |
109 | ||
110 | //reg bnken_lat; | |
111 | ||
112 | reg [19:0] saout_lo0_bc_l; // C5bc output from senseamp | |
113 | reg [18:0] saout_lo1_bc_l; // C5bc output from senseamp | |
114 | reg [19:0] saout_hi0_bc_l; // C5bc output from senseamp | |
115 | reg [18:0] saout_hi1_bc_l; // C5bc output from senseamp | |
116 | ||
117 | reg [79:0] read_data; | |
118 | wire [79:0] rd_data; | |
119 | wire [79:0] wr_data; | |
120 | reg rd_spare_0,rd_spare_1; | |
121 | wire wr_spare_0,wr_spare_1; | |
122 | ||
123 | wire [19:0] saout_hi0_b_out_l, saout_lo0_b_out_l; | |
124 | wire [18:0] saout_hi1_b_out_l, saout_lo1_b_out_l; | |
125 | wire [19:0] red_lo0_b_out_l; | |
126 | wire [18:0] red_lo1_b_out_l; | |
127 | wire [19:0] red_hi0_b_out_l; | |
128 | wire [18:0] red_hi1_b_out_l; | |
129 | ||
130 | wire [1:0] coloff_c5_rgt; | |
131 | wire [1:0] coloff_c5_lft; | |
132 | wire red_sel_rgt; | |
133 | wire red_sel_lft; | |
134 | ||
135 | ||
136 | ||
137 | ||
138 | reg [19:0] mem_lo0_way0 [255:0]; | |
139 | reg [18:0] mem_lo1_way0 [255:0]; | |
140 | reg [19:0] mem_hi0_way0 [255:0]; | |
141 | reg [18:0] mem_hi1_way0 [255:0]; | |
142 | reg [255:0] mem_way0_spare_0; | |
143 | reg [255:0] mem_way0_spare_1; | |
144 | ||
145 | reg [19:0] mem_lo0_way1 [255:0]; | |
146 | reg [18:0] mem_lo1_way1 [255:0]; | |
147 | reg [19:0] mem_hi0_way1 [255:0]; | |
148 | reg [18:0] mem_hi1_way1 [255:0]; | |
149 | reg [255:0] mem_way1_spare_0; | |
150 | reg [255:0] mem_way1_spare_1; | |
151 | ||
152 | reg [19:0] mem_lo0_way2 [255:0]; | |
153 | reg [18:0] mem_lo1_way2 [255:0]; | |
154 | reg [19:0] mem_hi0_way2 [255:0]; | |
155 | reg [18:0] mem_hi1_way2 [255:0]; | |
156 | reg [255:0] mem_way2_spare_0; | |
157 | reg [255:0] mem_way2_spare_1; | |
158 | ||
159 | ||
160 | reg [19:0] mem_lo0_way3 [255:0]; | |
161 | reg [18:0] mem_lo1_way3 [255:0]; | |
162 | reg [19:0] mem_hi0_way3 [255:0]; | |
163 | reg [18:0] mem_hi1_way3 [255:0]; | |
164 | reg [255:0] mem_way3_spare_0; | |
165 | reg [255:0] mem_way3_spare_1; | |
166 | ||
167 | ||
168 | reg [19:0] mem_lo0_way4 [255:0]; | |
169 | reg [18:0] mem_lo1_way4 [255:0]; | |
170 | reg [19:0] mem_hi0_way4 [255:0]; | |
171 | reg [18:0] mem_hi1_way4 [255:0]; | |
172 | reg [255:0] mem_way4_spare_0; | |
173 | reg [255:0] mem_way4_spare_1; | |
174 | ||
175 | ||
176 | reg [19:0] mem_lo0_way5 [255:0]; | |
177 | reg [18:0] mem_lo1_way5 [255:0]; | |
178 | reg [19:0] mem_hi0_way5 [255:0]; | |
179 | reg [18:0] mem_hi1_way5 [255:0]; | |
180 | reg [255:0] mem_way5_spare_0; | |
181 | reg [255:0] mem_way5_spare_1; | |
182 | ||
183 | ||
184 | reg [19:0] mem_lo0_way6 [255:0]; | |
185 | reg [18:0] mem_lo1_way6 [255:0]; | |
186 | reg [19:0] mem_hi0_way6 [255:0]; | |
187 | reg [18:0] mem_hi1_way6 [255:0]; | |
188 | reg [255:0] mem_way6_spare_0; | |
189 | reg [255:0] mem_way6_spare_1; | |
190 | ||
191 | ||
192 | reg [19:0] mem_lo0_way7 [255:0]; | |
193 | reg [18:0] mem_lo1_way7 [255:0]; | |
194 | reg [19:0] mem_hi0_way7 [255:0]; | |
195 | reg [18:0] mem_hi1_way7 [255:0]; | |
196 | reg [255:0] mem_way7_spare_0; | |
197 | reg [255:0] mem_way7_spare_1; | |
198 | ||
199 | //reg bnken_lat_c52; | |
200 | reg [19:0] saout_lo0_bc; // C5bc output from senseamp | |
201 | reg [18:0] saout_lo1_bc; // C5bc output from senseamp | |
202 | reg [19:0] saout_hi0_bc; // C5bc output from senseamp | |
203 | reg [18:0] saout_hi1_bc; // C5bc output from senseamp | |
204 | ||
205 | ||
206 | //reg [19:0] saout_lo0_bc_d; // C5bc output from senseamp | |
207 | //reg [18:0] saout_lo1_bc_d; // C5bc output from senseamp | |
208 | //reg [19:0] saout_hi0_bc_d; // C5bc output from senseamp | |
209 | //reg [18:0] saout_hi1_bc_d; // C5bc output from senseamp | |
210 | ||
211 | //reg set_banken_lat, reset_banken_lat; | |
212 | ||
213 | reg [19:0] saout_lo0_bc_c5b_l; | |
214 | reg [18:0] saout_lo1_bc_c5b_l; | |
215 | reg [19:0] saout_hi0_bc_c5b_l; | |
216 | reg [18:0] saout_hi1_bc_c5b_l; | |
217 | ||
218 | reg [19:0] saout_lo0_bc_d_l; | |
219 | reg [18:0] saout_lo1_bc_d_l; | |
220 | reg [19:0] saout_hi0_bc_d_l; | |
221 | reg [18:0] saout_hi1_bc_d_l; | |
222 | ||
223 | ||
224 | assign coloff_c3b_l_unused = coloff_c3b_l; | |
225 | ||
226 | ||
227 | //always@(posedge l1clk) | |
228 | //begin | |
229 | // if(~coloff_c3b_l) | |
230 | // set_banken_lat <= 1'b1; | |
231 | // else set_banken_lat <= 1'b0; | |
232 | //end | |
233 | // | |
234 | //always@(negedge l1clk) | |
235 | //begin | |
236 | // if(coloff_c4_l) | |
237 | // reset_banken_lat <= 1'b1; | |
238 | // else reset_banken_lat <= 1'b0; | |
239 | //end | |
240 | // | |
241 | //always@(set_banken_lat or reset_banken_lat) | |
242 | //begin | |
243 | // if(set_banken_lat ) | |
244 | // bnken_lat <= 1'b1; | |
245 | // else if(reset_banken_lat ) | |
246 | // bnken_lat <= 1'b0; | |
247 | //end | |
248 | ||
249 | ||
250 | reg [7:0] waysel_c5; | |
251 | reg [8:0] index_c4; | |
252 | reg [8:0] set_c5; | |
253 | reg wen_c4; | |
254 | reg [3:0] worden_c4; | |
255 | ||
256 | ||
257 | ||
258 | reg bank_select_c5; | |
259 | reg waysel_err_c3b, waysel_err_c4,waysel_err_c5; | |
260 | ||
261 | always@(l1clk or coloff_c4_l) | |
262 | begin | |
263 | if(~l1clk & coloff_c4_l) | |
264 | waysel_err_c3b <= waysel_err_c3; | |
265 | end | |
266 | ||
267 | ||
268 | ||
269 | ||
270 | ||
271 | always@(posedge l1clk) | |
272 | begin | |
273 | waysel_err_c4 <= waysel_err_c3b; | |
274 | waysel_err_c5 <= waysel_err_c4; | |
275 | waysel_c5[7:0] <= waysel_c4[7:0]; | |
276 | index_c4[8:0] <= set_c3b[8:0]; | |
277 | set_c5[8:0] <= index_c4[8:0]; | |
278 | worden_c4[3:0] <= worden_c3b[3:0]; | |
279 | wen_c4 <= wen_c3b; | |
280 | bank_select_c5 <= bank_select; | |
281 | end | |
282 | ||
283 | ||
284 | assign coloff_c4 = ~coloff_c4_l; | |
285 | assign bank_select = index_c4[8]; | |
286 | ||
287 | //reg [19:0] saout_lo0_bc_c5b; | |
288 | //reg [18:0] saout_lo1_bc_c5b; | |
289 | //reg [19:0] saout_hi0_bc_c5b; | |
290 | //reg [18:0] saout_hi1_bc_c5b; | |
291 | ||
292 | ||
293 | ||
294 | ||
295 | ||
296 | ||
297 | assign set_c4[7:0] = index_c4[7:0]; | |
298 | wire [19:0] wrd_lo0_a; | |
299 | wire [19:0] wrd_hi0_a; | |
300 | wire [18:0] wrd_lo1_a; | |
301 | wire [18:0] wrd_hi1_a; | |
302 | ||
303 | reg [19:0] wrd_lo0_a_reg; | |
304 | reg [19:0] wrd_hi0_a_reg; | |
305 | reg [18:0] wrd_lo1_a_reg; | |
306 | reg [18:0] wrd_hi1_a_reg; | |
307 | ||
308 | ||
309 | always@(posedge l1clk) | |
310 | begin | |
311 | wrd_lo0_a_reg[19:0] <= ~wrd_lo0_b_l[19:0]; | |
312 | wrd_hi0_a_reg[19:0] <= ~wrd_hi0_b_l[19:0]; | |
313 | wrd_lo1_a_reg[18:0] <= ~wrd_lo1_b_l[18:0]; | |
314 | wrd_hi1_a_reg[18:0] <= ~wrd_hi1_b_l[18:0]; | |
315 | end | |
316 | ||
317 | ||
318 | ||
319 | // COL redudancy | |
320 | ||
321 | //reg [255:0] red_reg1; | |
322 | //reg [255:0] red_reg2; | |
323 | ||
324 | wire [79:0] cred_mod; | |
325 | ||
326 | ||
327 | assign cred_mod[79:0] = {cred[77:59],1'b0,cred[58:19],1'b0,cred[18:0]}; | |
328 | ||
329 | ||
330 | //assign spare_word_enable[1] = cred_mod[19] ? worden_c4[3] : worden_c4[2]; | |
331 | //assign spare_word_enable[0] = cred_mod[59] ? worden_c4[3] : worden_c4[2]; | |
332 | ||
333 | ||
334 | assign wr_data[19:0] = | |
335 | {wr_spare_0, wrd_lo1_a_reg[4], wrd_hi0_a_reg[4],wrd_lo0_a_reg[4], | |
336 | wrd_hi1_a_reg[3], wrd_lo1_a_reg[3], wrd_hi0_a_reg[3],wrd_lo0_a_reg[3], | |
337 | wrd_hi1_a_reg[2], wrd_lo1_a_reg[2], wrd_hi0_a_reg[2],wrd_lo0_a_reg[2], | |
338 | wrd_hi1_a_reg[1], wrd_lo1_a_reg[1], wrd_hi0_a_reg[1],wrd_lo0_a_reg[1], | |
339 | wrd_hi1_a_reg[0], wrd_lo1_a_reg[0], wrd_hi0_a_reg[0],wrd_lo0_a_reg[0]}; | |
340 | ||
341 | assign wr_data[39:20] = { | |
342 | wrd_lo1_a_reg[9], wrd_hi0_a_reg[9],wrd_lo0_a_reg[9], | |
343 | wrd_hi1_a_reg[8], wrd_lo1_a_reg[8], wrd_hi0_a_reg[8],wrd_lo0_a_reg[8], | |
344 | wrd_hi1_a_reg[7], wrd_lo1_a_reg[7], wrd_hi0_a_reg[7],wrd_lo0_a_reg[7], | |
345 | wrd_hi1_a_reg[6], wrd_lo1_a_reg[6], wrd_hi0_a_reg[6],wrd_lo0_a_reg[6], | |
346 | wrd_hi1_a_reg[5], wrd_lo1_a_reg[5], wrd_hi0_a_reg[5],wrd_lo0_a_reg[5], wrd_hi1_a_reg[4]}; | |
347 | ||
348 | ||
349 | assign wr_data[59:40] = { | |
350 | wrd_lo1_a_reg[14], wrd_hi0_a_reg[14],wrd_lo0_a_reg[14], | |
351 | wrd_hi1_a_reg[13], wrd_lo1_a_reg[13], wrd_hi0_a_reg[13],wrd_lo0_a_reg[13], | |
352 | wrd_hi1_a_reg[12], wrd_lo1_a_reg[12], wrd_hi0_a_reg[12],wrd_lo0_a_reg[12], | |
353 | wrd_hi1_a_reg[11], wrd_lo1_a_reg[11], wrd_hi0_a_reg[11],wrd_lo0_a_reg[11], | |
354 | wrd_hi1_a_reg[10], wrd_lo1_a_reg[10], wrd_hi0_a_reg[10],wrd_lo0_a_reg[10], wrd_hi1_a_reg[9]}; | |
355 | ||
356 | assign wr_data[79:60] = { | |
357 | wrd_hi0_a_reg[19], wrd_lo0_a_reg[19], | |
358 | wrd_hi1_a_reg[18], wrd_lo1_a_reg[18], wrd_hi0_a_reg[18],wrd_lo0_a_reg[18], | |
359 | wrd_hi1_a_reg[17], wrd_lo1_a_reg[17], wrd_hi0_a_reg[17],wrd_lo0_a_reg[17], | |
360 | wrd_hi1_a_reg[16], wrd_lo1_a_reg[16], wrd_hi0_a_reg[16],wrd_lo0_a_reg[16], | |
361 | wrd_hi1_a_reg[15], wrd_lo1_a_reg[15], wrd_hi0_a_reg[15],wrd_lo0_a_reg[15], wrd_hi1_a_reg[14],wr_spare_1}; | |
362 | ||
363 | ||
364 | integer i; | |
365 | reg [80:0] data; | |
366 | ||
367 | always@(cred_mod or wr_data) | |
368 | begin | |
369 | if (~cred_mod[0]) begin | |
370 | data[0] = wr_data[0]; | |
371 | end | |
372 | ||
373 | for(i=0; i<18; i=i+1) | |
374 | begin | |
375 | data[i+1] = cred_mod[i] ? wr_data[i] : wr_data[i+1]; | |
376 | end | |
377 | ||
378 | data[19] = cred_mod[18] ? wr_data[18] : cred_mod[20] ? wr_data[20] : 1'b0; | |
379 | ||
380 | for(i=21;i<40;i=i+1) | |
381 | begin | |
382 | data[i-1] = cred_mod[i] ? wr_data[i] : wr_data[i-1]; | |
383 | end | |
384 | ||
385 | ||
386 | if (~cred_mod[39]) begin | |
387 | data[39] = wr_data[39]; | |
388 | end | |
389 | ||
390 | if (~cred_mod[40]) begin | |
391 | data[40] = wr_data[40]; | |
392 | end | |
393 | ||
394 | for(i=40;i<59;i=i+1) | |
395 | begin | |
396 | data[i+1] = cred_mod[i] ? wr_data[i] : wr_data[i+1]; | |
397 | end | |
398 | ||
399 | data[60] = cred_mod[59] ? wr_data[59] : cred_mod[61] ? wr_data[61] : 1'b0; | |
400 | ||
401 | for(i=62;i<80;i=i+1) | |
402 | begin | |
403 | data[i-1] = cred_mod[i] ? wr_data[i] : wr_data[i-1]; | |
404 | end | |
405 | ||
406 | if (~cred_mod[79]) begin | |
407 | data[79] = wr_data[79]; | |
408 | end | |
409 | ||
410 | end | |
411 | ||
412 | ||
413 | assign { wrd_hi0_a[19], wrd_lo0_a[19], | |
414 | wrd_hi1_a[18], wrd_lo1_a[18], wrd_hi0_a[18],wrd_lo0_a[18], | |
415 | wrd_hi1_a[17], wrd_lo1_a[17], wrd_hi0_a[17],wrd_lo0_a[17], | |
416 | wrd_hi1_a[16], wrd_lo1_a[16], wrd_hi0_a[16],wrd_lo0_a[16], | |
417 | wrd_hi1_a[15], wrd_lo1_a[15], wrd_hi0_a[15],wrd_lo0_a[15], | |
418 | wrd_hi1_a[14],wr_spare_1} = data[79:60]; | |
419 | ||
420 | assign { | |
421 | wrd_lo1_a[14], wrd_hi0_a[14],wrd_lo0_a[14], | |
422 | wrd_hi1_a[13], wrd_lo1_a[13], wrd_hi0_a[13],wrd_lo0_a[13], | |
423 | wrd_hi1_a[12], wrd_lo1_a[12], wrd_hi0_a[12],wrd_lo0_a[12], | |
424 | wrd_hi1_a[11], wrd_lo1_a[11], wrd_hi0_a[11],wrd_lo0_a[11], | |
425 | wrd_hi1_a[10], wrd_lo1_a[10], wrd_hi0_a[10],wrd_lo0_a[10],wrd_hi1_a[9]} = data[59:40]; | |
426 | ||
427 | assign { | |
428 | wrd_lo1_a[9], wrd_hi0_a[9],wrd_lo0_a[9], | |
429 | wrd_hi1_a[8], wrd_lo1_a[8], wrd_hi0_a[8],wrd_lo0_a[8], | |
430 | wrd_hi1_a[7], wrd_lo1_a[7], wrd_hi0_a[7],wrd_lo0_a[7], | |
431 | wrd_hi1_a[6], wrd_lo1_a[6], wrd_hi0_a[6],wrd_lo0_a[6], | |
432 | wrd_hi1_a[5], wrd_lo1_a[5], wrd_hi0_a[5],wrd_lo0_a[5], wrd_hi1_a[4]} = data[39:20]; | |
433 | ||
434 | assign { | |
435 | wr_spare_0, wrd_lo1_a[4], wrd_hi0_a[4],wrd_lo0_a[4], | |
436 | wrd_hi1_a[3], wrd_lo1_a[3], wrd_hi0_a[3],wrd_lo0_a[3], | |
437 | wrd_hi1_a[2], wrd_lo1_a[2], wrd_hi0_a[2],wrd_lo0_a[2], | |
438 | wrd_hi1_a[1], wrd_lo1_a[1], wrd_hi0_a[1],wrd_lo0_a[1], | |
439 | wrd_hi1_a[0], wrd_lo1_a[0], wrd_hi0_a[0],wrd_lo0_a[0]} = data[19:0]; | |
440 | ||
441 | ||
442 | ||
443 | wire [79:0] worden_data; | |
444 | wire [19:0] worden_lo0; | |
445 | wire [19:0] worden_hi0; | |
446 | wire [18:0] worden_lo1; | |
447 | wire [18:0] worden_hi1; | |
448 | ||
449 | ||
450 | assign worden_data[19:0] = | |
451 | {spare_word_enable[0], worden_c4[2], worden_c4[1],worden_c4[0], | |
452 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
453 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
454 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
455 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0]}; | |
456 | ||
457 | assign worden_data[39:20] = { | |
458 | worden_c4[2], worden_c4[1],worden_c4[0], | |
459 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
460 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
461 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
462 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], worden_c4[3]}; | |
463 | ||
464 | ||
465 | assign worden_data[59:40] = { | |
466 | worden_c4[2], worden_c4[1],worden_c4[0], | |
467 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
468 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
469 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
470 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], worden_c4[3]}; | |
471 | ||
472 | assign worden_data[79:60] = { | |
473 | worden_c4[1],worden_c4[0], | |
474 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
475 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
476 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], | |
477 | worden_c4[3], worden_c4[2], worden_c4[1],worden_c4[0], worden_c4[3],spare_word_enable[1]}; | |
478 | ||
479 | reg [79:0] worden_shift; | |
480 | ||
481 | ||
482 | ||
483 | always@(cred_mod or worden_data or wen_c4 or coloff_c4) | |
484 | begin | |
485 | if (wen_c4 & coloff_c4) | |
486 | begin | |
487 | if (~cred_mod[0]) begin | |
488 | worden_shift[0] = worden_data[0]; | |
489 | end | |
490 | ||
491 | for(i=0; i<18; i=i+1) | |
492 | begin | |
493 | worden_shift[i+1] = cred_mod[i] ? worden_data[i] : ~cred_mod[i+1] ? worden_data[i+1] : 1'b0; | |
494 | end | |
495 | ||
496 | worden_shift[19] = cred_mod[18] ? worden_data[18] : cred_mod[20] ? worden_data[20] : 1'b0; | |
497 | ||
498 | for(i=21;i<40;i=i+1) | |
499 | begin | |
500 | worden_shift[i-1] = cred_mod[i] ? worden_data[i] : ~cred_mod[i-1] ? worden_data[i-1] : 1'b0; | |
501 | end | |
502 | ||
503 | ||
504 | if (~cred_mod[39]) begin | |
505 | worden_shift[39] = worden_data[39]; | |
506 | end | |
507 | ||
508 | if (~cred_mod[40]) begin | |
509 | worden_shift[40] = worden_data[40]; | |
510 | end | |
511 | ||
512 | for(i=40;i<59;i=i+1) | |
513 | begin | |
514 | worden_shift[i+1] = cred_mod[i] ? worden_data[i] : ~cred_mod[i+1] ? worden_data[i+1] : 1'b0; | |
515 | end | |
516 | ||
517 | worden_shift[60] = cred_mod[59] ? worden_data[59] : cred_mod[61] ? worden_data[61] : 1'b0; | |
518 | ||
519 | for(i=62;i<80;i=i+1) | |
520 | begin | |
521 | worden_shift[i-1] = cred_mod[i] ? worden_data[i] : ~cred_mod[i-1] ? worden_data[i-1] : 1'b0; | |
522 | end | |
523 | ||
524 | if (~cred_mod[79]) begin | |
525 | worden_shift[79] = worden_data[79]; | |
526 | end | |
527 | ||
528 | end | |
529 | else worden_shift[79:0] = 80'b0; | |
530 | ||
531 | end | |
532 | ||
533 | ||
534 | assign { worden_hi0[19], worden_lo0[19], | |
535 | worden_hi1[18], worden_lo1[18], worden_hi0[18],worden_lo0[18], | |
536 | worden_hi1[17], worden_lo1[17], worden_hi0[17],worden_lo0[17], | |
537 | worden_hi1[16], worden_lo1[16], worden_hi0[16],worden_lo0[16], | |
538 | worden_hi1[15], worden_lo1[15], worden_hi0[15],worden_lo0[15], | |
539 | worden_hi1[14],spare_word_enable[1]} = worden_shift[79:60]; | |
540 | ||
541 | assign { | |
542 | worden_lo1[14], worden_hi0[14],worden_lo0[14], | |
543 | worden_hi1[13], worden_lo1[13], worden_hi0[13],worden_lo0[13], | |
544 | worden_hi1[12], worden_lo1[12], worden_hi0[12],worden_lo0[12], | |
545 | worden_hi1[11], worden_lo1[11], worden_hi0[11],worden_lo0[11], | |
546 | worden_hi1[10], worden_lo1[10], worden_hi0[10],worden_lo0[10],worden_hi1[9]} = worden_shift[59:40]; | |
547 | ||
548 | assign { | |
549 | worden_lo1[9], worden_hi0[9],worden_lo0[9], | |
550 | worden_hi1[8], worden_lo1[8], worden_hi0[8],worden_lo0[8], | |
551 | worden_hi1[7], worden_lo1[7], worden_hi0[7],worden_lo0[7], | |
552 | worden_hi1[6], worden_lo1[6], worden_hi0[6],worden_lo0[6], | |
553 | worden_hi1[5], worden_lo1[5], worden_hi0[5],worden_lo0[5], worden_hi1[4]} = worden_shift[39:20]; | |
554 | ||
555 | assign { | |
556 | spare_word_enable[0], worden_lo1[4], worden_hi0[4],worden_lo0[4], | |
557 | worden_hi1[3], worden_lo1[3], worden_hi0[3],worden_lo0[3], | |
558 | worden_hi1[2], worden_lo1[2], worden_hi0[2],worden_lo0[2], | |
559 | worden_hi1[1], worden_lo1[1], worden_hi0[1],worden_lo0[1], | |
560 | worden_hi1[0], worden_lo1[0], worden_hi0[0],worden_lo0[0]} = worden_shift[19:0]; | |
561 | ||
562 | ||
563 | ||
564 | ||
565 | ||
566 | ||
567 | ||
568 | ||
569 | ||
570 | ||
571 | ||
572 | ||
573 | ||
574 | ||
575 | ||
576 | ||
577 | ||
578 | ||
579 | always@(l1clk or wen_c4 or set_c4 or waysel_c4 or waysel_err_c4 or worden_c4 or wrd_lo0_a or | |
580 | wrd_hi0_a or wrd_lo1_a or wrd_hi1_a or coloff_c4 or bank_select or wr_spare_0 or | |
581 | wr_spare_1 or wee_l or worden_hi0 or worden_lo0 or worden_lo1 or worden_hi1 or spare_word_enable | |
582 | or vnw_ary) | |
583 | begin | |
584 | ||
585 | //////////////////////////////////////////////////////////////// | |
586 | // Read all entries for a given set | |
587 | //////////////////////////////////////////////////////////////// | |
588 | ||
589 | //////////////////////////////////////////////////////////////// | |
590 | // Write data computation | |
591 | //////////////////////////////////////////////////////////////// | |
592 | ||
593 | /////////////////////////////////////////////////////////////// | |
594 | // Write to memory | |
595 | ////////////////////////////////////////////////////////////// | |
596 | ||
597 | ||
598 | ||
599 | #0 | |
600 | ||
601 | ||
602 | //if(wen_c4 & ~waysel_err_c4 & bank_select & coloff_c4 & (|worden_c4)) | |
603 | if(~l1clk & wee_l & wen_c4 & ~waysel_err_c4 & bank_select & coloff_c4 & (|worden_c4) & vnw_ary) | |
604 | begin | |
605 | if(waysel_c4[0]) | |
606 | begin | |
607 | mem_lo0_way0[set_c4] = (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way0[set_c4]); | |
608 | mem_hi0_way0[set_c4] = (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way0[set_c4]); | |
609 | mem_lo1_way0[set_c4] = (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way0[set_c4]); | |
610 | mem_hi1_way0[set_c4] = (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way0[set_c4]); | |
611 | mem_way0_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way0_spare_0[set_c4]); | |
612 | mem_way0_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way0_spare_1[set_c4]); | |
613 | end | |
614 | else if(waysel_c4[1]) | |
615 | begin | |
616 | mem_lo0_way1[set_c4] = (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way1[set_c4]); | |
617 | mem_hi0_way1[set_c4] = (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way1[set_c4]); | |
618 | mem_lo1_way1[set_c4] = (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way1[set_c4]); | |
619 | mem_hi1_way1[set_c4] = (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way1[set_c4]); | |
620 | mem_way1_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way1_spare_0[set_c4]); | |
621 | mem_way1_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way1_spare_1[set_c4]); | |
622 | end | |
623 | else if(waysel_c4[2]) | |
624 | begin | |
625 | mem_lo0_way2[set_c4] = (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way2[set_c4]); | |
626 | mem_lo1_way2[set_c4] = (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way2[set_c4]); | |
627 | mem_hi0_way2[set_c4] = (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way2[set_c4]); | |
628 | mem_hi1_way2[set_c4] = (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way2[set_c4]); | |
629 | mem_way2_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way2_spare_0[set_c4]); | |
630 | mem_way2_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way2_spare_1[set_c4]); | |
631 | end | |
632 | else if(waysel_c4[3]) | |
633 | begin | |
634 | mem_lo0_way3[set_c4] = (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way3[set_c4]); | |
635 | mem_lo1_way3[set_c4] = (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way3[set_c4]); | |
636 | mem_hi0_way3[set_c4] = (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way3[set_c4]); | |
637 | mem_hi1_way3[set_c4] = (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way3[set_c4]); | |
638 | mem_way3_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way3_spare_0[set_c4]); | |
639 | mem_way3_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way3_spare_1[set_c4]); | |
640 | end | |
641 | else if(waysel_c4[4]) | |
642 | begin | |
643 | mem_lo0_way4[set_c4] = (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way4[set_c4]); | |
644 | mem_lo1_way4[set_c4] = (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way4[set_c4]); | |
645 | mem_hi0_way4[set_c4] = (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way4[set_c4]); | |
646 | mem_hi1_way4[set_c4] = (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way4[set_c4]); | |
647 | mem_way4_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way4_spare_0[set_c4]); | |
648 | mem_way4_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way4_spare_1[set_c4]); | |
649 | end | |
650 | else if(waysel_c4[5]) | |
651 | begin | |
652 | mem_lo0_way5[set_c4] =(worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way5[set_c4]); | |
653 | mem_lo1_way5[set_c4] =(worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way5[set_c4]); | |
654 | mem_hi0_way5[set_c4] =(worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way5[set_c4]); | |
655 | mem_hi1_way5[set_c4] =(worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way5[set_c4]); | |
656 | mem_way5_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way5_spare_0[set_c4]); | |
657 | mem_way5_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way5_spare_1[set_c4]); | |
658 | end | |
659 | else if(waysel_c4[6]) | |
660 | begin | |
661 | mem_lo0_way6[set_c4] =(worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way6[set_c4]); | |
662 | mem_lo1_way6[set_c4] =(worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way6[set_c4]); | |
663 | mem_hi0_way6[set_c4] =(worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way6[set_c4]); | |
664 | mem_hi1_way6[set_c4] =(worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way6[set_c4]); | |
665 | mem_way6_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way6_spare_0[set_c4]); | |
666 | mem_way6_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way6_spare_1[set_c4]); | |
667 | end | |
668 | else if(waysel_c4[7]) | |
669 | begin | |
670 | mem_lo0_way7[set_c4] =(worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & mem_lo0_way7[set_c4]); | |
671 | mem_lo1_way7[set_c4] =(worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & mem_lo1_way7[set_c4]); | |
672 | mem_hi0_way7[set_c4] =(worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & mem_hi0_way7[set_c4]); | |
673 | mem_hi1_way7[set_c4] =(worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & mem_hi1_way7[set_c4]); | |
674 | mem_way7_spare_0[set_c4] = (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & mem_way7_spare_0[set_c4]); | |
675 | mem_way7_spare_1[set_c4] = (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & mem_way7_spare_1[set_c4]); | |
676 | end | |
677 | end | |
678 | end | |
679 | ||
680 | //always@(waysel_c4 or set_c4 or bnken_lat ) | |
681 | always@(waysel_c4 or set_c4 or coloff_c4_l or vnw_ary) | |
682 | ||
683 | begin | |
684 | ||
685 | ||
686 | #0 | |
687 | ||
688 | if(~coloff_c4_l & vnw_ary) | |
689 | begin | |
690 | if(waysel_c4[0]) | |
691 | begin | |
692 | saout_lo0_bc[19:0] <= mem_lo0_way0[set_c4]; | |
693 | saout_lo1_bc[18:0] <= mem_lo1_way0[set_c4]; | |
694 | saout_hi0_bc[19:0] <= mem_hi0_way0[set_c4]; | |
695 | saout_hi1_bc[18:0] <= mem_hi1_way0[set_c4]; | |
696 | rd_spare_0 <= mem_way0_spare_0[set_c4]; | |
697 | rd_spare_1 <= mem_way0_spare_1[set_c4]; | |
698 | end | |
699 | else if(waysel_c4[1]) | |
700 | begin | |
701 | saout_lo0_bc[19:0] <= mem_lo0_way1[set_c4]; | |
702 | saout_lo1_bc[18:0] <= mem_lo1_way1[set_c4]; | |
703 | saout_hi0_bc[19:0] <= mem_hi0_way1[set_c4]; | |
704 | saout_hi1_bc[18:0] <= mem_hi1_way1[set_c4]; | |
705 | rd_spare_0 <= mem_way1_spare_0[set_c4]; | |
706 | rd_spare_1 <= mem_way1_spare_1[set_c4]; | |
707 | end | |
708 | else if(waysel_c4[2]) | |
709 | begin | |
710 | saout_lo0_bc[19:0] <= mem_lo0_way2[set_c4]; | |
711 | saout_lo1_bc[18:0] <= mem_lo1_way2[set_c4]; | |
712 | saout_hi0_bc[19:0] <= mem_hi0_way2[set_c4]; | |
713 | saout_hi1_bc[18:0] <= mem_hi1_way2[set_c4]; | |
714 | rd_spare_0 <= mem_way2_spare_0[set_c4]; | |
715 | rd_spare_1 <= mem_way2_spare_1[set_c4]; | |
716 | end | |
717 | else if(waysel_c4[3]) | |
718 | begin | |
719 | saout_lo0_bc[19:0] <= mem_lo0_way3[set_c4]; | |
720 | saout_lo1_bc[18:0] <= mem_lo1_way3[set_c4]; | |
721 | saout_hi0_bc[19:0] <= mem_hi0_way3[set_c4]; | |
722 | saout_hi1_bc[18:0] <= mem_hi1_way3[set_c4]; | |
723 | rd_spare_0 <= mem_way3_spare_0[set_c4]; | |
724 | rd_spare_1 <= mem_way3_spare_1[set_c4]; | |
725 | end | |
726 | else if(waysel_c4[4]) | |
727 | begin | |
728 | saout_lo0_bc[19:0] <= mem_lo0_way4[set_c4]; | |
729 | saout_lo1_bc[18:0] <= mem_lo1_way4[set_c4]; | |
730 | saout_hi0_bc[19:0] <= mem_hi0_way4[set_c4]; | |
731 | saout_hi1_bc[18:0] <= mem_hi1_way4[set_c4]; | |
732 | rd_spare_0 <= mem_way4_spare_0[set_c4]; | |
733 | rd_spare_1 <= mem_way4_spare_1[set_c4]; | |
734 | end | |
735 | else if(waysel_c4[5]) | |
736 | begin | |
737 | saout_lo0_bc[19:0] <= mem_lo0_way5[set_c4]; | |
738 | saout_lo1_bc[18:0] <= mem_lo1_way5[set_c4]; | |
739 | saout_hi0_bc[19:0] <= mem_hi0_way5[set_c4]; | |
740 | saout_hi1_bc[18:0] <= mem_hi1_way5[set_c4]; | |
741 | rd_spare_0 <= mem_way5_spare_0[set_c4]; | |
742 | rd_spare_1 <= mem_way5_spare_1[set_c4]; | |
743 | end | |
744 | else if(waysel_c4[6]) | |
745 | begin | |
746 | saout_lo0_bc[19:0] <= mem_lo0_way6[set_c4]; | |
747 | saout_lo1_bc[18:0] <= mem_lo1_way6[set_c4]; | |
748 | saout_hi0_bc[19:0] <= mem_hi0_way6[set_c4]; | |
749 | saout_hi1_bc[18:0] <= mem_hi1_way6[set_c4]; | |
750 | rd_spare_0 <= mem_way6_spare_0[set_c4]; | |
751 | rd_spare_1 <= mem_way6_spare_1[set_c4]; | |
752 | end | |
753 | else if(waysel_c4[7]) | |
754 | begin | |
755 | saout_lo0_bc[19:0] <= mem_lo0_way7[set_c4]; | |
756 | saout_lo1_bc[18:0] <= mem_lo1_way7[set_c4]; | |
757 | saout_hi0_bc[19:0] <= mem_hi0_way7[set_c4]; | |
758 | saout_hi1_bc[18:0] <= mem_hi1_way7[set_c4]; | |
759 | rd_spare_0 <= mem_way7_spare_0[set_c4]; | |
760 | rd_spare_1 <= mem_way7_spare_1[set_c4]; | |
761 | end | |
762 | end | |
763 | end | |
764 | ||
765 | ||
766 | // READ | |
767 | // Data is read out of the above array in c4 and gets registered and latched | |
768 | // to become a c5b signal which gets muxed and goes to dmux | |
769 | ||
770 | ||
771 | reg rd_spare_0_d_l,rd_spare_1_d_l; | |
772 | reg rdd_spare_0,rdd_spare_1; | |
773 | reg tstmodclk_c3b_l; | |
774 | always@(posedge l1clk) | |
775 | begin | |
776 | saout_lo0_bc_d_l[19:0] <= ~saout_lo0_bc[19:0]; | |
777 | saout_lo1_bc_d_l[18:0] <= ~saout_lo1_bc[18:0]; | |
778 | saout_hi0_bc_d_l[19:0] <= ~saout_hi0_bc[19:0]; | |
779 | saout_hi1_bc_d_l[18:0] <= ~saout_hi1_bc[18:0]; | |
780 | rd_spare_0_d_l <= ~rd_spare_0; | |
781 | rd_spare_1_d_l <= ~rd_spare_1; | |
782 | end | |
783 | ||
784 | always@(negedge l1clk) | |
785 | begin | |
786 | saout_lo0_bc_c5b_l[19:0] <= saout_lo0_bc_d_l[19:0]; | |
787 | saout_lo1_bc_c5b_l[18:0] <= saout_lo1_bc_d_l[18:0]; | |
788 | saout_hi0_bc_c5b_l[19:0] <= saout_hi0_bc_d_l[19:0]; | |
789 | saout_hi1_bc_c5b_l[18:0] <= saout_hi1_bc_d_l[18:0]; | |
790 | rdd_spare_0 <= rd_spare_0_d_l; | |
791 | rdd_spare_1 <= rd_spare_1_d_l; | |
792 | tstmodclk_c3b_l <= tstmodclk_l; | |
793 | end | |
794 | ||
795 | ||
796 | assign rd_data[19:0] = | |
797 | {rdd_spare_0, saout_lo1_bc_c5b_l[4], saout_hi0_bc_c5b_l[4],saout_lo0_bc_c5b_l[4], | |
798 | saout_hi1_bc_c5b_l[3], saout_lo1_bc_c5b_l[3], saout_hi0_bc_c5b_l[3],saout_lo0_bc_c5b_l[3], | |
799 | saout_hi1_bc_c5b_l[2], saout_lo1_bc_c5b_l[2], saout_hi0_bc_c5b_l[2],saout_lo0_bc_c5b_l[2], | |
800 | saout_hi1_bc_c5b_l[1], saout_lo1_bc_c5b_l[1], saout_hi0_bc_c5b_l[1],saout_lo0_bc_c5b_l[1], | |
801 | saout_hi1_bc_c5b_l[0], saout_lo1_bc_c5b_l[0], saout_hi0_bc_c5b_l[0],saout_lo0_bc_c5b_l[0]}; | |
802 | ||
803 | assign rd_data[39:20] = { | |
804 | saout_lo1_bc_c5b_l[9], saout_hi0_bc_c5b_l[9],saout_lo0_bc_c5b_l[9], | |
805 | saout_hi1_bc_c5b_l[8], saout_lo1_bc_c5b_l[8], saout_hi0_bc_c5b_l[8],saout_lo0_bc_c5b_l[8], | |
806 | saout_hi1_bc_c5b_l[7], saout_lo1_bc_c5b_l[7], saout_hi0_bc_c5b_l[7],saout_lo0_bc_c5b_l[7], | |
807 | saout_hi1_bc_c5b_l[6], saout_lo1_bc_c5b_l[6], saout_hi0_bc_c5b_l[6],saout_lo0_bc_c5b_l[6], | |
808 | saout_hi1_bc_c5b_l[5], saout_lo1_bc_c5b_l[5], saout_hi0_bc_c5b_l[5],saout_lo0_bc_c5b_l[5], saout_hi1_bc_c5b_l[4]}; | |
809 | ||
810 | ||
811 | assign rd_data[59:40] = { | |
812 | saout_lo1_bc_c5b_l[14], saout_hi0_bc_c5b_l[14],saout_lo0_bc_c5b_l[14], | |
813 | saout_hi1_bc_c5b_l[13], saout_lo1_bc_c5b_l[13], saout_hi0_bc_c5b_l[13],saout_lo0_bc_c5b_l[13], | |
814 | saout_hi1_bc_c5b_l[12], saout_lo1_bc_c5b_l[12], saout_hi0_bc_c5b_l[12],saout_lo0_bc_c5b_l[12], | |
815 | saout_hi1_bc_c5b_l[11], saout_lo1_bc_c5b_l[11], saout_hi0_bc_c5b_l[11],saout_lo0_bc_c5b_l[11], | |
816 | saout_hi1_bc_c5b_l[10], saout_lo1_bc_c5b_l[10], saout_hi0_bc_c5b_l[10],saout_lo0_bc_c5b_l[10], saout_hi1_bc_c5b_l[9]}; | |
817 | ||
818 | assign rd_data[79:60] = { | |
819 | saout_hi0_bc_c5b_l[19], saout_lo0_bc_c5b_l[19], | |
820 | saout_hi1_bc_c5b_l[18], saout_lo1_bc_c5b_l[18], saout_hi0_bc_c5b_l[18],saout_lo0_bc_c5b_l[18], | |
821 | saout_hi1_bc_c5b_l[17], saout_lo1_bc_c5b_l[17], saout_hi0_bc_c5b_l[17],saout_lo0_bc_c5b_l[17], | |
822 | saout_hi1_bc_c5b_l[16], saout_lo1_bc_c5b_l[16], saout_hi0_bc_c5b_l[16],saout_lo0_bc_c5b_l[16], | |
823 | saout_hi1_bc_c5b_l[15], saout_lo1_bc_c5b_l[15], saout_hi0_bc_c5b_l[15],saout_lo0_bc_c5b_l[15], saout_hi1_bc_c5b_l[14],rdd_spare_1}; | |
824 | ||
825 | ||
826 | always@(cred_mod or rd_data) | |
827 | begin | |
828 | ||
829 | for(i=0;i<19;i=i+1) | |
830 | begin | |
831 | read_data[i] = cred_mod[i] ? rd_data[i+1] : rd_data[i]; | |
832 | end | |
833 | ||
834 | for(i=20;i<40;i=i+1) | |
835 | begin | |
836 | read_data[i] = cred_mod[i] ? rd_data[i-1] : rd_data[i]; | |
837 | end | |
838 | ||
839 | ||
840 | for(i=40;i<60;i=i+1) | |
841 | begin | |
842 | read_data[i] = cred_mod[i] ? rd_data[i+1] : rd_data[i]; | |
843 | end | |
844 | ||
845 | for(i=61;i<80;i=i+1) | |
846 | begin | |
847 | read_data[i] = cred_mod[i] ? rd_data[i-1] : rd_data[i]; | |
848 | end | |
849 | ||
850 | end | |
851 | ||
852 | ||
853 | ||
854 | assign { saout_hi0_b_out_l[19], saout_lo0_b_out_l[19], | |
855 | saout_hi1_b_out_l[18], saout_lo1_b_out_l[18], saout_hi0_b_out_l[18],saout_lo0_b_out_l[18], | |
856 | saout_hi1_b_out_l[17], saout_lo1_b_out_l[17], saout_hi0_b_out_l[17],saout_lo0_b_out_l[17], | |
857 | saout_hi1_b_out_l[16], saout_lo1_b_out_l[16], saout_hi0_b_out_l[16],saout_lo0_b_out_l[16], | |
858 | saout_hi1_b_out_l[15], saout_lo1_b_out_l[15], saout_hi0_b_out_l[15],saout_lo0_b_out_l[15], | |
859 | saout_hi1_b_out_l[14]} = read_data[79:61]; | |
860 | ||
861 | assign {saout_lo1_b_out_l[14], saout_hi0_b_out_l[14],saout_lo0_b_out_l[14], | |
862 | saout_hi1_b_out_l[13], saout_lo1_b_out_l[13], saout_hi0_b_out_l[13],saout_lo0_b_out_l[13], | |
863 | saout_hi1_b_out_l[12], saout_lo1_b_out_l[12], saout_hi0_b_out_l[12],saout_lo0_b_out_l[12], | |
864 | saout_hi1_b_out_l[11], saout_lo1_b_out_l[11], saout_hi0_b_out_l[11],saout_lo0_b_out_l[11], | |
865 | saout_hi1_b_out_l[10], saout_lo1_b_out_l[10], saout_hi0_b_out_l[10],saout_lo0_b_out_l[10], | |
866 | saout_hi1_b_out_l[9]} = read_data[59:40]; | |
867 | ||
868 | assign { saout_lo1_b_out_l[9], saout_hi0_b_out_l[9],saout_lo0_b_out_l[9], | |
869 | saout_hi1_b_out_l[8], saout_lo1_b_out_l[8], saout_hi0_b_out_l[8],saout_lo0_b_out_l[8], | |
870 | saout_hi1_b_out_l[7], saout_lo1_b_out_l[7], saout_hi0_b_out_l[7],saout_lo0_b_out_l[7], | |
871 | saout_hi1_b_out_l[6], saout_lo1_b_out_l[6], saout_hi0_b_out_l[6],saout_lo0_b_out_l[6], | |
872 | saout_hi1_b_out_l[5], saout_lo1_b_out_l[5], saout_hi0_b_out_l[5],saout_lo0_b_out_l[5], | |
873 | saout_hi1_b_out_l[4]} = read_data[39:20]; | |
874 | ||
875 | assign {saout_lo1_b_out_l[4], saout_hi0_b_out_l[4],saout_lo0_b_out_l[4], | |
876 | saout_hi1_b_out_l[3], saout_lo1_b_out_l[3], saout_hi0_b_out_l[3],saout_lo0_b_out_l[3], | |
877 | saout_hi1_b_out_l[2], saout_lo1_b_out_l[2], saout_hi0_b_out_l[2],saout_lo0_b_out_l[2], | |
878 | saout_hi1_b_out_l[1], saout_lo1_b_out_l[1], saout_hi0_b_out_l[1],saout_lo0_b_out_l[1], | |
879 | saout_hi1_b_out_l[0], saout_lo1_b_out_l[0], saout_hi0_b_out_l[0],saout_lo0_b_out_l[0]} = read_data[18:0]; | |
880 | ||
881 | assign red_sel_rgt = |cred[19:18]; | |
882 | assign red_sel_lft = |cred[59:58]; | |
883 | ||
884 | assign coloff_c5_rgt[1] = coloff_c5[1] | red_sel_rgt & coloff_c5[0]; | |
885 | assign coloff_c5_rgt[0] = coloff_c5[0] | red_sel_rgt & coloff_c5[1]; | |
886 | assign coloff_c5_lft[1] = coloff_c5[1] | red_sel_lft & coloff_c5[0]; | |
887 | assign coloff_c5_lft[0] = coloff_c5[0] | red_sel_lft & coloff_c5[1]; | |
888 | ||
889 | ||
890 | ||
891 | ||
892 | ||
893 | ||
894 | ||
895 | ||
896 | ||
897 | ||
898 | ||
899 | always@(negedge l1clk) | |
900 | begin | |
901 | select_read_data_all_c5b <= (bank_select_c5 & ~(select_red_odd | select_red_even) & (|waysel_c5) & (|coloff_c5) & readen_c5 & wee_l & ~waysel_err_c4); | |
902 | select_read_red_all_c5b <=(bank_select_c5 & (select_red_odd | select_red_even) & (|waysel_c5) & (|coloff_c5) & readen_c5 & wee_l & ~waysel_err_c4); | |
903 | ||
904 | select_read_data_c5b_hi_rgt <= (bank_select_c5 & ~(select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
905 | (readen_c5 & coloff_c5_rgt[1] & ~waysel_err_c5); | |
906 | select_read_data_c5b_hi_lft <= (bank_select_c5 & ~(select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
907 | (readen_c5 & coloff_c5_lft[1] & ~waysel_err_c5); | |
908 | select_read_data_c5b_lo_rgt <= (bank_select_c5 & ~(select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
909 | (readen_c5 & coloff_c5_rgt[0] & ~waysel_err_c5); | |
910 | select_read_data_c5b_lo_lft <= (bank_select_c5 & ~(select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
911 | (readen_c5 & coloff_c5_lft[0] & ~waysel_err_c5); | |
912 | select_read_red_c5b_hi_rgt <=(bank_select_c5 & (select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
913 | (readen_c5 & coloff_c5_rgt[1] & ~waysel_err_c5); | |
914 | select_read_red_c5b_hi_lft <=(bank_select_c5 & (select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
915 | (readen_c5 & coloff_c5_lft[1] & ~waysel_err_c5); | |
916 | select_read_red_c5b_lo_rgt <=(bank_select_c5 & (select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
917 | (readen_c5 & coloff_c5_rgt[0] & ~waysel_err_c5); | |
918 | select_read_red_c5b_lo_lft <=(bank_select_c5 & (select_red_odd | select_red_even) & (|waysel_c5) & wee_l) & | |
919 | (readen_c5 & coloff_c5_lft[0] & ~waysel_err_c5); | |
920 | end | |
921 | ||
922 | ||
923 | //assign saout_lo0_bc_l[19:0] = select_read_data_c5b ? saout_lo0_bc_c5b_l[19:0] : | |
924 | // select_read_red_c5b ? red_lo0_out[19:0] : 20'hFFFFF; | |
925 | //assign saout_lo1_bc_l[18:0] = select_read_data_c5b ? saout_lo1_bc_c5b_l[18:0] : | |
926 | // select_read_red_c5b ? red_lo1_out[18:0] : 19'h7FFFF; | |
927 | //assign saout_hi0_bc_l[19:0] = select_read_data_c5b ? saout_hi0_bc_c5b_l[19:0] : | |
928 | // select_read_red_c5b ? red_hi0_out[19:0] : 20'hFFFFF; | |
929 | //assign saout_hi1_bc_l[18:0] = select_read_data_c5b ? saout_hi1_bc_c5b_l[18:0] : | |
930 | // select_read_red_c5b ? red_hi1_out[18:0] : 19'h7FFFF; | |
931 | // | |
932 | always@(select_read_red_c5b_lo_rgt or select_read_red_c5b_lo_lft or select_read_red_c5b_hi_rgt or select_read_red_c5b_hi_lft or | |
933 | select_read_data_c5b_lo_rgt or select_read_data_c5b_lo_lft or select_read_data_c5b_hi_rgt or select_read_data_c5b_hi_lft | |
934 | or red_lo0_b_out_l or red_hi0_b_out_l or red_lo1_b_out_l or saout_hi1_b_out_l | |
935 | or saout_lo0_b_out_l or red_hi0_b_out_l or saout_lo1_b_out_l or saout_hi1_b_out_l or tstmodclk_c3b_l or l1clk) | |
936 | begin | |
937 | ||
938 | if(tstmodclk_c3b_l) | |
939 | begin | |
940 | saout_lo0_bc_l[9:0] = select_read_red_c5b_lo_rgt ? red_lo0_b_out_l[9:0] : | |
941 | select_read_data_c5b_lo_rgt ? saout_lo0_b_out_l[9:0] : 10'h3FF; | |
942 | saout_lo0_bc_l[19:10] = select_read_red_c5b_lo_lft ? red_lo0_b_out_l[19:10] : | |
943 | select_read_data_c5b_lo_lft ? saout_lo0_b_out_l[19:10] : 10'h3FF; | |
944 | saout_hi0_bc_l[9:0] = select_read_red_c5b_lo_rgt ? red_hi0_b_out_l[9:0] : | |
945 | select_read_data_c5b_lo_rgt ? saout_hi0_b_out_l[9:0] : 10'h3FF; | |
946 | saout_hi0_bc_l[19:10] = select_read_red_c5b_lo_lft ? red_hi0_b_out_l[19:10] : | |
947 | select_read_data_c5b_lo_lft ? saout_hi0_b_out_l[19:10] : 10'h3FF; | |
948 | saout_lo1_bc_l[9:0] = select_read_red_c5b_hi_rgt ? red_lo1_b_out_l[9:0] : | |
949 | select_read_data_c5b_hi_rgt ? saout_lo1_b_out_l[9:0] : 10'h3FF; | |
950 | saout_lo1_bc_l[18:10] = select_read_red_c5b_hi_lft ? red_lo1_b_out_l[18:10] : | |
951 | select_read_data_c5b_hi_lft ? saout_lo1_b_out_l[18:10] : 9'h1FF; | |
952 | saout_hi1_bc_l[8:0] = select_read_red_c5b_hi_rgt ? red_hi1_b_out_l[8:0] : | |
953 | select_read_data_c5b_hi_rgt ? saout_hi1_b_out_l[8:0] : 9'h1FF; | |
954 | saout_hi1_bc_l[18:9] = select_read_red_c5b_hi_lft ? red_hi1_b_out_l[18:9] : | |
955 | select_read_data_c5b_hi_lft ? saout_hi1_b_out_l[18:9] : 10'h3FF; | |
956 | end | |
957 | else | |
958 | begin | |
959 | saout_lo0_bc_l[19:0] = select_read_red_all_c5b ? red_lo0_b_out_l[19:0] : | |
960 | select_read_data_all_c5b ? saout_lo0_b_out_l[19:0] : 20'bx; | |
961 | saout_hi0_bc_l[19:0] = select_read_red_all_c5b ? red_hi0_b_out_l[19:0] : | |
962 | select_read_data_all_c5b ? saout_hi0_b_out_l[19:0] : 20'bx; | |
963 | saout_lo1_bc_l[18:0] = select_read_red_all_c5b ? red_lo1_b_out_l[18:0] : | |
964 | select_read_data_all_c5b ? saout_lo1_b_out_l[18:0] : 19'bx; | |
965 | saout_hi1_bc_l[18:0] = select_read_red_all_c5b ? red_hi1_b_out_l[18:0] : | |
966 | select_read_data_all_c5b ? saout_hi1_b_out_l[18:0] : 19'bx; | |
967 | ||
968 | //saout_lo0_bc_l[19:0] = select_read_data_all_c5b ? saout_lo0_bc_c5b_l[19:0] : 20'hFFFFF; | |
969 | //saout_lo1_bc_l[18:0] = select_read_data_all_c5b ? saout_lo1_bc_c5b_l[18:0] : 19'hFFFFF; | |
970 | //saout_hi0_bc_l[19:0] = select_read_data_all_c5b ? saout_hi0_bc_c5b_l[19:0] : 20'hFFFFF; | |
971 | //saout_hi1_bc_l[18:0] = select_read_data_all_c5b ? saout_hi1_bc_c5b_l[18:0] : 19'hFFFFF; | |
972 | end | |
973 | end | |
974 | ||
975 | ||
976 | //assign repair_saout_lo0_bc_l[9:0] = | |
977 | //select_read_red_c5b_lo_rgt ? red_lo0_b_out_l[9:0] : select_read_data_c5b_lo_rgt ? saout_lo0_b_out_l[9:0] : 10'h3FF ; | |
978 | //assign repair_saout_lo0_bc_l[19:10] = | |
979 | //select_read_red_c5b_lo_lft ? red_lo0_b_out_l[19:10] : select_read_data_c5b_lo_lft ? saout_lo0_b_out_l[19:10] : 10'h3FF ; | |
980 | //assign repair_saout_hi0_bc_l[9:0] = | |
981 | //select_read_red_c5b_lo_rgt ? red_hi0_b_out_l[9:0] : select_read_data_c5b_lo_rgt ? saout_hi0_b_out_l[9:0] : 10'h3FF ; | |
982 | //assign repair_saout_hi0_bc_l[19:10] = | |
983 | //select_read_red_c5b_lo_lft ? red_hi0_b_out_l[19:10] : select_read_data_c5b_lo_lft ? saout_hi0_b_out_l[19:10] : 10'h3FF ; | |
984 | //assign repair_saout_lo1_bc_l[9:0] = | |
985 | //select_read_red_c5b_hi_rgt ? red_lo1_b_out_l[9:0] : select_read_data_c5b_hi_rgt ? saout_lo1_b_out_l[9:0] : 10'h3FF ; | |
986 | //assign repair_saout_lo1_bc_l[18:10] = | |
987 | //select_read_red_c5b_hi_lft ? red_lo1_b_out_l[18:10] : select_read_data_c5b_hi_lft ? saout_lo1_b_out_l[18:10] : 9'h1FF ; | |
988 | //assign repair_saout_hi1_bc_l[8:0] = | |
989 | //select_read_red_c5b_hi_rgt ? red_hi1_b_out_l[8:0] : select_read_data_c5b_hi_rgt ? saout_hi1_b_out_l[8:0] : 9'h1FF ; | |
990 | //assign repair_saout_hi1_bc_l[18:9] = | |
991 | //select_read_red_c5b_hi_lft ? red_hi1_b_out_l[18:9] : select_read_data_c5b_hi_lft ? saout_hi1_b_out_l[18:9] : 10'h3FF ; | |
992 | // | |
993 | // | |
994 | //assign norepair_saout_lo0_bc_l[19:0] = select_read_data_all_c5b ? saout_lo0_bc_c5b_l[19:0] : 20'hFFFFF; | |
995 | //assign norepair_saout_lo1_bc_l[18:0] = select_read_data_all_c5b ? saout_lo1_bc_c5b_l[18:0] : 19'hFFFFF; | |
996 | //assign norepair_saout_hi0_bc_l[19:0] = select_read_data_all_c5b ? saout_hi0_bc_c5b_l[19:0] : 20'hFFFFF; | |
997 | //assign norepair_saout_hi1_bc_l[18:0] = select_read_data_all_c5b ? saout_hi1_bc_c5b_l[18:0] : 19'hFFFFF; | |
998 | // | |
999 | //`endif | |
1000 | // | |
1001 | //`ifdef AXIS_SMEM | |
1002 | // | |
1003 | // always@(negedge l1clk) | |
1004 | // begin | |
1005 | // axis_saout_lo0_bc[19:0] = saout_lo0_bc[19:0]; | |
1006 | // axis_saout_lo1_bc[18:0] = saout_lo1_bc[18:0]; | |
1007 | // axis_saout_hi0_bc[19:0] = saout_hi0_bc[19:0]; | |
1008 | // axis_saout_hi1_bc[18:0] = saout_hi1_bc[18:0]; | |
1009 | // end | |
1010 | // assign saout_lo0_bc_l[19:0] = axis_select_read_data_c5b ? axis_saout_lo0_bc[19:0] : 20'hFFFFF; | |
1011 | // assign saout_lo1_bc_l[18:0] = axis_select_read_data_c5b ? axis_saout_lo1_bc[18:0] : 19'h7FFFF; | |
1012 | // assign saout_hi0_bc_l[19:0] = axis_select_read_data_c5b ? axis_saout_hi0_bc[19:0] : 20'hFFFFF; | |
1013 | // assign saout_hi1_bc_l[18:0] = axis_select_read_data_c5b ? axis_saout_hi1_bc[18:0] : 19'h7FFFF; | |
1014 | // | |
1015 | //`else | |
1016 | //assign saout_lo0_bc_l[19:0] = ~tstmodclk_c3b_l ? repair_saout_lo0_bc_l[19:0] : norepair_saout_lo0_bc_l[19:0]; | |
1017 | //assign saout_lo1_bc_l[18:0] = ~tstmodclk_c3b_l ? repair_saout_lo1_bc_l[18:0] : norepair_saout_lo1_bc_l[18:0]; | |
1018 | //assign saout_hi0_bc_l[19:0] = ~tstmodclk_c3b_l ? repair_saout_hi0_bc_l[19:0] : norepair_saout_hi0_bc_l[19:0]; | |
1019 | //assign saout_hi1_bc_l[18:0] = ~tstmodclk_c3b_l ? repair_saout_hi1_bc_l[18:0] : norepair_saout_hi1_bc_l[18:0]; | |
1020 | ||
1021 | /////////////////////////////////////////////////////////////////////////////////////////////// | |
1022 | ||
1023 | // REDUDANCY | |
1024 | ||
1025 | reg [19:0] red_lo0_odd_0; | |
1026 | reg [18:0] red_lo1_odd_0; | |
1027 | reg [19:0] red_hi0_odd_0; | |
1028 | reg [18:0] red_hi1_odd_0; | |
1029 | reg [19:0] red_lo0_even_0; | |
1030 | reg [18:0] red_lo1_even_0; | |
1031 | reg [19:0] red_hi0_even_0; | |
1032 | reg [18:0] red_hi1_even_0; | |
1033 | reg redrow_way0_spare_odd_0; | |
1034 | reg redrow_way0_spare_even_0; | |
1035 | reg redrow_way0_spare_odd_1; | |
1036 | reg redrow_way0_spare_even_1; | |
1037 | ||
1038 | reg [19:0] red_lo0_odd_1; | |
1039 | reg [18:0] red_lo1_odd_1; | |
1040 | reg [19:0] red_hi0_odd_1; | |
1041 | reg [18:0] red_hi1_odd_1; | |
1042 | reg [19:0] red_lo0_even_1; | |
1043 | reg [18:0] red_lo1_even_1; | |
1044 | reg [19:0] red_hi0_even_1; | |
1045 | reg [18:0] red_hi1_even_1; | |
1046 | reg redrow_way1_spare_odd_0; | |
1047 | reg redrow_way1_spare_even_0; | |
1048 | reg redrow_way1_spare_odd_1; | |
1049 | reg redrow_way1_spare_even_1; | |
1050 | ||
1051 | reg [19:0] red_lo0_odd_2; | |
1052 | reg [18:0] red_lo1_odd_2; | |
1053 | reg [19:0] red_hi0_odd_2; | |
1054 | reg [18:0] red_hi1_odd_2; | |
1055 | reg [19:0] red_lo0_even_2; | |
1056 | reg [18:0] red_lo1_even_2; | |
1057 | reg [19:0] red_hi0_even_2; | |
1058 | reg [18:0] red_hi1_even_2; | |
1059 | reg redrow_way2_spare_odd_0; | |
1060 | reg redrow_way2_spare_even_0; | |
1061 | reg redrow_way2_spare_odd_1; | |
1062 | reg redrow_way2_spare_even_1; | |
1063 | ||
1064 | reg [19:0] red_lo0_odd_3; | |
1065 | reg [18:0] red_lo1_odd_3; | |
1066 | reg [19:0] red_hi0_odd_3; | |
1067 | reg [18:0] red_hi1_odd_3; | |
1068 | reg [19:0] red_lo0_even_3; | |
1069 | reg [18:0] red_lo1_even_3; | |
1070 | reg [19:0] red_hi0_even_3; | |
1071 | reg [18:0] red_hi1_even_3; | |
1072 | reg redrow_way3_spare_odd_0; | |
1073 | reg redrow_way3_spare_even_0; | |
1074 | reg redrow_way3_spare_odd_1; | |
1075 | reg redrow_way3_spare_even_1; | |
1076 | ||
1077 | reg [19:0] red_lo0_odd_4; | |
1078 | reg [18:0] red_lo1_odd_4; | |
1079 | reg [19:0] red_hi0_odd_4; | |
1080 | reg [18:0] red_hi1_odd_4; | |
1081 | reg [19:0] red_lo0_even_4; | |
1082 | reg [18:0] red_lo1_even_4; | |
1083 | reg [19:0] red_hi0_even_4; | |
1084 | reg [18:0] red_hi1_even_4; | |
1085 | reg redrow_way4_spare_odd_0; | |
1086 | reg redrow_way4_spare_even_0; | |
1087 | reg redrow_way4_spare_odd_1; | |
1088 | reg redrow_way4_spare_even_1; | |
1089 | ||
1090 | reg [19:0] red_lo0_odd_5; | |
1091 | reg [18:0] red_lo1_odd_5; | |
1092 | reg [19:0] red_hi0_odd_5; | |
1093 | reg [18:0] red_hi1_odd_5; | |
1094 | reg [19:0] red_lo0_even_5; | |
1095 | reg [18:0] red_lo1_even_5; | |
1096 | reg [19:0] red_hi0_even_5; | |
1097 | reg [18:0] red_hi1_even_5; | |
1098 | reg redrow_way5_spare_odd_0; | |
1099 | reg redrow_way5_spare_even_0; | |
1100 | reg redrow_way5_spare_odd_1; | |
1101 | reg redrow_way5_spare_even_1; | |
1102 | ||
1103 | reg [19:0] red_lo0_odd_6; | |
1104 | reg [18:0] red_lo1_odd_6; | |
1105 | reg [19:0] red_hi0_odd_6; | |
1106 | reg [18:0] red_hi1_odd_6; | |
1107 | reg [19:0] red_lo0_even_6; | |
1108 | reg [18:0] red_lo1_even_6; | |
1109 | reg [19:0] red_hi0_even_6; | |
1110 | reg [18:0] red_hi1_even_6; | |
1111 | reg redrow_way6_spare_odd_0; | |
1112 | reg redrow_way6_spare_even_0; | |
1113 | reg redrow_way6_spare_odd_1; | |
1114 | reg redrow_way6_spare_even_1; | |
1115 | ||
1116 | reg [19:0] red_lo0_odd_7; | |
1117 | reg [18:0] red_lo1_odd_7; | |
1118 | reg [19:0] red_hi0_odd_7; | |
1119 | reg [18:0] red_hi1_odd_7; | |
1120 | reg [19:0] red_lo0_even_7; | |
1121 | reg [18:0] red_lo1_even_7; | |
1122 | reg [19:0] red_hi0_even_7; | |
1123 | reg [18:0] red_hi1_even_7; | |
1124 | reg redrow_way7_spare_odd_0; | |
1125 | reg redrow_way7_spare_even_0; | |
1126 | reg redrow_way7_spare_odd_1; | |
1127 | reg redrow_way7_spare_even_1; | |
1128 | ||
1129 | ||
1130 | ||
1131 | reg [19:0] red_lo0_out_bc; | |
1132 | reg [18:0] red_lo1_out_bc; | |
1133 | reg [19:0] red_hi0_out_bc; | |
1134 | reg [18:0] red_hi1_out_bc; | |
1135 | reg redrow_rd_spare_0; | |
1136 | reg redrow_rd_spare_1; | |
1137 | ||
1138 | reg [19:0] red_lo0_out_bc_d_l; | |
1139 | reg [18:0] red_lo1_out_bc_d_l; | |
1140 | reg [19:0] red_hi0_out_bc_d_l; | |
1141 | reg [18:0] red_hi1_out_bc_d_l; | |
1142 | reg redrow_rd_spare_0_d_l; | |
1143 | reg redrow_rd_spare_1_d_l; | |
1144 | ||
1145 | reg [19:0] red_lo0_bc_c5b_l; | |
1146 | reg [19:0] red_hi0_bc_c5b_l; | |
1147 | reg [18:0] red_lo1_bc_c5b_l; | |
1148 | reg [18:0] red_hi1_bc_c5b_l; | |
1149 | reg redrow_rdd_spare_0; | |
1150 | reg redrow_rdd_spare_1; | |
1151 | ||
1152 | wire [79:0] red_rd_data; | |
1153 | reg [79:0] red_read_data; | |
1154 | ||
1155 | // Folloing 2 assigns detects a red index to hit with incoming index | |
1156 | // and assert. While writing and reading the way info is looked at | |
1157 | ||
1158 | assign select_red_odd = (red_adr[9:8] == 2'b11) & (red_adr[7:1] == set_c3b[7:1]) | |
1159 | & set_c3b[0] & red_adr[0]; | |
1160 | assign select_red_even = (red_adr[9:8] == 2'b11) & (red_adr[7:1] == set_c3b[7:1]) | |
1161 | & ~set_c3b[0] & ~red_adr[0]; | |
1162 | ||
1163 | ||
1164 | always@(wee_l or l1clk or wen_c4 or set_c4 or waysel_c4 or waysel_err_c4 or bank_select or coloff_c4 or worden_c4 or | |
1165 | select_red_odd or select_red_even or worden_lo0 or worden_hi0 or worden_lo1 or worden_hi1 or wrd_lo0_a | |
1166 | or wrd_hi0_a or wrd_lo1_a or wrd_hi1_a or wr_spare_0 or wr_spare_1 or spare_word_enable or vnw_ary) | |
1167 | begin | |
1168 | // Odd row to be written | |
1169 | if(~l1clk & wee_l & wen_c4 & select_red_odd & ~waysel_err_c4 & bank_select & coloff_c4 & (|worden_c4) & vnw_ary) | |
1170 | begin | |
1171 | if(waysel_c4[0]) | |
1172 | begin | |
1173 | red_lo0_odd_0 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_0); | |
1174 | red_hi0_odd_0 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_0); | |
1175 | red_lo1_odd_0 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_0); | |
1176 | red_hi1_odd_0 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_0); | |
1177 | redrow_way0_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way0_spare_odd_0); | |
1178 | redrow_way0_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way0_spare_odd_1); | |
1179 | end | |
1180 | else if(waysel_c4[1]) | |
1181 | begin | |
1182 | red_lo0_odd_1 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_1); | |
1183 | red_hi0_odd_1 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_1); | |
1184 | red_lo1_odd_1 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_1); | |
1185 | red_hi1_odd_1 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_1); | |
1186 | redrow_way1_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way1_spare_odd_0); | |
1187 | redrow_way1_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way1_spare_odd_1); | |
1188 | end | |
1189 | else if(waysel_c4[2]) | |
1190 | begin | |
1191 | red_lo0_odd_2 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_2); | |
1192 | red_hi0_odd_2 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_2); | |
1193 | red_lo1_odd_2 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_2); | |
1194 | red_hi1_odd_2 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_2); | |
1195 | redrow_way2_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way2_spare_odd_0); | |
1196 | redrow_way2_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way2_spare_odd_1); | |
1197 | end | |
1198 | else if(waysel_c4[3]) | |
1199 | begin | |
1200 | red_lo0_odd_3 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_3); | |
1201 | red_hi0_odd_3 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_3); | |
1202 | red_lo1_odd_3 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_3); | |
1203 | red_hi1_odd_3 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_3); | |
1204 | redrow_way3_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way3_spare_odd_0); | |
1205 | redrow_way3_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way3_spare_odd_1); | |
1206 | end | |
1207 | else if(waysel_c4[4]) | |
1208 | begin | |
1209 | red_lo0_odd_4 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_4); | |
1210 | red_hi0_odd_4 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_4); | |
1211 | red_lo1_odd_4 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_4); | |
1212 | red_hi1_odd_4 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_4); | |
1213 | redrow_way4_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way4_spare_odd_0); | |
1214 | redrow_way4_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way4_spare_odd_1); | |
1215 | end | |
1216 | else if(waysel_c4[5]) | |
1217 | begin | |
1218 | red_lo0_odd_5 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_5); | |
1219 | red_hi0_odd_5 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_5); | |
1220 | red_lo1_odd_5 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_5); | |
1221 | red_hi1_odd_5 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_5); | |
1222 | redrow_way5_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way5_spare_odd_0); | |
1223 | redrow_way5_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way5_spare_odd_1); | |
1224 | end | |
1225 | else if(waysel_c4[6]) | |
1226 | begin | |
1227 | red_lo0_odd_6 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_6); | |
1228 | red_hi0_odd_6 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_6); | |
1229 | red_lo1_odd_6 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_6); | |
1230 | red_hi1_odd_6 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_6); | |
1231 | redrow_way6_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way6_spare_odd_0); | |
1232 | redrow_way6_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way6_spare_odd_1); | |
1233 | end | |
1234 | else if(waysel_c4[7]) | |
1235 | begin | |
1236 | red_lo0_odd_7 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_odd_7); | |
1237 | red_hi0_odd_7 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_odd_7); | |
1238 | red_lo1_odd_7 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_odd_7); | |
1239 | red_hi1_odd_7 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_odd_7); | |
1240 | redrow_way7_spare_odd_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way7_spare_odd_0); | |
1241 | redrow_way7_spare_odd_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way7_spare_odd_1); | |
1242 | end | |
1243 | end | |
1244 | ||
1245 | ||
1246 | // Even rows to be written | |
1247 | if(~l1clk & wee_l & wen_c4 & select_red_even & ~waysel_err_c4 & bank_select & coloff_c4 & (|worden_c4) & vnw_ary) | |
1248 | begin | |
1249 | if(waysel_c4[0]) | |
1250 | begin | |
1251 | red_lo0_even_0 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_0); | |
1252 | red_hi0_even_0 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_0); | |
1253 | red_lo1_even_0 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_0); | |
1254 | red_hi1_even_0 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_0); | |
1255 | redrow_way0_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way0_spare_even_0); | |
1256 | redrow_way0_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way0_spare_even_1); | |
1257 | end | |
1258 | else if(waysel_c4[1]) | |
1259 | begin | |
1260 | red_lo0_even_1 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_1); | |
1261 | red_hi0_even_1 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_1); | |
1262 | red_lo1_even_1 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_1); | |
1263 | red_hi1_even_1 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_1); | |
1264 | redrow_way1_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way1_spare_even_0); | |
1265 | redrow_way1_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way1_spare_even_1); | |
1266 | end | |
1267 | else if(waysel_c4[2]) | |
1268 | begin | |
1269 | red_lo0_even_2 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_2); | |
1270 | red_hi0_even_2 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_2); | |
1271 | red_lo1_even_2 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_2); | |
1272 | red_hi1_even_2 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_2); | |
1273 | redrow_way2_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way2_spare_even_0); | |
1274 | redrow_way2_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way2_spare_even_1); | |
1275 | end | |
1276 | else if(waysel_c4[3]) | |
1277 | begin | |
1278 | red_lo0_even_3 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_3); | |
1279 | red_hi0_even_3 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_3); | |
1280 | red_lo1_even_3 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_3); | |
1281 | red_hi1_even_3 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_3); | |
1282 | redrow_way3_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way3_spare_even_0); | |
1283 | redrow_way3_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way3_spare_even_1); | |
1284 | end | |
1285 | else if(waysel_c4[4]) | |
1286 | begin | |
1287 | red_lo0_even_4 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_4); | |
1288 | red_hi0_even_4 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_4); | |
1289 | red_lo1_even_4 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_4); | |
1290 | red_hi1_even_4 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_4); | |
1291 | redrow_way4_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way4_spare_even_0); | |
1292 | redrow_way4_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way4_spare_even_1); | |
1293 | end | |
1294 | else if(waysel_c4[5]) | |
1295 | begin | |
1296 | red_lo0_even_5 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_5); | |
1297 | red_hi0_even_5 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_5); | |
1298 | red_lo1_even_5 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_5); | |
1299 | red_hi1_even_5 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_5); | |
1300 | redrow_way5_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way5_spare_even_0); | |
1301 | redrow_way5_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way5_spare_even_1); | |
1302 | end | |
1303 | else if(waysel_c4[6]) | |
1304 | begin | |
1305 | red_lo0_even_6 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_6); | |
1306 | red_hi0_even_6 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_6); | |
1307 | red_lo1_even_6 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_6); | |
1308 | red_hi1_even_6 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_6); | |
1309 | redrow_way6_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way6_spare_even_0); | |
1310 | redrow_way6_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way6_spare_even_1); | |
1311 | end | |
1312 | else if(waysel_c4[7]) | |
1313 | begin | |
1314 | red_lo0_even_7 <= (worden_lo0[19:0] & wrd_lo0_a[19:0] | ~worden_lo0[19:0] & red_lo0_even_7); | |
1315 | red_hi0_even_7 <= (worden_hi0[19:0] & wrd_hi0_a[19:0] | ~worden_hi0[19:0] & red_hi0_even_7); | |
1316 | red_lo1_even_7 <= (worden_lo1[18:0] & wrd_lo1_a[18:0] | ~worden_lo1[18:0] & red_lo1_even_7); | |
1317 | red_hi1_even_7 <= (worden_hi1[18:0] & wrd_hi1_a[18:0] | ~worden_hi1[18:0] & red_hi1_even_7); | |
1318 | redrow_way7_spare_even_0 <= (spare_word_enable[0] & wr_spare_0 | ~spare_word_enable[0] & redrow_way7_spare_even_0); | |
1319 | redrow_way7_spare_even_1 <= (spare_word_enable[1] & wr_spare_1 | ~spare_word_enable[1] & redrow_way7_spare_even_1); | |
1320 | end | |
1321 | end | |
1322 | end | |
1323 | ||
1324 | // read out | |
1325 | always@(waysel_c4 or coloff_c4_l or set_c4 or vnw_ary) | |
1326 | begin | |
1327 | if(~coloff_c4_l & vnw_ary) | |
1328 | begin | |
1329 | if(waysel_c4[0]) | |
1330 | begin | |
1331 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_0 : red_lo0_even_0; | |
1332 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_0 : red_lo1_even_0; | |
1333 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_0 : red_hi0_even_0; | |
1334 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_0 : red_hi1_even_0; | |
1335 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way0_spare_odd_0 : redrow_way0_spare_even_0; | |
1336 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way0_spare_odd_1 : redrow_way0_spare_even_1; | |
1337 | end | |
1338 | else if(waysel_c4[1]) | |
1339 | begin | |
1340 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_1 : red_lo0_even_1; | |
1341 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_1 : red_lo1_even_1; | |
1342 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_1 : red_hi0_even_1; | |
1343 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_1 : red_hi1_even_1; | |
1344 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way1_spare_odd_0 : redrow_way1_spare_even_0; | |
1345 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way1_spare_odd_1 : redrow_way1_spare_even_1; | |
1346 | end | |
1347 | else if(waysel_c4[2]) | |
1348 | begin | |
1349 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_2 : red_lo0_even_2; | |
1350 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_2 : red_lo1_even_2; | |
1351 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_2 : red_hi0_even_2; | |
1352 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_2 : red_hi1_even_2; | |
1353 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way2_spare_odd_0 : redrow_way2_spare_even_0; | |
1354 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way2_spare_odd_1 : redrow_way2_spare_even_1; | |
1355 | end | |
1356 | else if(waysel_c4[3]) | |
1357 | begin | |
1358 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_3 : red_lo0_even_3; | |
1359 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_3 : red_lo1_even_3; | |
1360 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_3 : red_hi0_even_3; | |
1361 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_3 : red_hi1_even_3; | |
1362 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way3_spare_odd_0 : redrow_way3_spare_even_0; | |
1363 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way3_spare_odd_1 : redrow_way3_spare_even_1; | |
1364 | end | |
1365 | else if(waysel_c4[4]) | |
1366 | begin | |
1367 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_4 : red_lo0_even_4; | |
1368 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_4 : red_lo1_even_4; | |
1369 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_4 : red_hi0_even_4; | |
1370 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_4 : red_hi1_even_4; | |
1371 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way4_spare_odd_0 : redrow_way4_spare_even_0; | |
1372 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way4_spare_odd_1 : redrow_way4_spare_even_1; | |
1373 | end | |
1374 | else if(waysel_c4[5]) | |
1375 | begin | |
1376 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_5 : red_lo0_even_5; | |
1377 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_5 : red_lo1_even_5; | |
1378 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_5 : red_hi0_even_5; | |
1379 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_5 : red_hi1_even_5; | |
1380 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way5_spare_odd_0 : redrow_way5_spare_even_0; | |
1381 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way5_spare_odd_1 : redrow_way5_spare_even_1; | |
1382 | end | |
1383 | else if(waysel_c4[6]) | |
1384 | begin | |
1385 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_6 : red_lo0_even_6; | |
1386 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_6 : red_lo1_even_6; | |
1387 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_6 : red_hi0_even_6; | |
1388 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_6 : red_hi1_even_6; | |
1389 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way6_spare_odd_0 : redrow_way6_spare_even_0; | |
1390 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way6_spare_odd_1 : redrow_way6_spare_even_1; | |
1391 | end | |
1392 | else if(waysel_c4[7]) | |
1393 | begin | |
1394 | red_lo0_out_bc[19:0] <= (set_c4[0]) ? red_lo0_odd_7 : red_lo0_even_7; | |
1395 | red_lo1_out_bc[18:0] <= (set_c4[0]) ? red_lo1_odd_7 : red_lo1_even_7; | |
1396 | red_hi0_out_bc[19:0] <= (set_c4[0]) ? red_hi0_odd_7 : red_hi0_even_7; | |
1397 | red_hi1_out_bc[18:0] <= (set_c4[0]) ? red_hi1_odd_7 : red_hi1_even_7; | |
1398 | redrow_rd_spare_0 <= (set_c4[0]) ? redrow_way7_spare_odd_0 : redrow_way7_spare_even_0; | |
1399 | redrow_rd_spare_1 <= (set_c4[0]) ? redrow_way7_spare_odd_1 : redrow_way7_spare_even_1; | |
1400 | end | |
1401 | end | |
1402 | end | |
1403 | ||
1404 | always@(negedge l1clk) | |
1405 | begin | |
1406 | red_lo0_out_bc_d_l <= ~red_lo0_out_bc; | |
1407 | red_hi0_out_bc_d_l <= ~red_hi0_out_bc; | |
1408 | red_lo1_out_bc_d_l <= ~red_lo1_out_bc; | |
1409 | red_hi1_out_bc_d_l <= ~red_hi1_out_bc; | |
1410 | redrow_rd_spare_0_d_l <= ~redrow_rd_spare_0; | |
1411 | redrow_rd_spare_1_d_l <= ~redrow_rd_spare_1; | |
1412 | end | |
1413 | ||
1414 | always@(posedge l1clk) | |
1415 | begin | |
1416 | red_lo0_bc_c5b_l <= red_lo0_out_bc_d_l; | |
1417 | red_hi0_bc_c5b_l <= red_hi0_out_bc_d_l; | |
1418 | red_lo1_bc_c5b_l <= red_lo1_out_bc_d_l; | |
1419 | red_hi1_bc_c5b_l <= red_hi1_out_bc_d_l; | |
1420 | redrow_rdd_spare_0 <= redrow_rd_spare_0_d_l; | |
1421 | redrow_rdd_spare_1 <= redrow_rd_spare_1_d_l; | |
1422 | end | |
1423 | ||
1424 | assign red_rd_data[19:0] = | |
1425 | {redrow_rdd_spare_0, red_lo1_bc_c5b_l[4], red_hi0_bc_c5b_l[4],red_lo0_bc_c5b_l[4], | |
1426 | red_hi1_bc_c5b_l[3], red_lo1_bc_c5b_l[3], red_hi0_bc_c5b_l[3],red_lo0_bc_c5b_l[3], | |
1427 | red_hi1_bc_c5b_l[2], red_lo1_bc_c5b_l[2], red_hi0_bc_c5b_l[2],red_lo0_bc_c5b_l[2], | |
1428 | red_hi1_bc_c5b_l[1], red_lo1_bc_c5b_l[1], red_hi0_bc_c5b_l[1],red_lo0_bc_c5b_l[1], | |
1429 | red_hi1_bc_c5b_l[0], red_lo1_bc_c5b_l[0], red_hi0_bc_c5b_l[0],red_lo0_bc_c5b_l[0]}; | |
1430 | ||
1431 | assign red_rd_data[39:20] = { | |
1432 | red_lo1_bc_c5b_l[9], red_hi0_bc_c5b_l[9],red_lo0_bc_c5b_l[9], | |
1433 | red_hi1_bc_c5b_l[8], red_lo1_bc_c5b_l[8], red_hi0_bc_c5b_l[8],red_lo0_bc_c5b_l[8], | |
1434 | red_hi1_bc_c5b_l[7], red_lo1_bc_c5b_l[7], red_hi0_bc_c5b_l[7],red_lo0_bc_c5b_l[7], | |
1435 | red_hi1_bc_c5b_l[6], red_lo1_bc_c5b_l[6], red_hi0_bc_c5b_l[6],red_lo0_bc_c5b_l[6], | |
1436 | red_hi1_bc_c5b_l[5], red_lo1_bc_c5b_l[5], red_hi0_bc_c5b_l[5],red_lo0_bc_c5b_l[5], red_hi1_bc_c5b_l[4]}; | |
1437 | ||
1438 | ||
1439 | assign red_rd_data[59:40] = { | |
1440 | red_lo1_bc_c5b_l[14], red_hi0_bc_c5b_l[14],red_lo0_bc_c5b_l[14], | |
1441 | red_hi1_bc_c5b_l[13], red_lo1_bc_c5b_l[13], red_hi0_bc_c5b_l[13],red_lo0_bc_c5b_l[13], | |
1442 | red_hi1_bc_c5b_l[12], red_lo1_bc_c5b_l[12], red_hi0_bc_c5b_l[12],red_lo0_bc_c5b_l[12], | |
1443 | red_hi1_bc_c5b_l[11], red_lo1_bc_c5b_l[11], red_hi0_bc_c5b_l[11],red_lo0_bc_c5b_l[11], | |
1444 | red_hi1_bc_c5b_l[10], red_lo1_bc_c5b_l[10], red_hi0_bc_c5b_l[10],red_lo0_bc_c5b_l[10], red_hi1_bc_c5b_l[9]}; | |
1445 | ||
1446 | assign red_rd_data[79:60] = { | |
1447 | red_hi0_bc_c5b_l[19], red_lo0_bc_c5b_l[19], | |
1448 | red_hi1_bc_c5b_l[18], red_lo1_bc_c5b_l[18], red_hi0_bc_c5b_l[18],red_lo0_bc_c5b_l[18], | |
1449 | red_hi1_bc_c5b_l[17], red_lo1_bc_c5b_l[17], red_hi0_bc_c5b_l[17],red_lo0_bc_c5b_l[17], | |
1450 | red_hi1_bc_c5b_l[16], red_lo1_bc_c5b_l[16], red_hi0_bc_c5b_l[16],red_lo0_bc_c5b_l[16], | |
1451 | red_hi1_bc_c5b_l[15], red_lo1_bc_c5b_l[15], red_hi0_bc_c5b_l[15],red_lo0_bc_c5b_l[15], red_hi1_bc_c5b_l[14],redrow_rdd_spare_1}; | |
1452 | ||
1453 | ||
1454 | always@(cred_mod or red_rd_data) | |
1455 | begin | |
1456 | ||
1457 | for(i=0;i<19;i=i+1) | |
1458 | begin | |
1459 | red_read_data[i] = cred_mod[i] ? red_rd_data[i+1] : red_rd_data[i]; | |
1460 | end | |
1461 | ||
1462 | for(i=20;i<40;i=i+1) | |
1463 | begin | |
1464 | red_read_data[i] = cred_mod[i] ? red_rd_data[i-1] : red_rd_data[i]; | |
1465 | end | |
1466 | ||
1467 | ||
1468 | for(i=40;i<60;i=i+1) | |
1469 | begin | |
1470 | red_read_data[i] = cred_mod[i] ? red_rd_data[i+1] : red_rd_data[i]; | |
1471 | end | |
1472 | ||
1473 | for(i=61;i<80;i=i+1) | |
1474 | begin | |
1475 | red_read_data[i] = cred_mod[i] ? red_rd_data[i-1] : red_rd_data[i]; | |
1476 | end | |
1477 | ||
1478 | end | |
1479 | ||
1480 | ||
1481 | ||
1482 | assign { red_hi0_b_out_l[19], red_lo0_b_out_l[19], | |
1483 | red_hi1_b_out_l[18], red_lo1_b_out_l[18], red_hi0_b_out_l[18],red_lo0_b_out_l[18], | |
1484 | red_hi1_b_out_l[17], red_lo1_b_out_l[17], red_hi0_b_out_l[17],red_lo0_b_out_l[17], | |
1485 | red_hi1_b_out_l[16], red_lo1_b_out_l[16], red_hi0_b_out_l[16],red_lo0_b_out_l[16], | |
1486 | red_hi1_b_out_l[15], red_lo1_b_out_l[15], red_hi0_b_out_l[15],red_lo0_b_out_l[15], | |
1487 | red_hi1_b_out_l[14]} = red_read_data[79:61]; | |
1488 | ||
1489 | assign {red_lo1_b_out_l[14], red_hi0_b_out_l[14],red_lo0_b_out_l[14], | |
1490 | red_hi1_b_out_l[13], red_lo1_b_out_l[13], red_hi0_b_out_l[13],red_lo0_b_out_l[13], | |
1491 | red_hi1_b_out_l[12], red_lo1_b_out_l[12], red_hi0_b_out_l[12],red_lo0_b_out_l[12], | |
1492 | red_hi1_b_out_l[11], red_lo1_b_out_l[11], red_hi0_b_out_l[11],red_lo0_b_out_l[11], | |
1493 | red_hi1_b_out_l[10], red_lo1_b_out_l[10], red_hi0_b_out_l[10],red_lo0_b_out_l[10], | |
1494 | red_hi1_b_out_l[9]} = red_read_data[59:40]; | |
1495 | ||
1496 | assign { red_lo1_b_out_l[9], red_hi0_b_out_l[9],red_lo0_b_out_l[9], | |
1497 | red_hi1_b_out_l[8], red_lo1_b_out_l[8], red_hi0_b_out_l[8],red_lo0_b_out_l[8], | |
1498 | red_hi1_b_out_l[7], red_lo1_b_out_l[7], red_hi0_b_out_l[7],red_lo0_b_out_l[7], | |
1499 | red_hi1_b_out_l[6], red_lo1_b_out_l[6], red_hi0_b_out_l[6],red_lo0_b_out_l[6], | |
1500 | red_hi1_b_out_l[5], red_lo1_b_out_l[5], red_hi0_b_out_l[5],red_lo0_b_out_l[5], | |
1501 | red_hi1_b_out_l[4]} = red_read_data[39:20]; | |
1502 | ||
1503 | assign {red_lo1_b_out_l[4], red_hi0_b_out_l[4],red_lo0_b_out_l[4], | |
1504 | red_hi1_b_out_l[3], red_lo1_b_out_l[3], red_hi0_b_out_l[3],red_lo0_b_out_l[3], | |
1505 | red_hi1_b_out_l[2], red_lo1_b_out_l[2], red_hi0_b_out_l[2],red_lo0_b_out_l[2], | |
1506 | red_hi1_b_out_l[1], red_lo1_b_out_l[1], red_hi0_b_out_l[1],red_lo0_b_out_l[1], | |
1507 | red_hi1_b_out_l[0], red_lo1_b_out_l[0], red_hi0_b_out_l[0],red_lo0_b_out_l[0]} = red_read_data[18:0]; | |
1508 | ||
1509 | ||
1510 | ////////////////////////////////////////////////////////////////////////////// | |
1511 | // col redudancy | |
1512 | // hi1, lo1, hi0, lo0 | |
1513 | ||
1514 | //assign cred_mod_lo0[18:0] = cred_mod[18:0]; | |
1515 | //assign cred_mod_hi0[38:19] = cred_mod[38:19]; | |
1516 | //assign cred_mod_lo1[58:39] = cred_mod[58:39]; | |
1517 | //assign cred_mod_hi1[77:59] = cred_mod[77:59]; | |
1518 | ||
1519 | // mux 0+1 | |
1520 | // mux 19 spare | |
1521 | // mux 18 and spare | |
1522 | // mux 38 and 37 | |
1523 | // mux 77 | |
1524 | ||
1525 | ||
1526 | ||
1527 | ||
1528 | endmodule | |
1529 |