1 | // ========== Copyright Header Begin ========================================== |
---|
2 | // |
---|
3 | // OpenSPARC T1 Processor File: bw_r_dcm.v |
---|
4 | // Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. |
---|
5 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. |
---|
6 | // |
---|
7 | // The above named program is free software; you can redistribute it and/or |
---|
8 | // modify it under the terms of the GNU General Public |
---|
9 | // License version 2 as published by the Free Software Foundation. |
---|
10 | // |
---|
11 | // The above named program is distributed in the hope that it will be |
---|
12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
14 | // General Public License for more details. |
---|
15 | // |
---|
16 | // You should have received a copy of the GNU General Public |
---|
17 | // License along with this work; if not, write to the Free Software |
---|
18 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
19 | // |
---|
20 | // ========== Copyright Header End ============================================ |
---|
21 | |
---|
22 | //////////////////////////////////////////////////////////////////////// |
---|
23 | // Local header file includes / local defines |
---|
24 | //////////////////////////////////////////////////////////////////////// |
---|
25 | |
---|
26 | // The Four panels correspond to addr<10:9> decoded. |
---|
27 | |
---|
28 | module bw_r_dcm( /*AUTOARG*/ |
---|
29 | // Outputs |
---|
30 | row_hit, rd_data0, rd_data1, rd_data2, rd_data3, so_0, so_1, |
---|
31 | // Inputs |
---|
32 | cam_en, inv_mask0, inv_mask1, inv_mask2, inv_mask3, si_0, se_0, |
---|
33 | si_1, se_1, sehold_0, sehold_1, rclk, rd_en, rw_addr0, |
---|
34 | rw_addr1, rw_addr2, rw_addr3, rst_l_0, rst_l_1, rst_warm_0, |
---|
35 | rst_warm_1, wr_en, rst_tri_en_0, rst_tri_en_1, wr_data0, wr_data1, |
---|
36 | wr_data2, wr_data3 |
---|
37 | ); |
---|
38 | |
---|
39 | output [31:0] row_hit; |
---|
40 | |
---|
41 | output [31:0] rd_data0; // From panel0 of dcm_panel.v |
---|
42 | output [31:0] rd_data1; // From panel1 of dcm_panel.v |
---|
43 | output [31:0] rd_data2; // From panel2 of dcm_panel.v |
---|
44 | output [31:0] rd_data3; // From panel3 of dcm_panel.v |
---|
45 | |
---|
46 | input [3:0] cam_en; |
---|
47 | |
---|
48 | input [7:0] inv_mask0; // To panel0 of dcm_panel.v |
---|
49 | input [7:0] inv_mask1; // To panel1 of dcm_panel.v |
---|
50 | input [7:0] inv_mask2; // To panel2 of dcm_panel.v |
---|
51 | input [7:0] inv_mask3; // To panel3 of dcm_panel.v |
---|
52 | |
---|
53 | input si_0, se_0; |
---|
54 | output so_0; |
---|
55 | input si_1, se_1; |
---|
56 | output so_1; |
---|
57 | input sehold_0; |
---|
58 | input sehold_1; |
---|
59 | |
---|
60 | input rclk; // To panel0 of dcm_panel.v, ... |
---|
61 | |
---|
62 | input [3:0] rd_en ; // To panel0 of dcm_panel.v |
---|
63 | |
---|
64 | input [5:0] rw_addr0; // To panel0 of dcm_panel.v |
---|
65 | input [5:0] rw_addr1; // To panel1 of dcm_panel.v |
---|
66 | input [5:0] rw_addr2; // To panel2 of dcm_panel.v |
---|
67 | input [5:0] rw_addr3; // To panel3 of dcm_panel.v |
---|
68 | |
---|
69 | input rst_l_0; // To panel0 of dcm_panel.v, ... |
---|
70 | input rst_l_1; // To panel0 of dcm_panel.v, ... |
---|
71 | input rst_warm_0; |
---|
72 | input rst_warm_1; |
---|
73 | |
---|
74 | input [3:0] wr_en; // To panel0 of dcm_panel.v |
---|
75 | input rst_tri_en_0; // used to disable writes during SCAN. |
---|
76 | input rst_tri_en_1; // used to disable writes during SCAN. |
---|
77 | |
---|
78 | input [32:0] wr_data0; // To panel0 of dcm_panel.v |
---|
79 | input [32:0] wr_data1; // To panel1 of dcm_panel.v |
---|
80 | input [32:0] wr_data2; // To panel2 of dcm_panel.v |
---|
81 | input [32:0] wr_data3; // To panel3 of dcm_panel.v |
---|
82 | |
---|
83 | |
---|
84 | wire [31:0] bank1_hit; |
---|
85 | wire [31:0] bank0_hit; |
---|
86 | |
---|
87 | /* dcm_panel_pair AUTO_TEMPLATE ( |
---|
88 | |
---|
89 | .bank_hit(bank0_hit[31:0]), |
---|
90 | .rd_data0(rd_data0[31:0]), |
---|
91 | .rd_data1(rd_data1[31:0]), |
---|
92 | // Inputs |
---|
93 | .cam_en(cam_en[1:0]), |
---|
94 | .inv_mask0(inv_mask0[7:0]), |
---|
95 | .inv_mask1(inv_mask1[7:0]), |
---|
96 | .rclk (rclk), |
---|
97 | .rd_en(rd_en[1:0]), |
---|
98 | .rst_l(rst_l_0), |
---|
99 | .rst_tri_en(rst_tri_en_0), |
---|
100 | .rst_warm(rst_warm_0), |
---|
101 | .rw_addr0(rw_addr0[5:0]), |
---|
102 | .rw_addr1(rw_addr1[5:0]), |
---|
103 | .sehold(sehold_0), |
---|
104 | .wr_data0(wr_data0[32:0]), |
---|
105 | .wr_data1(wr_data1[32:0]), |
---|
106 | .wr_en(wr_en[1:0])); |
---|
107 | |
---|
108 | */ |
---|
109 | |
---|
110 | dcm_panel_pair panel_pair0( |
---|
111 | .so (), |
---|
112 | .si (), |
---|
113 | .se (se_0), |
---|
114 | /*AUTOINST*/ |
---|
115 | // Outputs |
---|
116 | .bank_hit(bank0_hit[31:0]), // Templated |
---|
117 | .rd_data0(rd_data0[31:0]), // Templated |
---|
118 | .rd_data1(rd_data1[31:0]), // Templated |
---|
119 | // Inputs |
---|
120 | .cam_en(cam_en[1:0]), // Templated |
---|
121 | .inv_mask0(inv_mask0[7:0]), // Templated |
---|
122 | .inv_mask1(inv_mask1[7:0]), // Templated |
---|
123 | .rclk (rclk), // Templated |
---|
124 | .rd_en(rd_en[1:0]), // Templated |
---|
125 | .rst_l(rst_l_0), // Templated |
---|
126 | .rst_tri_en(rst_tri_en_0), // Templated |
---|
127 | .rst_warm(rst_warm_0), // Templated |
---|
128 | .rw_addr0(rw_addr0[5:0]), // Templated |
---|
129 | .rw_addr1(rw_addr1[5:0]), // Templated |
---|
130 | .sehold(sehold_0), // Templated |
---|
131 | .wr_data0(wr_data0[32:0]), // Templated |
---|
132 | .wr_data1(wr_data1[32:0]), // Templated |
---|
133 | .wr_en(wr_en[1:0])); // Templated |
---|
134 | |
---|
135 | assign row_hit = bank1_hit | bank0_hit ; |
---|
136 | |
---|
137 | /* dcm_panel_pair AUTO_TEMPLATE ( |
---|
138 | |
---|
139 | .bank_hit(bank1_hit[31:0]), |
---|
140 | .rd_data0(rd_data2[31:0]), |
---|
141 | .rd_data1(rd_data3[31:0]), |
---|
142 | // Inputs |
---|
143 | .cam_en(cam_en[3:2]), |
---|
144 | .inv_mask0(inv_mask2[7:0]), |
---|
145 | .inv_mask1(inv_mask3[7:0]), |
---|
146 | .rclk (rclk), |
---|
147 | .rd_en(rd_en[3:2]), |
---|
148 | .rst_l(rst_l_1), |
---|
149 | .rst_tri_en(rst_tri_en_1), |
---|
150 | .rst_warm(rst_warm_1), |
---|
151 | .rw_addr0(rw_addr2[5:0]), |
---|
152 | .rw_addr1(rw_addr3[5:0]), |
---|
153 | .sehold(sehold_1), |
---|
154 | .wr_data0(wr_data2[32:0]), |
---|
155 | .wr_data1(wr_data3[32:0]), |
---|
156 | .wr_en(wr_en[3:2])); |
---|
157 | |
---|
158 | */ |
---|
159 | |
---|
160 | dcm_panel_pair panel_pair1( |
---|
161 | .so (), |
---|
162 | .si (), |
---|
163 | .se (se_1), |
---|
164 | /*AUTOINST*/ |
---|
165 | // Outputs |
---|
166 | .bank_hit(bank1_hit[31:0]), // Templated |
---|
167 | .rd_data0(rd_data2[31:0]), // Templated |
---|
168 | .rd_data1(rd_data3[31:0]), // Templated |
---|
169 | // Inputs |
---|
170 | .cam_en(cam_en[3:2]), // Templated |
---|
171 | .inv_mask0(inv_mask2[7:0]), // Templated |
---|
172 | .inv_mask1(inv_mask3[7:0]), // Templated |
---|
173 | .rclk(rclk), // Templated |
---|
174 | .rd_en(rd_en[3:2]), // Templated |
---|
175 | .rst_l(rst_l_1), // Templated |
---|
176 | .rst_tri_en(rst_tri_en_1), // Templated |
---|
177 | .rst_warm(rst_warm_1), // Templated |
---|
178 | .rw_addr0(rw_addr2[5:0]), // Templated |
---|
179 | .rw_addr1(rw_addr3[5:0]), // Templated |
---|
180 | .sehold(sehold_1), // Templated |
---|
181 | .wr_data0(wr_data2[32:0]), // Templated |
---|
182 | .wr_data1(wr_data3[32:0]), // Templated |
---|
183 | .wr_en(wr_en[3:2])); // Templated |
---|
184 | |
---|
185 | |
---|
186 | endmodule |
---|
187 | |
---|
188 | |
---|
189 | |
---|
190 | module dcm_panel_pair( /*AUTOARG*/ |
---|
191 | // Outputs |
---|
192 | so, bank_hit, rd_data0, rd_data1, |
---|
193 | // Inputs |
---|
194 | cam_en, inv_mask0, inv_mask1, rclk, rd_en, rst_l, rst_tri_en, |
---|
195 | rst_warm, rw_addr0, rw_addr1, sehold, wr_data0, wr_data1, wr_en, |
---|
196 | si, se |
---|
197 | ); |
---|
198 | |
---|
199 | input [1:0] cam_en; |
---|
200 | input [7:0] inv_mask0; |
---|
201 | input [7:0] inv_mask1; |
---|
202 | input rclk; |
---|
203 | input [1:0] rd_en; |
---|
204 | input rst_l; |
---|
205 | input rst_tri_en; |
---|
206 | input rst_warm; |
---|
207 | input [5:0] rw_addr0; |
---|
208 | input [5:0] rw_addr1; |
---|
209 | input sehold; |
---|
210 | input [32:0] wr_data0; |
---|
211 | input [32:0] wr_data1; |
---|
212 | input [1:0] wr_en; |
---|
213 | input si,se ; |
---|
214 | |
---|
215 | output so; |
---|
216 | output [31:0] bank_hit; |
---|
217 | output [31:0] rd_data0; |
---|
218 | output [31:0] rd_data1; |
---|
219 | |
---|
220 | wire [31:0] lkup_hit0, lkup_hit1; |
---|
221 | reg rst_warm_d; |
---|
222 | |
---|
223 | |
---|
224 | always @(posedge rclk) |
---|
225 | begin |
---|
226 | rst_warm_d <= ( sehold)? rst_warm_d : rst_warm; |
---|
227 | end |
---|
228 | |
---|
229 | /* dcm_panel AUTO_TEMPLATE ( |
---|
230 | .lkup_hit (lkup_hit@[31:0]), |
---|
231 | .rd_data (rd_data@[31:0]), |
---|
232 | .rd_en (rd_en[@]), |
---|
233 | .wr_en (wr_en[@]), |
---|
234 | .cam_en (cam_en[@]), |
---|
235 | .wr_data (wr_data@[32:0]), |
---|
236 | .rw_addr (rw_addr@[5:0]), |
---|
237 | .rst_l (rst_l), |
---|
238 | .rst_warm (rst_warm_d), |
---|
239 | .rst_tri_en (rst_tri_en), |
---|
240 | .sehold (sehold), |
---|
241 | .inv_mask (inv_mask@[7:0])); |
---|
242 | */ |
---|
243 | |
---|
244 | dcm_panel panel0(.si(), |
---|
245 | .so(), |
---|
246 | .se(se), |
---|
247 | /*AUTOINST*/ |
---|
248 | // Outputs |
---|
249 | .lkup_hit(lkup_hit0[31:0]), // Templated |
---|
250 | .rd_data (rd_data0[31:0]), // Templated |
---|
251 | // Inputs |
---|
252 | .rd_en (rd_en[0]), // Templated |
---|
253 | .wr_en (wr_en[0]), // Templated |
---|
254 | .cam_en (cam_en[0]), // Templated |
---|
255 | .wr_data (wr_data0[32:0]), // Templated |
---|
256 | .rw_addr (rw_addr0[5:0]), // Templated |
---|
257 | .inv_mask(inv_mask0[7:0]), // Templated |
---|
258 | .rst_l (rst_l), // Templated |
---|
259 | .rclk (rclk), |
---|
260 | .rst_warm(rst_warm_d), // Templated |
---|
261 | .rst_tri_en(rst_tri_en), // Templated |
---|
262 | .sehold (sehold)); // Templated |
---|
263 | |
---|
264 | assign bank_hit = lkup_hit0 | lkup_hit1 ; |
---|
265 | |
---|
266 | dcm_panel panel1(.si(), |
---|
267 | .so(), |
---|
268 | .se(se), |
---|
269 | /*AUTOINST*/ |
---|
270 | // Outputs |
---|
271 | .lkup_hit(lkup_hit1[31:0]), // Templated |
---|
272 | .rd_data (rd_data1[31:0]), // Templated |
---|
273 | // Inputs |
---|
274 | .rd_en (rd_en[1]), // Templated |
---|
275 | .wr_en (wr_en[1]), // Templated |
---|
276 | .cam_en (cam_en[1]), // Templated |
---|
277 | .wr_data (wr_data1[32:0]), // Templated |
---|
278 | .rw_addr (rw_addr1[5:0]), // Templated |
---|
279 | .inv_mask(inv_mask1[7:0]), // Templated |
---|
280 | .rst_l (rst_l), // Templated |
---|
281 | .rclk (rclk), |
---|
282 | .rst_warm(rst_warm_d), // Templated |
---|
283 | .rst_tri_en(rst_tri_en), // Templated |
---|
284 | .sehold (sehold)); // Templated |
---|
285 | |
---|
286 | |
---|
287 | endmodule |
---|
288 | |
---|
289 | |
---|
290 | //////////////////////////////////////////////////////////////////////// |
---|
291 | // Local header file includes / local defines |
---|
292 | // A directory panel is 32 bits wide and 64 entries deep. |
---|
293 | // The lkup_hit combines the match lines for an even and odd entry pair |
---|
294 | // and hence is only 32 bits wide. |
---|
295 | //////////////////////////////////////////////////////////////////////// |
---|
296 | |
---|
297 | |
---|
298 | module dcm_panel( /*AUTOARG*/ |
---|
299 | // Outputs |
---|
300 | lkup_hit, rd_data, so, |
---|
301 | // Inputs |
---|
302 | rd_en, wr_en, cam_en, wr_data, rw_addr, inv_mask, rst_l, rclk, |
---|
303 | rst_warm, si, se, rst_tri_en, sehold |
---|
304 | ); |
---|
305 | |
---|
306 | |
---|
307 | // Read inputs |
---|
308 | input rd_en; |
---|
309 | input wr_en; |
---|
310 | input cam_en; |
---|
311 | input [32:0] wr_data; // { addr<39:10>, addr<8>, parity, valid } |
---|
312 | |
---|
313 | |
---|
314 | // shared inputs |
---|
315 | input [5:0] rw_addr; // even entries will have wr_data<0> == 0 |
---|
316 | input [7:0] inv_mask; |
---|
317 | |
---|
318 | |
---|
319 | output [31:0] lkup_hit; |
---|
320 | output [31:0] rd_data; // { addr<39:10>, parity, valid } |
---|
321 | |
---|
322 | input rst_l; |
---|
323 | input rclk; |
---|
324 | input rst_warm; |
---|
325 | |
---|
326 | input si, se; |
---|
327 | output so; |
---|
328 | input rst_tri_en; |
---|
329 | input sehold; |
---|
330 | |
---|
331 | |
---|
332 | reg [29:0] addr_array[63:0] ; |
---|
333 | reg [63:0] valid ; |
---|
334 | reg [63:0] parity ; |
---|
335 | reg [29:0] temp_addr0 ; |
---|
336 | reg [29:0] temp_addr1 ; |
---|
337 | reg [31:0] rd_data; |
---|
338 | reg [31:0] lkup_hit; |
---|
339 | reg [63:0] cam_hit; |
---|
340 | |
---|
341 | |
---|
342 | reg [63:0] reset_valid; |
---|
343 | reg [63:0] valid_bit; |
---|
344 | |
---|
345 | reg rd_en_d, wr_en_d; |
---|
346 | reg cam_en_d ; |
---|
347 | reg [7:0] inval_mask_d; |
---|
348 | reg [5:0] rw_addr_d; |
---|
349 | //reg wr_en_off_d1; |
---|
350 | reg rst_tri_en_d1; |
---|
351 | |
---|
352 | |
---|
353 | wire [7:0] inval_mask; |
---|
354 | integer i,j; |
---|
355 | |
---|
356 | always @(posedge rclk) |
---|
357 | begin |
---|
358 | rd_en_d <= (sehold)? rd_en_d: rd_en ; |
---|
359 | wr_en_d <= (sehold)? wr_en_d: wr_en; |
---|
360 | rw_addr_d <= (sehold)? rw_addr_d : rw_addr ; |
---|
361 | cam_en_d <= ( sehold)? cam_en_d: cam_en ; |
---|
362 | inval_mask_d <= ( sehold)? inval_mask_d : inv_mask ; |
---|
363 | |
---|
364 | rst_tri_en_d1 <= rst_tri_en ; // this is a dummy flop only used as a trigger |
---|
365 | end |
---|
366 | |
---|
367 | |
---|
368 | |
---|
369 | //--------\/------------- |
---|
370 | // VALID flop logic |
---|
371 | //--------\/------------- |
---|
372 | always @(posedge rclk) begin |
---|
373 | valid_bit <= valid; |
---|
374 | end |
---|
375 | |
---|
376 | |
---|
377 | reg cam_out; |
---|
378 | |
---|
379 | |
---|
380 | // CAM OPERATION and reset_valid generation |
---|
381 | // the following always block ensures that lkup_hit will be |
---|
382 | // a ph1 signal. |
---|
383 | |
---|
384 | always @( /*AUTOSENSE*/ /*memory or*/ cam_en_d or inval_mask_d or rst_tri_en or |
---|
385 | rst_tri_en_d1 or valid_bit or wr_data or rst_warm or rst_l) |
---|
386 | |
---|
387 | begin |
---|
388 | |
---|
389 | |
---|
390 | cam_out = cam_en_d & ~(rst_tri_en | rst_tri_en_d1) ; |
---|
391 | |
---|
392 | |
---|
393 | |
---|
394 | cam_hit[0] = ( wr_data[32:3] == addr_array[0] ) & |
---|
395 | cam_out & ~wr_data[2] & valid_bit[0] ; |
---|
396 | reset_valid[0] = (cam_hit[0] & inval_mask_d[0]) ; |
---|
397 | cam_hit[1] = ( wr_data[32:3] == addr_array[1] ) & |
---|
398 | cam_out & wr_data[2] & valid_bit[1]; |
---|
399 | reset_valid[1] = (cam_hit[1] & inval_mask_d[0]) ; |
---|
400 | |
---|
401 | lkup_hit[0] = ( cam_hit[0] | cam_hit[1] ) ; |
---|
402 | |
---|
403 | |
---|
404 | |
---|
405 | cam_hit[2] = ( wr_data[32:3] == addr_array[2] ) & |
---|
406 | cam_out & ~wr_data[2] & valid_bit[2] ; |
---|
407 | reset_valid[2] = (cam_hit[2] & inval_mask_d[0]) ; |
---|
408 | cam_hit[3] = ( wr_data[32:3] == addr_array[3] ) & |
---|
409 | cam_out & wr_data[2] & valid_bit[3]; |
---|
410 | reset_valid[3] = (cam_hit[3] & inval_mask_d[0]) ; |
---|
411 | |
---|
412 | lkup_hit[1] = ( cam_hit[2] | cam_hit[3] ); |
---|
413 | |
---|
414 | |
---|
415 | |
---|
416 | cam_hit[4] = ( wr_data[32:3] == addr_array[4] ) & |
---|
417 | cam_out & ~wr_data[2] & valid_bit[4] ; |
---|
418 | reset_valid[4] = (cam_hit[4] & inval_mask_d[0]) ; |
---|
419 | cam_hit[5] = ( wr_data[32:3] == addr_array[5] ) & |
---|
420 | cam_out & wr_data[2] & valid_bit[5]; |
---|
421 | reset_valid[5] = (cam_hit[5] & inval_mask_d[0]) ; |
---|
422 | |
---|
423 | lkup_hit[2] = ( cam_hit[4] | cam_hit[5] ); |
---|
424 | |
---|
425 | |
---|
426 | |
---|
427 | cam_hit[6] = ( wr_data[32:3] == addr_array[6] ) & |
---|
428 | cam_out & ~wr_data[2] & valid_bit[6] ; |
---|
429 | reset_valid[6] = (cam_hit[6] & inval_mask_d[0]) ; |
---|
430 | cam_hit[7] = ( wr_data[32:3] == addr_array[7] ) & |
---|
431 | cam_out & wr_data[2] & valid_bit[7]; |
---|
432 | reset_valid[7] = (cam_hit[7] & inval_mask_d[0]) ; |
---|
433 | |
---|
434 | lkup_hit[3] = ( cam_hit[6] | cam_hit[7] ); |
---|
435 | |
---|
436 | |
---|
437 | |
---|
438 | cam_hit[8] = ( wr_data[32:3] == addr_array[8] ) & |
---|
439 | cam_out & ~wr_data[2] & valid_bit[8] ; |
---|
440 | reset_valid[8] = (cam_hit[8] & inval_mask_d[1]) ; |
---|
441 | cam_hit[9] = ( wr_data[32:3] == addr_array[9] ) & |
---|
442 | cam_out & wr_data[2] & valid_bit[9]; |
---|
443 | reset_valid[9] = (cam_hit[9] & inval_mask_d[1]) ; |
---|
444 | |
---|
445 | lkup_hit[4] = ( cam_hit[8] | cam_hit[9] ); |
---|
446 | |
---|
447 | |
---|
448 | |
---|
449 | cam_hit[10] = ( wr_data[32:3] == addr_array[10] ) & |
---|
450 | cam_out & ~wr_data[2] & valid_bit[10] ; |
---|
451 | reset_valid[10] = (cam_hit[10] & inval_mask_d[1]) ; |
---|
452 | cam_hit[11] = ( wr_data[32:3] == addr_array[11] ) & |
---|
453 | cam_out & wr_data[2] & valid_bit[11]; |
---|
454 | reset_valid[11] = (cam_hit[11] & inval_mask_d[1]) ; |
---|
455 | |
---|
456 | lkup_hit[5] = ( cam_hit[10] | cam_hit[11] ); |
---|
457 | |
---|
458 | |
---|
459 | |
---|
460 | cam_hit[12] = ( wr_data[32:3] == addr_array[12] ) & |
---|
461 | cam_out & ~wr_data[2] & valid_bit[12] ; |
---|
462 | reset_valid[12] = (cam_hit[12] & inval_mask_d[1]) ; |
---|
463 | cam_hit[13] = ( wr_data[32:3] == addr_array[13] ) & |
---|
464 | cam_out & wr_data[2] & valid_bit[13]; |
---|
465 | reset_valid[13] = (cam_hit[13] & inval_mask_d[1]) ; |
---|
466 | |
---|
467 | lkup_hit[6] = ( cam_hit[12] | cam_hit[13] ); |
---|
468 | |
---|
469 | |
---|
470 | |
---|
471 | cam_hit[14] = ( wr_data[32:3] == addr_array[14] ) & |
---|
472 | cam_out & ~wr_data[2] & valid_bit[14] ; |
---|
473 | reset_valid[14] = (cam_hit[14] & inval_mask_d[1]) ; |
---|
474 | cam_hit[15] = ( wr_data[32:3] == addr_array[15] ) & |
---|
475 | cam_out & wr_data[2] & valid_bit[15]; |
---|
476 | reset_valid[15] = (cam_hit[15] & inval_mask_d[1]) ; |
---|
477 | |
---|
478 | lkup_hit[7] = ( cam_hit[14] | cam_hit[15] ); |
---|
479 | |
---|
480 | |
---|
481 | |
---|
482 | cam_hit[16] = ( wr_data[32:3] == addr_array[16] ) & |
---|
483 | cam_out & ~wr_data[2] & valid_bit[16] ; |
---|
484 | reset_valid[16] = (cam_hit[16] & inval_mask_d[2]) ; |
---|
485 | cam_hit[17] = ( wr_data[32:3] == addr_array[17] ) & |
---|
486 | cam_out & wr_data[2] & valid_bit[17]; |
---|
487 | reset_valid[17] = (cam_hit[17] & inval_mask_d[2]) ; |
---|
488 | |
---|
489 | lkup_hit[8] = ( cam_hit[16] | cam_hit[17] ); |
---|
490 | |
---|
491 | |
---|
492 | |
---|
493 | cam_hit[18] = ( wr_data[32:3] == addr_array[18] ) & |
---|
494 | cam_out & ~wr_data[2] & valid_bit[18] ; |
---|
495 | reset_valid[18] = (cam_hit[18] & inval_mask_d[2]) ; |
---|
496 | cam_hit[19] = ( wr_data[32:3] == addr_array[19] ) & |
---|
497 | cam_out & wr_data[2] & valid_bit[19]; |
---|
498 | reset_valid[19] = (cam_hit[19] & inval_mask_d[2]) ; |
---|
499 | |
---|
500 | lkup_hit[9] = ( cam_hit[18] | cam_hit[19] ); |
---|
501 | |
---|
502 | |
---|
503 | |
---|
504 | cam_hit[20] = ( wr_data[32:3] == addr_array[20] ) & |
---|
505 | cam_out & ~wr_data[2] & valid_bit[20] ; |
---|
506 | reset_valid[20] = (cam_hit[20] & inval_mask_d[2]) ; |
---|
507 | cam_hit[21] = ( wr_data[32:3] == addr_array[21] ) & |
---|
508 | cam_out & wr_data[2] & valid_bit[21]; |
---|
509 | reset_valid[21] = (cam_hit[21] & inval_mask_d[2]) ; |
---|
510 | |
---|
511 | lkup_hit[10] = ( cam_hit[20] | cam_hit[21] ); |
---|
512 | |
---|
513 | |
---|
514 | |
---|
515 | cam_hit[22] = ( wr_data[32:3] == addr_array[22] ) & |
---|
516 | cam_out & ~wr_data[2] & valid_bit[22] ; |
---|
517 | reset_valid[22] = (cam_hit[22] & inval_mask_d[2]) ; |
---|
518 | cam_hit[23] = ( wr_data[32:3] == addr_array[23] ) & |
---|
519 | cam_out & wr_data[2] & valid_bit[23]; |
---|
520 | reset_valid[23] = (cam_hit[23] & inval_mask_d[2]) ; |
---|
521 | |
---|
522 | lkup_hit[11] = ( cam_hit[22] | cam_hit[23] ); |
---|
523 | |
---|
524 | |
---|
525 | |
---|
526 | cam_hit[24] = ( wr_data[32:3] == addr_array[24] ) & |
---|
527 | cam_out & ~wr_data[2] & valid_bit[24] ; |
---|
528 | reset_valid[24] = (cam_hit[24] & inval_mask_d[3]) ; |
---|
529 | cam_hit[25] = ( wr_data[32:3] == addr_array[25] ) & |
---|
530 | cam_out & wr_data[2] & valid_bit[25]; |
---|
531 | reset_valid[25] = (cam_hit[25] & inval_mask_d[3]) ; |
---|
532 | |
---|
533 | lkup_hit[12] = ( cam_hit[24] | cam_hit[25] ); |
---|
534 | |
---|
535 | |
---|
536 | |
---|
537 | cam_hit[26] = ( wr_data[32:3] == addr_array[26] ) & |
---|
538 | cam_out & ~wr_data[2] & valid_bit[26] ; |
---|
539 | reset_valid[26] = (cam_hit[26] & inval_mask_d[3]) ; |
---|
540 | cam_hit[27] = ( wr_data[32:3] == addr_array[27] ) & |
---|
541 | cam_out & wr_data[2] & valid_bit[27]; |
---|
542 | reset_valid[27] = (cam_hit[27] & inval_mask_d[3]) ; |
---|
543 | |
---|
544 | lkup_hit[13] = ( cam_hit[26] | cam_hit[27] ); |
---|
545 | |
---|
546 | |
---|
547 | |
---|
548 | cam_hit[28] = ( wr_data[32:3] == addr_array[28] ) & |
---|
549 | cam_out & ~wr_data[2] & valid_bit[28] ; |
---|
550 | reset_valid[28] = (cam_hit[28] & inval_mask_d[3]) ; |
---|
551 | cam_hit[29] = ( wr_data[32:3] == addr_array[29] ) & |
---|
552 | cam_out & wr_data[2] & valid_bit[29]; |
---|
553 | reset_valid[29] = (cam_hit[29] & inval_mask_d[3]) ; |
---|
554 | |
---|
555 | lkup_hit[14] = ( cam_hit[28] | cam_hit[29] ); |
---|
556 | |
---|
557 | |
---|
558 | |
---|
559 | cam_hit[30] = ( wr_data[32:3] == addr_array[30] ) & |
---|
560 | cam_out & ~wr_data[2] & valid_bit[30] ; |
---|
561 | reset_valid[30] = (cam_hit[30] & inval_mask_d[3]) ; |
---|
562 | cam_hit[31] = ( wr_data[32:3] == addr_array[31] ) & |
---|
563 | cam_out & wr_data[2] & valid_bit[31]; |
---|
564 | reset_valid[31] = (cam_hit[31] & inval_mask_d[3]) ; |
---|
565 | |
---|
566 | lkup_hit[15] = ( cam_hit[30] | cam_hit[31] ); |
---|
567 | |
---|
568 | |
---|
569 | |
---|
570 | cam_hit[32] = ( wr_data[32:3] == addr_array[32] ) & |
---|
571 | cam_out & ~wr_data[2] & valid_bit[32] ; |
---|
572 | reset_valid[32] = (cam_hit[32] & inval_mask_d[4]) ; |
---|
573 | cam_hit[33] = ( wr_data[32:3] == addr_array[33] ) & |
---|
574 | cam_out & wr_data[2] & valid_bit[33]; |
---|
575 | reset_valid[33] = (cam_hit[33] & inval_mask_d[4]) ; |
---|
576 | |
---|
577 | lkup_hit[16] = ( cam_hit[32] | cam_hit[33] ); |
---|
578 | |
---|
579 | |
---|
580 | |
---|
581 | cam_hit[34] = ( wr_data[32:3] == addr_array[34] ) & |
---|
582 | cam_out & ~wr_data[2] & valid_bit[34] ; |
---|
583 | reset_valid[34] = (cam_hit[34] & inval_mask_d[4]) ; |
---|
584 | cam_hit[35] = ( wr_data[32:3] == addr_array[35] ) & |
---|
585 | cam_out & wr_data[2] & valid_bit[35]; |
---|
586 | reset_valid[35] = (cam_hit[35] & inval_mask_d[4]) ; |
---|
587 | |
---|
588 | lkup_hit[17] = ( cam_hit[34] | cam_hit[35] ); |
---|
589 | |
---|
590 | |
---|
591 | |
---|
592 | cam_hit[36] = ( wr_data[32:3] == addr_array[36] ) & |
---|
593 | cam_out & ~wr_data[2] & valid_bit[36] ; |
---|
594 | reset_valid[36] = (cam_hit[36] & inval_mask_d[4]) ; |
---|
595 | cam_hit[37] = ( wr_data[32:3] == addr_array[37] ) & |
---|
596 | cam_out & wr_data[2] & valid_bit[37]; |
---|
597 | reset_valid[37] = (cam_hit[37] & inval_mask_d[4]) ; |
---|
598 | |
---|
599 | lkup_hit[18] = ( cam_hit[36] | cam_hit[37] ); |
---|
600 | |
---|
601 | |
---|
602 | |
---|
603 | cam_hit[38] = ( wr_data[32:3] == addr_array[38] ) & |
---|
604 | cam_out & ~wr_data[2] & valid_bit[38] ; |
---|
605 | reset_valid[38] = (cam_hit[38] & inval_mask_d[4]) ; |
---|
606 | cam_hit[39] = ( wr_data[32:3] == addr_array[39] ) & |
---|
607 | cam_out & wr_data[2] & valid_bit[39]; |
---|
608 | reset_valid[39] = (cam_hit[39] & inval_mask_d[4]) ; |
---|
609 | |
---|
610 | lkup_hit[19] = ( cam_hit[38] | cam_hit[39] ); |
---|
611 | |
---|
612 | |
---|
613 | |
---|
614 | cam_hit[40] = ( wr_data[32:3] == addr_array[40] ) & |
---|
615 | cam_out & ~wr_data[2] & valid_bit[40] ; |
---|
616 | reset_valid[40] = (cam_hit[40] & inval_mask_d[5]) ; |
---|
617 | cam_hit[41] = ( wr_data[32:3] == addr_array[41] ) & |
---|
618 | cam_out & wr_data[2] & valid_bit[41]; |
---|
619 | reset_valid[41] = (cam_hit[41] & inval_mask_d[5]) ; |
---|
620 | |
---|
621 | lkup_hit[20] = ( cam_hit[40] | cam_hit[41] ); |
---|
622 | |
---|
623 | |
---|
624 | |
---|
625 | cam_hit[42] = ( wr_data[32:3] == addr_array[42] ) & |
---|
626 | cam_out & ~wr_data[2] & valid_bit[42] ; |
---|
627 | reset_valid[42] = (cam_hit[42] & inval_mask_d[5]) ; |
---|
628 | cam_hit[43] = ( wr_data[32:3] == addr_array[43] ) & |
---|
629 | cam_out & wr_data[2] & valid_bit[43]; |
---|
630 | reset_valid[43] = (cam_hit[43] & inval_mask_d[5]) ; |
---|
631 | |
---|
632 | lkup_hit[21] = ( cam_hit[42] | cam_hit[43] ); |
---|
633 | |
---|
634 | |
---|
635 | |
---|
636 | cam_hit[44] = ( wr_data[32:3] == addr_array[44] ) & |
---|
637 | cam_out & ~wr_data[2] & valid_bit[44] ; |
---|
638 | reset_valid[44] = (cam_hit[44] & inval_mask_d[5]) ; |
---|
639 | cam_hit[45] = ( wr_data[32:3] == addr_array[45] ) & |
---|
640 | cam_out & wr_data[2] & valid_bit[45]; |
---|
641 | reset_valid[45] = (cam_hit[45] & inval_mask_d[5]) ; |
---|
642 | |
---|
643 | lkup_hit[22] = ( cam_hit[44] | cam_hit[45] ); |
---|
644 | |
---|
645 | |
---|
646 | |
---|
647 | cam_hit[46] = ( wr_data[32:3] == addr_array[46] ) & |
---|
648 | cam_out & ~wr_data[2] & valid_bit[46] ; |
---|
649 | reset_valid[46] = (cam_hit[46] & inval_mask_d[5]) ; |
---|
650 | cam_hit[47] = ( wr_data[32:3] == addr_array[47] ) & |
---|
651 | cam_out & wr_data[2] & valid_bit[47]; |
---|
652 | reset_valid[47] = (cam_hit[47] & inval_mask_d[5]) ; |
---|
653 | |
---|
654 | lkup_hit[23] = ( cam_hit[46] | cam_hit[47] ); |
---|
655 | |
---|
656 | |
---|
657 | |
---|
658 | cam_hit[48] = ( wr_data[32:3] == addr_array[48] ) & |
---|
659 | cam_out & ~wr_data[2] & valid_bit[48] ; |
---|
660 | reset_valid[48] = (cam_hit[48] & inval_mask_d[6]) ; |
---|
661 | cam_hit[49] = ( wr_data[32:3] == addr_array[49] ) & |
---|
662 | cam_out & wr_data[2] & valid_bit[49]; |
---|
663 | reset_valid[49] = (cam_hit[49] & inval_mask_d[6]) ; |
---|
664 | |
---|
665 | lkup_hit[24] = ( cam_hit[48] | cam_hit[49] ); |
---|
666 | |
---|
667 | |
---|
668 | |
---|
669 | cam_hit[50] = ( wr_data[32:3] == addr_array[50] ) & |
---|
670 | cam_out & ~wr_data[2] & valid_bit[50] ; |
---|
671 | reset_valid[50] = (cam_hit[50] & inval_mask_d[6]) ; |
---|
672 | cam_hit[51] = ( wr_data[32:3] == addr_array[51] ) & |
---|
673 | cam_out & wr_data[2] & valid_bit[51]; |
---|
674 | reset_valid[51] = (cam_hit[51] & inval_mask_d[6]) ; |
---|
675 | |
---|
676 | lkup_hit[25] = ( cam_hit[50] | cam_hit[51] ); |
---|
677 | |
---|
678 | |
---|
679 | |
---|
680 | cam_hit[52] = ( wr_data[32:3] == addr_array[52] ) & |
---|
681 | cam_out & ~wr_data[2] & valid_bit[52] ; |
---|
682 | reset_valid[52] = (cam_hit[52] & inval_mask_d[6]) ; |
---|
683 | cam_hit[53] = ( wr_data[32:3] == addr_array[53] ) & |
---|
684 | cam_out & wr_data[2] & valid_bit[53]; |
---|
685 | reset_valid[53] = (cam_hit[53] & inval_mask_d[6]) ; |
---|
686 | |
---|
687 | lkup_hit[26] = ( cam_hit[52] | cam_hit[53] ); |
---|
688 | |
---|
689 | |
---|
690 | |
---|
691 | cam_hit[54] = ( wr_data[32:3] == addr_array[54] ) & |
---|
692 | cam_out & ~wr_data[2] & valid_bit[54] ; |
---|
693 | reset_valid[54] = (cam_hit[54] & inval_mask_d[6]) ; |
---|
694 | cam_hit[55] = ( wr_data[32:3] == addr_array[55] ) & |
---|
695 | cam_out & wr_data[2] & valid_bit[55]; |
---|
696 | reset_valid[55] = (cam_hit[55] & inval_mask_d[6]) ; |
---|
697 | |
---|
698 | lkup_hit[27] = ( cam_hit[54] | cam_hit[55] ); |
---|
699 | |
---|
700 | |
---|
701 | |
---|
702 | cam_hit[56] = ( wr_data[32:3] == addr_array[56] ) & |
---|
703 | cam_out & ~wr_data[2] & valid_bit[56] ; |
---|
704 | reset_valid[56] = (cam_hit[56] & inval_mask_d[7]) ; |
---|
705 | cam_hit[57] = ( wr_data[32:3] == addr_array[57] ) & |
---|
706 | cam_out & wr_data[2] & valid_bit[57]; |
---|
707 | reset_valid[57] = (cam_hit[57] & inval_mask_d[7]) ; |
---|
708 | |
---|
709 | lkup_hit[28] = ( cam_hit[56] | cam_hit[57] ); |
---|
710 | |
---|
711 | |
---|
712 | |
---|
713 | cam_hit[58] = ( wr_data[32:3] == addr_array[58] ) & |
---|
714 | cam_out & ~wr_data[2] & valid_bit[58] ; |
---|
715 | reset_valid[58] = (cam_hit[58] & inval_mask_d[7]) ; |
---|
716 | cam_hit[59] = ( wr_data[32:3] == addr_array[59] ) & |
---|
717 | cam_out & wr_data[2] & valid_bit[59]; |
---|
718 | reset_valid[59] = (cam_hit[59] & inval_mask_d[7]) ; |
---|
719 | |
---|
720 | lkup_hit[29] = ( cam_hit[58] | cam_hit[59] ); |
---|
721 | |
---|
722 | |
---|
723 | |
---|
724 | cam_hit[60] = ( wr_data[32:3] == addr_array[60] ) & |
---|
725 | cam_out & ~wr_data[2] & valid_bit[60] ; |
---|
726 | reset_valid[60] = (cam_hit[60] & inval_mask_d[7]) ; |
---|
727 | cam_hit[61] = ( wr_data[32:3] == addr_array[61] ) & |
---|
728 | cam_out & wr_data[2] & valid_bit[61]; |
---|
729 | reset_valid[61] = (cam_hit[61] & inval_mask_d[7]) ; |
---|
730 | |
---|
731 | lkup_hit[30] = ( cam_hit[60] | cam_hit[61] ); |
---|
732 | |
---|
733 | |
---|
734 | |
---|
735 | cam_hit[62] = ( wr_data[32:3] == addr_array[62] ) & |
---|
736 | cam_out & ~wr_data[2] & valid_bit[62] ; |
---|
737 | reset_valid[62] = (cam_hit[62] & inval_mask_d[7]) ; |
---|
738 | cam_hit[63] = ( wr_data[32:3] == addr_array[63] ) & |
---|
739 | cam_out & wr_data[2] & valid_bit[63]; |
---|
740 | reset_valid[63] = (cam_hit[63] & inval_mask_d[7]) ; |
---|
741 | |
---|
742 | lkup_hit[31] = ( cam_hit[62] | cam_hit[63] ); |
---|
743 | |
---|
744 | if( !rst_l | (rst_warm & ~(rst_tri_en | rst_tri_en_d1)) ) begin |
---|
745 | valid = 64'b0; |
---|
746 | end |
---|
747 | |
---|
748 | else if(cam_out) begin |
---|
749 | valid = valid_bit & ~reset_valid; |
---|
750 | end |
---|
751 | |
---|
752 | // else valid = valid ( implicit latch ) |
---|
753 | |
---|
754 | |
---|
755 | end |
---|
756 | |
---|
757 | |
---|
758 | //////////////////////////////////////////////////////////// |
---|
759 | // READ/WRITE OPERATION |
---|
760 | // Phase 1 RD |
---|
761 | //////////////////////////////////////////////////////////// |
---|
762 | |
---|
763 | always @(negedge rclk) begin |
---|
764 | |
---|
765 | if(rd_en_d & ~rst_tri_en) begin |
---|
766 | rd_data = { addr_array[rw_addr_d], |
---|
767 | parity[rw_addr_d] , |
---|
768 | valid_bit[rw_addr_d] |
---|
769 | }; |
---|
770 | `ifdef INNO_MUXEX |
---|
771 | `else |
---|
772 | `ifdef DEFINE_0IN |
---|
773 | `else |
---|
774 | if(wr_en_d) begin |
---|
775 | `ifdef MODELSIM |
---|
776 | $display("L2_DIR_ERR"," rd/wr conflict"); |
---|
777 | `else |
---|
778 | $error("L2_DIR_ERR"," rd/wr conflict"); |
---|
779 | `endif |
---|
780 | end |
---|
781 | `endif |
---|
782 | `endif |
---|
783 | |
---|
784 | end // of if rd_en_d |
---|
785 | |
---|
786 | // WR |
---|
787 | `ifdef DEFINE_0IN |
---|
788 | `else |
---|
789 | if(wr_en_d & ~rst_tri_en ) begin |
---|
790 | // ---- \/ modelling write though behaviour \/------- |
---|
791 | rd_data = { wr_data[32:3], |
---|
792 | wr_data[1] , |
---|
793 | wr_data[0] |
---|
794 | }; |
---|
795 | |
---|
796 | parity[rw_addr_d] = wr_data[1] ; |
---|
797 | valid[rw_addr_d] = wr_data[0] ; |
---|
798 | addr_array[rw_addr_d] = wr_data[32:3] ; |
---|
799 | |
---|
800 | `ifdef INNO_MUXEX |
---|
801 | `else |
---|
802 | if(cam_en_d) begin |
---|
803 | `ifdef MODELSIM |
---|
804 | $display("L2_DIR_ERR"," cam/wr conflict"); |
---|
805 | `else |
---|
806 | $error("L2_DIR_ERR"," cam/wr conflict"); |
---|
807 | `endif |
---|
808 | end |
---|
809 | `endif |
---|
810 | |
---|
811 | end |
---|
812 | `endif |
---|
813 | |
---|
814 | |
---|
815 | //if( !rst_l | (rst_warm & ~rst_tri_en) ) valid = 64'b0; |
---|
816 | //else valid = valid & ~reset_valid; |
---|
817 | |
---|
818 | end |
---|
819 | |
---|
820 | |
---|
821 | |
---|
822 | |
---|
823 | `ifdef DEFINE_0IN |
---|
824 | always @(posedge rclk) |
---|
825 | begin |
---|
826 | if(!rst_l) begin // rst_l all valid bits |
---|
827 | valid_bit = 64'b0 ; |
---|
828 | end else if(~rd_en_d & wr_en_d) begin |
---|
829 | addr_array[rw_addr_d] = wr_data[32:3] ; |
---|
830 | parity[rw_addr_d] = wr_data[1] ; |
---|
831 | valid_bit[rw_addr_d] = wr_data[0] ; |
---|
832 | end |
---|
833 | end |
---|
834 | `endif |
---|
835 | |
---|
836 | |
---|
837 | |
---|
838 | |
---|
839 | |
---|
840 | |
---|
841 | endmodule |
---|