source: XOpenSparcT1/trunk/T1-common/srams/bw_r_dcm.v @ 6

Revision 6, 31.7 KB checked in by pntsvt00, 13 years ago (diff)

versione iniziale opensparc

Line 
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
28module 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
39output  [31:0]  row_hit;
40
41output [31:0]         rd_data0;               // From panel0 of dcm_panel.v
42output [31:0]         rd_data1;               // From panel1 of dcm_panel.v
43output [31:0]         rd_data2;               // From panel2 of dcm_panel.v
44output [31:0]         rd_data3;               // From panel3 of dcm_panel.v
45
46input   [3:0]         cam_en;
47
48input [7:0]           inv_mask0;              // To panel0 of dcm_panel.v
49input [7:0]           inv_mask1;              // To panel1 of dcm_panel.v
50input [7:0]           inv_mask2;              // To panel2 of dcm_panel.v
51input [7:0]           inv_mask3;              // To panel3 of dcm_panel.v
52
53input                 si_0, se_0;
54output                so_0;
55input                 si_1, se_1;
56output                so_1;
57input                 sehold_0;
58input                 sehold_1;
59
60input                 rclk;                   // To panel0 of dcm_panel.v, ...
61
62input  [3:0]          rd_en ;           // To panel0 of dcm_panel.v
63
64input [5:0]           rw_addr0;      // To panel0 of dcm_panel.v
65input [5:0]           rw_addr1;      // To panel1 of dcm_panel.v
66input [5:0]           rw_addr2;      // To panel2 of dcm_panel.v
67input [5:0]           rw_addr3;      // To panel3 of dcm_panel.v
68
69input                 rst_l_0;                  // To panel0 of dcm_panel.v, ...
70input                 rst_l_1;                  // To panel0 of dcm_panel.v, ...
71input                 rst_warm_0;
72input                 rst_warm_1;
73
74input   [3:0]         wr_en;            // To panel0 of dcm_panel.v
75input                 rst_tri_en_0; // used to disable writes during SCAN.
76input                 rst_tri_en_1; // used to disable writes during SCAN.
77
78input [32:0]          wr_data0;         // To panel0 of dcm_panel.v
79input [32:0]          wr_data1;         // To panel1 of dcm_panel.v
80input [32:0]          wr_data2;         // To panel2 of dcm_panel.v
81input [32:0]          wr_data3;         // To panel3 of dcm_panel.v
82
83
84wire    [31:0]  bank1_hit;
85wire    [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
186endmodule
187
188
189
190module 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
199input [1:0]             cam_en;                 
200input [7:0]             inv_mask0;             
201input [7:0]             inv_mask1;             
202input                   rclk;                   
203input [1:0]             rd_en;                 
204input                   rst_l;               
205input                   rst_tri_en;           
206input                   rst_warm;             
207input [5:0]             rw_addr0;               
208input [5:0]             rw_addr1;               
209input                   sehold;               
210input [32:0]            wr_data0;               
211input [32:0]            wr_data1;               
212input [1:0]             wr_en;                 
213input                   si,se ;
214
215output                  so;
216output [31:0]           bank_hit;             
217output [31:0]           rd_data0;               
218output [31:0]           rd_data1;               
219
220wire    [31:0]  lkup_hit0, lkup_hit1;
221reg     rst_warm_d;
222
223
224always  @(posedge rclk)
225begin
226        rst_warm_d <= ( sehold)? rst_warm_d : rst_warm;
227end
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
287endmodule
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
298module 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
308input           rd_en;
309input           wr_en;
310input           cam_en;
311input   [32:0]  wr_data; // { addr<39:10>, addr<8>, parity, valid  }
312
313
314// shared inputs
315input   [5:0]   rw_addr; // even entries will have wr_data<0> == 0
316input   [7:0]   inv_mask;
317
318
319output  [31:0]  lkup_hit;
320output  [31:0]  rd_data; // { addr<39:10>, parity, valid }
321
322input           rst_l;
323input           rclk;
324input           rst_warm;
325
326input           si, se;
327output          so;
328input           rst_tri_en;
329input           sehold;
330
331
332reg     [29:0]  addr_array[63:0]        ;
333reg     [63:0]  valid   ;
334reg     [63:0]  parity  ;
335reg     [29:0]  temp_addr0 ;
336reg     [29:0]  temp_addr1 ;
337reg     [31:0]  rd_data;
338reg     [31:0]  lkup_hit;
339reg     [63:0]  cam_hit;
340
341
342reg     [63:0]  reset_valid;
343reg     [63:0]  valid_bit;
344
345reg             rd_en_d, wr_en_d;
346reg             cam_en_d ;
347reg     [7:0]   inval_mask_d;
348reg     [5:0]   rw_addr_d;
349//reg   wr_en_off_d1;
350reg     rst_tri_en_d1;
351
352
353wire    [7:0]   inval_mask;
354integer i,j;
355
356always  @(posedge rclk)
357begin
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
365end
366
367
368
369//--------\/-------------
370// VALID flop logic
371//--------\/-------------
372always  @(posedge rclk) begin
373                valid_bit <= valid;
374end
375       
376
377reg     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
384always  @( /*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
755end
756
757       
758////////////////////////////////////////////////////////////
759// READ/WRITE  OPERATION
760// Phase 1 RD
761////////////////////////////////////////////////////////////
762
763always @(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
818end
819
820
821
822
823`ifdef DEFINE_0IN
824always  @(posedge rclk)
825begin
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
833end
834`endif
835
836
837
838
839
840       
841endmodule
Note: See TracBrowser for help on using the repository browser.