OpenCores
URL https://opencores.org/ocsvn/s1_core/s1_core/trunk

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [sparc_ifu_invctl.v] - Blame information for rev 105

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 95 fafa1971
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: sparc_ifu_invctl.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
//  Module Name: sparc_ifu_invctl
24
//  Description:
25
//  Control logic for handling invalidations to the icache
26
//
27
*/
28
 
29
////////////////////////////////////////////////////////////////////////
30
// Global header file includes
31
////////////////////////////////////////////////////////////////////////
32
 
33
/*
34
/* ========== Copyright Header Begin ==========================================
35
*
36
* OpenSPARC T1 Processor File: iop.h
37
* Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
38
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
39
*
40
* The above named program is free software; you can redistribute it and/or
41
* modify it under the terms of the GNU General Public
42
* License version 2 as published by the Free Software Foundation.
43
*
44
* The above named program is distributed in the hope that it will be
45
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
46
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
47
* General Public License for more details.
48
*
49
* You should have received a copy of the GNU General Public
50
* License along with this work; if not, write to the Free Software
51
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
52
*
53
* ========== Copyright Header End ============================================
54
*/
55
//-*- verilog -*-
56
////////////////////////////////////////////////////////////////////////
57
/*
58
//
59
//  Description:        Global header file that contain definitions that
60
//                      are common/shared at the IOP chip level
61
*/
62
////////////////////////////////////////////////////////////////////////
63
 
64
 
65
// Address Map Defines
66
// ===================
67
 
68
 
69
 
70
 
71
// CMP space
72
 
73
 
74
 
75
// IOP space
76
 
77
 
78
 
79
 
80
                               //`define ENET_ING_CSR     8'h84
81
                               //`define ENET_EGR_CMD_CSR 8'h85
82
 
83
 
84
 
85
 
86
 
87
 
88
 
89
 
90
 
91
 
92
 
93
 
94
 
95
 
96
 
97
// L2 space
98
 
99
 
100
 
101
// More IOP space
102
 
103
 
104
 
105
 
106
 
107
//Cache Crossbar Width and Field Defines
108
//======================================
109
 
110
 
111
 
112
 
113
 
114
 
115
 
116
 
117
 
118
 
119
 
120
 
121
 
122
 
123
 
124
 
125
 
126
 
127
 
128
 
129
 
130
 
131
 
132
 
133
 
134
 
135
 
136
 
137
 
138
 
139
 
140
 
141
 
142
 
143
 
144
 
145
 
146
 
147
 
148
 
149
 
150
 
151
 
152
 
153
 
154
//bits 133:128 are shared by different fields
155
//for different packet types.
156
 
157
 
158
 
159
 
160
 
161
 
162
 
163
 
164
 
165
 
166
 
167
 
168
 
169
 
170
 
171
 
172
 
173
 
174
 
175
 
176
 
177
 
178
 
179
 
180
 
181
 
182
 
183
 
184
 
185
 
186
 
187
 
188
 
189
 
190
 
191
 
192
 
193
 
194
 
195
 
196
 
197
 
198
 
199
 
200
 
201
 
202
 
203
 
204
 
205
 
206
 
207
 
208
 
209
 
210
 
211
 
212
 
213
 
214
 
215
 
216
 
217
 
218
//End cache crossbar defines
219
 
220
 
221
// Number of COS supported by EECU 
222
 
223
 
224
 
225
// 
226
// BSC bus sizes
227
// =============
228
//
229
 
230
// General
231
 
232
 
233
 
234
 
235
// CTags
236
 
237
 
238
 
239
 
240
 
241
 
242
 
243
 
244
 
245
 
246
 
247
 
248
 
249
// reinstated temporarily
250
 
251
 
252
 
253
 
254
// CoS
255
 
256
 
257
 
258
 
259
 
260
 
261
// L2$ Bank
262
 
263
 
264
 
265
// L2$ Req
266
 
267
 
268
 
269
 
270
 
271
 
272
 
273
 
274
 
275
 
276
 
277
 
278
 
279
// L2$ Ack
280
 
281
 
282
 
283
 
284
 
285
 
286
 
287
 
288
// Enet Egress Command Unit
289
 
290
 
291
 
292
 
293
 
294
 
295
 
296
 
297
 
298
 
299
 
300
 
301
 
302
 
303
// Enet Egress Packet Unit
304
 
305
 
306
 
307
 
308
 
309
 
310
 
311
 
312
 
313
 
314
 
315
 
316
 
317
// This is cleaved in between Egress Datapath Ack's
318
 
319
 
320
 
321
 
322
 
323
 
324
 
325
 
326
// Enet Egress Datapath
327
 
328
 
329
 
330
 
331
 
332
 
333
 
334
 
335
 
336
 
337
 
338
 
339
 
340
 
341
 
342
 
343
// In-Order / Ordered Queue: EEPU
344
// Tag is: TLEN, SOF, EOF, QID = 15
345
 
346
 
347
 
348
 
349
 
350
 
351
// Nack + Tag Info + CTag
352
 
353
 
354
 
355
 
356
// ENET Ingress Queue Management Req
357
 
358
 
359
 
360
 
361
 
362
 
363
 
364
 
365
 
366
 
367
 
368
 
369
// ENET Ingress Queue Management Ack
370
 
371
 
372
 
373
 
374
 
375
 
376
 
377
 
378
// Enet Ingress Packet Unit
379
 
380
 
381
 
382
 
383
 
384
 
385
 
386
 
387
 
388
 
389
 
390
 
391
// ENET Ingress Packet Unit Ack
392
 
393
 
394
 
395
 
396
 
397
 
398
 
399
// In-Order / Ordered Queue: PCI
400
// Tag is: CTAG
401
 
402
 
403
 
404
 
405
 
406
// PCI-X Request
407
 
408
 
409
 
410
 
411
 
412
 
413
 
414
 
415
 
416
 
417
 
418
// PCI_X Acknowledge
419
 
420
 
421
 
422
 
423
 
424
 
425
 
426
 
427
 
428
 
429
 
430
//
431
// BSC array sizes
432
//================
433
//
434
 
435
 
436
 
437
 
438
 
439
 
440
 
441
 
442
 
443
 
444
 
445
 
446
// ECC syndrome bits per memory element
447
 
448
 
449
 
450
 
451
//
452
// BSC Port Definitions
453
// ====================
454
//
455
// Bits 7 to 4 of curr_port_id
456
 
457
 
458
 
459
 
460
 
461
 
462
 
463
 
464
// Number of ports of each type
465
 
466
 
467
// Bits needed to represent above
468
 
469
 
470
// How wide the linked list pointers are
471
// 60b for no payload (2CoS)
472
// 80b for payload (2CoS)
473
 
474
//`define BSC_OBJ_PTR   80
475
//`define BSC_HD1_HI    69
476
//`define BSC_HD1_LO    60
477
//`define BSC_TL1_HI    59
478
//`define BSC_TL1_LO    50
479
//`define BSC_CT1_HI    49
480
//`define BSC_CT1_LO    40
481
//`define BSC_HD0_HI    29
482
//`define BSC_HD0_LO    20
483
//`define BSC_TL0_HI    19
484
//`define BSC_TL0_LO    10
485
//`define BSC_CT0_HI     9
486
//`define BSC_CT0_LO     0
487
 
488
 
489
 
490
 
491
 
492
 
493
 
494
 
495
 
496
 
497
 
498
 
499
 
500
 
501
 
502
 
503
 
504
 
505
 
506
 
507
 
508
 
509
 
510
 
511
 
512
 
513
 
514
 
515
 
516
 
517
 
518
 
519
 
520
 
521
// I2C STATES in DRAMctl
522
 
523
 
524
 
525
 
526
 
527
 
528
 
529
//
530
// IOB defines
531
// ===========
532
//
533
 
534
 
535
 
536
 
537
 
538
 
539
 
540
 
541
 
542
 
543
 
544
 
545
 
546
 
547
 
548
 
549
 
550
 
551
 
552
//`define IOB_INT_STAT_WIDTH   32
553
//`define IOB_INT_STAT_HI      31
554
//`define IOB_INT_STAT_LO       0
555
 
556
 
557
 
558
 
559
 
560
 
561
 
562
 
563
 
564
 
565
 
566
 
567
 
568
 
569
 
570
 
571
 
572
 
573
 
574
 
575
 
576
 
577
 
578
 
579
 
580
 
581
 
582
 
583
 
584
 
585
 
586
 
587
 
588
 
589
 
590
 
591
 
592
 
593
 
594
 
595
 
596
 
597
 
598
 
599
 
600
 
601
 
602
 
603
 
604
// fixme - double check address mapping
605
// CREG in `IOB_INT_CSR space
606
 
607
 
608
 
609
 
610
 
611
 
612
 
613
 
614
 
615
 
616
// CREG in `IOB_MAN_CSR space
617
 
618
 
619
 
620
 
621
 
622
 
623
 
624
 
625
 
626
 
627
 
628
 
629
 
630
 
631
 
632
 
633
 
634
 
635
 
636
 
637
 
638
 
639
 
640
 
641
 
642
 
643
 
644
 
645
 
646
 
647
 
648
 
649
 
650
 
651
 
652
 
653
 
654
// Address map for TAP access of SPARC ASI
655
 
656
 
657
 
658
 
659
 
660
 
661
 
662
 
663
 
664
 
665
 
666
 
667
 
668
//
669
// CIOP UCB Bus Width
670
// ==================
671
//
672
//`define IOB_EECU_WIDTH       16  // ethernet egress command
673
//`define EECU_IOB_WIDTH       16
674
 
675
//`define IOB_NRAM_WIDTH       16  // NRAM (RLDRAM previously)
676
//`define NRAM_IOB_WIDTH        4
677
 
678
 
679
 
680
 
681
//`define IOB_ENET_ING_WIDTH   32  // ethernet ingress
682
//`define ENET_ING_IOB_WIDTH    8
683
 
684
//`define IOB_ENET_EGR_WIDTH    4  // ethernet egress
685
//`define ENET_EGR_IOB_WIDTH    4
686
 
687
//`define IOB_ENET_MAC_WIDTH    4  // ethernet MAC
688
//`define ENET_MAC_IOB_WIDTH    4
689
 
690
 
691
 
692
 
693
//`define IOB_BSC_WIDTH         4  // BSC
694
//`define BSC_IOB_WIDTH         4
695
 
696
 
697
 
698
 
699
 
700
 
701
 
702
//`define IOB_CLSP_WIDTH        4  // clk spine unit
703
//`define CLSP_IOB_WIDTH        4
704
 
705
 
706
 
707
 
708
 
709
//
710
// CIOP UCB Buf ID Type
711
// ====================
712
//
713
 
714
 
715
 
716
//
717
// Interrupt Device ID
718
// ===================
719
//
720
// Caution: DUMMY_DEV_ID has to be 9 bit wide
721
//          for fields to line up properly in the IOB.
722
 
723
 
724
 
725
//
726
// Soft Error related definitions 
727
// ==============================
728
//
729
 
730
 
731
 
732
//
733
// CMP clock
734
// =========
735
//
736
 
737
 
738
 
739
 
740
//
741
// NRAM/IO Interface
742
// =================
743
//
744
 
745
 
746
 
747
 
748
 
749
 
750
 
751
 
752
 
753
 
754
//
755
// NRAM/ENET Interface
756
// ===================
757
//
758
 
759
 
760
 
761
 
762
 
763
 
764
 
765
//
766
// IO/FCRAM Interface
767
// ==================
768
//
769
 
770
 
771
 
772
 
773
 
774
 
775
//
776
// PCI Interface
777
// ==================
778
// Load/store size encodings
779
// -------------------------
780
// Size encoding
781
// 000 - byte
782
// 001 - half-word
783
// 010 - word
784
// 011 - double-word
785
// 100 - quad
786
 
787
 
788
 
789
 
790
 
791
 
792
//
793
// JBI<->SCTAG Interface
794
// =======================
795
// Outbound Header Format
796
 
797
 
798
 
799
 
800
 
801
 
802
 
803
 
804
 
805
 
806
 
807
 
808
 
809
 
810
 
811
 
812
 
813
 
814
 
815
 
816
 
817
 
818
 
819
 
820
 
821
 
822
 
823
// Inbound Header Format
824
 
825
 
826
 
827
 
828
 
829
 
830
 
831
 
832
 
833
 
834
 
835
 
836
 
837
 
838
 
839
 
840
 
841
 
842
 
843
 
844
//
845
// JBI->IOB Mondo Header Format
846
// ============================
847
//
848
 
849
 
850
 
851
 
852
 
853
 
854
 
855
 
856
 
857
 
858
 
859
 
860
 
861
 
862
// JBI->IOB Mondo Bus Width/Cycle
863
// ==============================
864
// Cycle  1 Header[15:8]
865
// Cycle  2 Header[ 7:0]
866
// Cycle  3 J_AD[127:120]
867
// Cycle  4 J_AD[119:112]
868
// .....
869
// Cycle 18 J_AD[  7:  0]
870
 
871
 
872
/*
873
/* ========== Copyright Header Begin ==========================================
874
*
875
* OpenSPARC T1 Processor File: ifu.h
876
* Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
877
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
878
*
879
* The above named program is free software; you can redistribute it and/or
880
* modify it under the terms of the GNU General Public
881
* License version 2 as published by the Free Software Foundation.
882
*
883
* The above named program is distributed in the hope that it will be
884
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
885
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
886
* General Public License for more details.
887
*
888
* You should have received a copy of the GNU General Public
889
* License along with this work; if not, write to the Free Software
890
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
891
*
892
* ========== Copyright Header End ============================================
893
*/
894
////////////////////////////////////////////////////////////////////////
895
/*
896
//
897
//  Module Name: ifu.h
898
//  Description:
899
//  All ifu defines
900
*/
901
 
902
//--------------------------------------------
903
// Icache Values in IFU::ICD/ICV/ICT/FDP/IFQDP
904
//--------------------------------------------
905
// Set Values
906
 
907
// IC_IDX_HI = log(icache_size/4ways) - 1
908
 
909
 
910
// !!IMPORTANT!! a change to IC_LINE_SZ will mean a change to the code as
911
//   well.  Unfortunately this has not been properly parametrized.
912
//   Changing the IC_LINE_SZ param alone is *not* enough.
913
 
914
 
915
// !!IMPORTANT!! a change to IC_TAG_HI will mean a change to the code as
916
//   well.  Changing the IC_TAG_HI param alone is *not* enough to
917
//   change the PA range. 
918
// highest bit of PA
919
 
920
 
921
 
922
// Derived Values
923
// 4095
924
 
925
 
926
// number of entries - 1 = 511
927
 
928
 
929
// 12
930
 
931
 
932
// 28
933
 
934
 
935
// 7
936
 
937
 
938
// tags for all 4 ways + parity
939
// 116
940
 
941
 
942
// 115
943
 
944
 
945
 
946
//----------------------------------------------------------------------
947
// For thread scheduler in IFU::DTU::SWL
948
//----------------------------------------------------------------------
949
// thread states:  (thr_state[4:0])
950
 
951
 
952
 
953
 
954
 
955
 
956
 
957
 
958
 
959
// thread configuration register bit fields
960
 
961
 
962
 
963
 
964
 
965
 
966
 
967
//----------------------------------------------------------------------
968
// For MIL fsm in IFU::IFQ
969
//----------------------------------------------------------------------
970
 
971
 
972
 
973
 
974
 
975
 
976
 
977
 
978
 
979
 
980
 
981
//---------------------------------------------------
982
// Interrupt Block
983
//---------------------------------------------------
984
 
985
 
986
 
987
 
988
 
989
 
990
 
991
//-------------------------------------
992
// IFQ
993
//-------------------------------------
994
// valid bit plus ifill
995
 
996
 
997
 
998
 
999
 
1000
 
1001
 
1002
 
1003
 
1004
 
1005
 
1006
 
1007
 
1008
//`ifdef SPARC_L2_64B
1009
 
1010
 
1011
//`else
1012
//`define BANK_ID_HI 8
1013
//`define BANK_ID_LO 7
1014
//`endif
1015
 
1016
//`define CPX_INV_PA_HI  116
1017
//`define CPX_INV_PA_LO  112
1018
 
1019
 
1020
 
1021
 
1022
 
1023
 
1024
 
1025
//----------------------------------------
1026
// IFU Traps
1027
//----------------------------------------
1028
// precise
1029
 
1030
 
1031
 
1032
 
1033
 
1034
 
1035
 
1036
 
1037
 
1038
 
1039
 
1040
 
1041
 
1042
 
1043
 
1044
// disrupting
1045
 
1046
 
1047
 
1048
 
1049
 
1050
 
1051
 
1052
 
1053
module sparc_ifu_invctl(/*AUTOARG*/
1054
   // Outputs
1055
   so, inv_ifc_inv_pending, ifq_icv_wrindex_bf, ifq_icv_wren_bf,
1056
   ifq_ict_dec_wrway_bf, ifq_fcl_invreq_bf, ifq_erb_asiway_f,
1057
   // Inputs
1058
   rclk, se, si, const_cpuid, mbist_icache_write,
1059
   lsu_ifu_ld_icache_index, lsu_ifu_ld_pcxpkt_vld,
1060
   lsu_ifu_ld_pcxpkt_tid, ifc_inv_ifqadv_i2, ifc_inv_asireq_i2,
1061
   ifq_icd_index_bf, ifd_inv_ifqop_i2, ifd_inv_wrway_i2
1062
   );
1063
 
1064
   input        rclk,
1065
                se,
1066
                si;
1067
 
1068
 
1069
   input [2:0]  const_cpuid;
1070
   input        mbist_icache_write;
1071
 
1072
   input [11:5]   lsu_ifu_ld_icache_index;
1073
   input                  lsu_ifu_ld_pcxpkt_vld;
1074
   input [1:0]            lsu_ifu_ld_pcxpkt_tid;
1075
 
1076
   input                  ifc_inv_ifqadv_i2;
1077
   input                  ifc_inv_asireq_i2;
1078
 
1079
   input [11:5]   ifq_icd_index_bf;
1080
   input [145-1:0] ifd_inv_ifqop_i2;
1081
   input [1:0]            ifd_inv_wrway_i2;
1082
 
1083
 
1084
   output                 so;
1085
 
1086
   output                 inv_ifc_inv_pending;
1087
 
1088
   output [11:5]  ifq_icv_wrindex_bf;
1089
   output [15:0]          ifq_icv_wren_bf;
1090
   output [3:0]           ifq_ict_dec_wrway_bf;
1091
   output                 ifq_fcl_invreq_bf;
1092
   output [1:0]           ifq_erb_asiway_f;
1093
 
1094
 
1095
//----------------------------------------------------------------------
1096
//  Local Signals
1097
//----------------------------------------------------------------------
1098
 
1099
   wire [3:0]  cpu_sel,
1100
               invcpu21_sel_i2;
1101
   wire        invcpu0_sel_i2;
1102
 
1103
   wire [1:0]  inv_vec0,
1104
                           inv_vec1;
1105
   wire [1:0]  inv_way0_p1_i2,
1106
                           inv_way0_p0_i2,
1107
                           inv_way1_p1_i2,
1108
                           inv_way1_p0_i2,
1109
               invwd0_way_i2,
1110
               invwd1_way_i2,
1111
               inv0_way_i2,
1112
               inv1_way_i2;
1113
 
1114
   wire [1:0]  asi_way_f;
1115
 
1116
   wire        word0_inv_i2,
1117
               word1_inv_i2;
1118
 
1119
   wire        ldinv_i2,
1120
               ldpkt_i2,
1121
               evpkt_i2,
1122
               stpkt_i2,
1123
               strmack_i2,
1124
               imissrtn_i2;
1125
 
1126
   wire        invreq_i2,
1127
               invalidate_i2,
1128
               invalidate_f;
1129
 
1130
   wire        invall_i2,
1131
               invpa5_i2;
1132
 
1133
   wire [1:0]  cpxthrid_i2;
1134
   wire [3:0]  dcpxthr_i2;
1135
 
1136
   wire [1:0]  ldinv_way_i2;
1137
   wire [1:0]  w0_way_i2,
1138
               w1_way_i2,
1139
               w0_way_f,
1140
               w1_way_f;
1141
 
1142
   wire        pick_wr;
1143
   wire        icv_wrreq_i2;
1144
 
1145
   wire [3:0]  wrt_en_wd_i2,
1146
               wrt_en_wd_bf,
1147
               wrt_en_wd_f;
1148
 
1149
   wire [3:0]  w0_dec_way_i2,
1150
               w1_dec_way_i2;
1151
 
1152
   wire [3:0]  dec_wrway;
1153
 
1154
   wire        icvidx_sel_wr_i2,
1155
               icvidx_sel_ld_i2,
1156
               icvidx_sel_inv_i2;
1157
 
1158
   wire [15:0] wren_i2;
1159
 
1160
 
1161
   wire [11:6] inv_addr_i2;
1162
   wire [11:5] icaddr_i2;
1163
 
1164
   wire                missaddr5_i2;
1165
   wire                missaddr6_i2;
1166
 
1167
 
1168
   wire [3:0]          ldthr,
1169
                       ldidx_sel_new;
1170
 
1171
   wire [11:5] ldinv_addr_i2,
1172
                       ldindex0,
1173
                       ldindex1,
1174
                       ldindex2,
1175
                       ldindex3,
1176
                       ldindex0_nxt,
1177
                       ldindex1_nxt,
1178
                       ldindex2_nxt,
1179
                       ldindex3_nxt;
1180
 
1181
   wire                clk;
1182
 
1183
 
1184
//
1185
// Code Begins Here
1186
//
1187
   assign              clk = rclk;
1188
 
1189
   //----------------------------------------------------------------------
1190
   // Extract Invalidate Packet For This Core
1191
   //----------------------------------------------------------------------
1192
 
1193
   // mux the invalidate vector down to get this processors inv vector
1194
 
1195
   // First ecode cpu id
1196
   assign cpu_sel[0] = ~const_cpuid[2] & ~const_cpuid[1];
1197
   assign cpu_sel[1] = ~const_cpuid[2] &  const_cpuid[1];
1198
   assign cpu_sel[2] =  const_cpuid[2] & ~const_cpuid[1];
1199
   assign cpu_sel[3] =  const_cpuid[2] &  const_cpuid[1];
1200
 
1201
   // 4:1 follwed by 2:1 to get 8:1, to get invalidate way selects
1202
   assign invcpu21_sel_i2 = cpu_sel;
1203
   assign invcpu0_sel_i2 = const_cpuid[0];
1204
 
1205
   // First do word 0 for even processors
1206
   mux4ds #(1)  v0p0_mux(.dout  (inv_vec0[0]),
1207
                                           .in0   (ifd_inv_ifqop_i2[1]),
1208
                                           .in1   (ifd_inv_ifqop_i2[9]),
1209
                                           .in2   (ifd_inv_ifqop_i2[17]),
1210
                                           .in3   (ifd_inv_ifqop_i2[25]),
1211
                                           .sel0 (invcpu21_sel_i2[0]),
1212
                                           .sel1 (invcpu21_sel_i2[1]),
1213
                                           .sel2 (invcpu21_sel_i2[2]),
1214
                                           .sel3 (invcpu21_sel_i2[3]));
1215
 
1216
   mux4ds #(2)  w0p0_mux(.dout (inv_way0_p0_i2[1:0]),
1217
                                           .in0  (ifd_inv_ifqop_i2[3:2]),
1218
                                           .in1  (ifd_inv_ifqop_i2[11:10]),
1219
                                           .in2  (ifd_inv_ifqop_i2[19:18]),
1220
                                           .in3  (ifd_inv_ifqop_i2[27:26]),
1221
                                           .sel0 (invcpu21_sel_i2[0]),
1222
                                           .sel1 (invcpu21_sel_i2[1]),
1223
                                           .sel2 (invcpu21_sel_i2[2]),
1224
                                           .sel3 (invcpu21_sel_i2[3]));
1225
 
1226
   // word 0 for odd processors
1227
   mux4ds #(1)  v0p1_mux(.dout  (inv_vec0[1]),
1228
                                           .in0   (ifd_inv_ifqop_i2[5]),
1229
                                           .in1   (ifd_inv_ifqop_i2[13]),
1230
                                           .in2   (ifd_inv_ifqop_i2[21]),
1231
                                           .in3   (ifd_inv_ifqop_i2[29]),
1232
                                           .sel0 (invcpu21_sel_i2[0]),
1233
                                           .sel1 (invcpu21_sel_i2[1]),
1234
                                           .sel2 (invcpu21_sel_i2[2]),
1235
                                           .sel3 (invcpu21_sel_i2[3]));
1236
 
1237
   mux4ds #(2)  w0p1_mux(.dout (inv_way0_p1_i2[1:0]),
1238
                                           .in0  (ifd_inv_ifqop_i2[7:6]),
1239
                                           .in1  (ifd_inv_ifqop_i2[15:14]),
1240
                                           .in2  (ifd_inv_ifqop_i2[23:22]),
1241
                                           .in3  (ifd_inv_ifqop_i2[31:30]),
1242
                                           .sel0 (invcpu21_sel_i2[0]),
1243
                                           .sel1 (invcpu21_sel_i2[1]),
1244
                                           .sel2 (invcpu21_sel_i2[2]),
1245
                                           .sel3 (invcpu21_sel_i2[3]));
1246
 
1247
 
1248
   // Word 1
1249
   // word 1 for even processors
1250
   mux4ds #(1)  v1p0_mux(.dout  (inv_vec1[0]),
1251
                                           .in0   (ifd_inv_ifqop_i2[57]),
1252
                                           .in1   (ifd_inv_ifqop_i2[65]),
1253
                                           .in2   (ifd_inv_ifqop_i2[73]),
1254
                                           .in3   (ifd_inv_ifqop_i2[81]),
1255
                                           .sel0 (invcpu21_sel_i2[0]),
1256
                                           .sel1 (invcpu21_sel_i2[1]),
1257
                                           .sel2 (invcpu21_sel_i2[2]),
1258
                                           .sel3 (invcpu21_sel_i2[3]));
1259
 
1260
   mux4ds #(2)  w1p0_mux(.dout (inv_way1_p0_i2[1:0]),
1261
                                           .in0  (ifd_inv_ifqop_i2[59:58]),
1262
                                           .in1  (ifd_inv_ifqop_i2[67:66]),
1263
                                           .in2  (ifd_inv_ifqop_i2[75:74]),
1264
                                           .in3  (ifd_inv_ifqop_i2[83:82]),
1265
                                           .sel0 (invcpu21_sel_i2[0]),
1266
                                           .sel1 (invcpu21_sel_i2[1]),
1267
                                           .sel2 (invcpu21_sel_i2[2]),
1268
                                           .sel3 (invcpu21_sel_i2[3]));
1269
 
1270
   // word 1 for odd processors
1271
   mux4ds #(1)  inv_v1p1_mux(.dout  (inv_vec1[1]),
1272
                                               .in0   (ifd_inv_ifqop_i2[61]),
1273
                                               .in1   (ifd_inv_ifqop_i2[69]),
1274
                                               .in2   (ifd_inv_ifqop_i2[77]),
1275
                                               .in3   (ifd_inv_ifqop_i2[85]),
1276
                                               .sel0 (invcpu21_sel_i2[0]),
1277
                                               .sel1 (invcpu21_sel_i2[1]),
1278
                                               .sel2 (invcpu21_sel_i2[2]),
1279
                                               .sel3 (invcpu21_sel_i2[3]));
1280
 
1281
   mux4ds #(2)  w1p1_mux(.dout (inv_way1_p1_i2[1:0]),
1282
                                           .in0  (ifd_inv_ifqop_i2[63:62]),
1283
                                           .in1  (ifd_inv_ifqop_i2[71:70]),
1284
                                           .in2  (ifd_inv_ifqop_i2[79:78]),
1285
                                           .in3  (ifd_inv_ifqop_i2[87:86]),
1286
                                           .sel0 (invcpu21_sel_i2[0]),
1287
                                           .sel1 (invcpu21_sel_i2[1]),
1288
                                           .sel2 (invcpu21_sel_i2[2]),
1289
                                           .sel3 (invcpu21_sel_i2[3]));
1290
 
1291
   // Mux odd and even values down to a single value for word0 and word1
1292
//   dp_mux2es #(1) v0_mux (.dout (word0_inv_i2),
1293
//                                          .in0  (inv_vec0[0]),
1294
//                                          .in1  (inv_vec0[1]),
1295
//                                          .sel  (invcpu0_sel_i2));
1296
   assign word0_inv_i2 = invcpu0_sel_i2 ? inv_vec0[1] : inv_vec0[0];
1297
 
1298
//   dp_mux2es #(2) w0_mux (.dout (invwd0_way_i2[1:0]),
1299
//                                          .in0  (inv_way0_p0_i2[1:0]),
1300
//                                          .in1  (inv_way0_p1_i2[1:0]),
1301
//                                          .sel  (invcpu0_sel_i2));
1302
   assign invwd0_way_i2 = invcpu0_sel_i2 ? inv_way0_p1_i2[1:0] :
1303
                                           inv_way0_p0_i2[1:0];
1304
 
1305
   // word1
1306
//   dp_mux2es #(1) v1_mux (.dout (word1_inv_i2),
1307
//                                          .in0  (inv_vec1[0]),
1308
//                                          .in1  (inv_vec1[1]),
1309
//                                          .sel  (invcpu0_sel_i2));
1310
   assign word1_inv_i2 = invcpu0_sel_i2 ? inv_vec1[1] : inv_vec1[0];
1311
 
1312
//   dp_mux2es #(2) w1_mux (.dout (invwd1_way_i2[1:0]),
1313
//                                          .in0  (inv_way1_p0_i2[1:0]),
1314
//                                          .in1  (inv_way1_p1_i2[1:0]),
1315
//                                          .sel  (invcpu0_sel_i2));
1316
   assign invwd1_way_i2 = invcpu0_sel_i2 ? inv_way1_p1_i2[1:0] :
1317
                                           inv_way1_p0_i2[1:0];
1318
 
1319
   //-----------------------------
1320
   // Decode CPX Packet
1321
   //-----------------------------
1322
   // load
1323
   assign ldpkt_i2 = ({ifd_inv_ifqop_i2[144],
1324
                       ifd_inv_ifqop_i2[143:140]} == {1'b1, 4'b0000}) ?
1325
                       1'b1 : 1'b0;
1326
   assign ldinv_i2 = ldpkt_i2 & ifd_inv_ifqop_i2[133];
1327
   assign ldinv_way_i2= ifd_inv_ifqop_i2[132:131];
1328
 
1329
   // ifill
1330
   assign imissrtn_i2 = ({ifd_inv_ifqop_i2[144],
1331
                          ifd_inv_ifqop_i2[143:140]} == {1'b1, 4'b0001}) ?
1332
                          1'b1 : 1'b0;
1333
 
1334
   // store ack
1335
   assign stpkt_i2 = ({ifd_inv_ifqop_i2[144],
1336
                       ifd_inv_ifqop_i2[143:140]} == {1'b1, 4'b0100}) ?
1337
                       1'b1 : 1'b0;
1338
   assign strmack_i2 = ({ifd_inv_ifqop_i2[144],
1339
                         ifd_inv_ifqop_i2[143:140]} == {1'b1, 4'b0110}) ?
1340
                         1'b1 : 1'b0;
1341
   assign invall_i2 = stpkt_i2 & ifd_inv_ifqop_i2[124] &
1342
                      ifc_inv_ifqadv_i2;
1343
   assign invpa5_i2 = ifd_inv_ifqop_i2[122];
1344
 
1345
   // evict 
1346
   assign evpkt_i2 = ({ifd_inv_ifqop_i2[144],
1347
                       ifd_inv_ifqop_i2[143:140]} == {1'b1, 4'b0011}) ?
1348
                       1'b1 : 1'b0;
1349
 
1350
   // get thread id and decode
1351
   assign  cpxthrid_i2 = ifd_inv_ifqop_i2[135:134];
1352
 
1353
   assign  dcpxthr_i2[0] = ~cpxthrid_i2[1] & ~cpxthrid_i2[0];
1354
   assign  dcpxthr_i2[1] = ~cpxthrid_i2[1] &  cpxthrid_i2[0];
1355
   assign  dcpxthr_i2[2] =  cpxthrid_i2[1] & ~cpxthrid_i2[0];
1356
   assign  dcpxthr_i2[3] =  cpxthrid_i2[1] &  cpxthrid_i2[0];
1357
 
1358
   //-----------------------------------------------
1359
   // Generate Write Way and Write Enables
1360
   //-----------------------------------------------
1361
 
1362
   // decode way for tags
1363
   assign  dec_wrway[0] = ~ifd_inv_wrway_i2[1] & ~ifd_inv_wrway_i2[0];
1364
   assign  dec_wrway[1] = ~ifd_inv_wrway_i2[1] & ifd_inv_wrway_i2[0];
1365
   assign  dec_wrway[2] = ifd_inv_wrway_i2[1] & ~ifd_inv_wrway_i2[0];
1366
   assign  dec_wrway[3] = ifd_inv_wrway_i2[1] & ifd_inv_wrway_i2[0];
1367
 
1368
   assign  ifq_ict_dec_wrway_bf = dec_wrway;
1369
 
1370
   // way for asi
1371
   dff #(2) asiwayf_reg(.din (ifd_inv_wrway_i2),
1372
                                    .q   (asi_way_f),
1373
                                    .clk (clk), .se(se), .si(), .so());
1374
 
1375
   assign  ifq_erb_asiway_f = asi_way_f;
1376
 
1377
 
1378
   // Select which index/way to invalidate
1379
   assign icv_wrreq_i2 = imissrtn_i2 | ifc_inv_asireq_i2 | mbist_icache_write;
1380
 
1381
   assign inv0_way_i2 = ~ifc_inv_ifqadv_i2 ? w0_way_f :
1382
                        ldinv_i2           ? ldinv_way_i2 :
1383
                                             invwd0_way_i2;
1384
   assign inv1_way_i2 = ~ifc_inv_ifqadv_i2 ? w1_way_f :
1385
                        ldinv_i2           ? ldinv_way_i2 :
1386
                                             invwd1_way_i2;
1387
 
1388
   assign pick_wr = (imissrtn_i2 | ifc_inv_asireq_i2) & ifc_inv_ifqadv_i2 |
1389
                     mbist_icache_write;
1390
   assign w0_way_i2 = pick_wr ? ifd_inv_wrway_i2 :
1391
                                inv0_way_i2;
1392
   assign w1_way_i2 = pick_wr ? ifd_inv_wrway_i2 :
1393
                                inv1_way_i2;
1394
 
1395
   dff #(4) wrway_reg(.din ({w0_way_i2, w1_way_i2}),
1396
                      .q   ({w0_way_f, w1_way_f}),
1397
                      .clk (clk), .se(se), .si(), .so());
1398
 
1399
   // determine the way in the ICV we are writing to
1400
//   mux3ds #(2) w0_waymux(.dout  (w0_way_i2),
1401
//                                   .in0   (ifd_inv_wrway_i2[1:0]),
1402
//                                   .in1   (invwd0_way_i2[1:0]),
1403
//                                   .in2   (ldinv_way_i2[1:0]),
1404
//                                   .sel0  (icvidx_sel_wr_i2),
1405
//                                   .sel1  (icvidx_sel_inv_i2),
1406
//                                   .sel2  (icvidx_sel_ld_i2));
1407
 
1408
//   mux3ds #(2) w1_waymux(.dout  (w1_way_i2),
1409
//                                   .in0   (ifd_inv_wrway_i2[1:0]),
1410
//                                   .in1   (invwd1_way_i2[1:0]),
1411
//                                   .in2   (ldinv_way_i2[1:0]),
1412
//                                   .sel0  (icvidx_sel_wr_i2),
1413
//                                   .sel1  (icvidx_sel_inv_i2),
1414
//                                   .sel2  (icvidx_sel_ld_i2));
1415
 
1416
   // decode write way
1417
   assign w0_dec_way_i2[0] = ~w0_way_i2[1] & ~w0_way_i2[0];
1418
   assign w0_dec_way_i2[1] = ~w0_way_i2[1] &  w0_way_i2[0];
1419
   assign w0_dec_way_i2[2] =  w0_way_i2[1] & ~w0_way_i2[0];
1420
   assign w0_dec_way_i2[3] =  w0_way_i2[1] &  w0_way_i2[0];
1421
 
1422
   assign w1_dec_way_i2[0] = ~w1_way_i2[1] & ~w1_way_i2[0];
1423
   assign w1_dec_way_i2[1] = ~w1_way_i2[1] &  w1_way_i2[0];
1424
   assign w1_dec_way_i2[2] =  w1_way_i2[1] & ~w1_way_i2[0];
1425
   assign w1_dec_way_i2[3] =  w1_way_i2[1] &  w1_way_i2[0];
1426
 
1427
 
1428
   // determine if valid bit write to top 32B, bot 32B or both
1429
   assign wrt_en_wd_i2[0] = word0_inv_i2 & (stpkt_i2 | evpkt_i2 |strmack_i2) &
1430
                                           ~inv_addr_i2[6] |
1431
                          ldinv_i2 & ~ldinv_addr_i2[5] & ~ldinv_addr_i2[6] |
1432
                                      icv_wrreq_i2 & ~missaddr5_i2 & ~missaddr6_i2;
1433
 
1434
   assign wrt_en_wd_i2[1] = word1_inv_i2 & (stpkt_i2 | evpkt_i2 |strmack_i2) &
1435
                                           ~inv_addr_i2[6] |
1436
                                              ldinv_i2 & ldinv_addr_i2[5] & ~ldinv_addr_i2[6] |
1437
                                        icv_wrreq_i2 & missaddr5_i2 & ~missaddr6_i2;
1438
 
1439
   assign wrt_en_wd_i2[2] = word0_inv_i2 & (stpkt_i2 | evpkt_i2 |strmack_i2) &
1440
                                           inv_addr_i2[6] |
1441
                          ldinv_i2 & ~ldinv_addr_i2[5] & ldinv_addr_i2[6] |
1442
                                      icv_wrreq_i2 & ~missaddr5_i2 & missaddr6_i2;
1443
 
1444
   assign wrt_en_wd_i2[3] = word1_inv_i2 & (stpkt_i2 | evpkt_i2 |strmack_i2) &
1445
                                           inv_addr_i2[6] |
1446
                                              ldinv_i2 & ldinv_addr_i2[5] & ldinv_addr_i2[6] |
1447
                                        icv_wrreq_i2 & missaddr5_i2 & missaddr6_i2;
1448
 
1449
   assign wrt_en_wd_bf = ifc_inv_ifqadv_i2 ? wrt_en_wd_i2 :
1450
                                              wrt_en_wd_f;
1451
   dff #(4) wrten_reg(.din (wrt_en_wd_bf),
1452
                      .q   (wrt_en_wd_f),
1453
                      .clk (clk), .se(se), .si(), .so());
1454
 
1455
 
1456
   // Final Write Enable to ICV
1457
   assign wren_i2[3:0] = (w0_dec_way_i2 & {4{wrt_en_wd_bf[0]}}) |
1458
                           {4{invall_i2 & ~invpa5_i2 & ~inv_addr_i2[6]}};
1459
 
1460
   assign wren_i2[7:4] = (w1_dec_way_i2 & {4{wrt_en_wd_bf[1]}}) |
1461
                           {4{invall_i2 & invpa5_i2 & ~inv_addr_i2[6]}};
1462
 
1463
   assign wren_i2[11:8] = (w0_dec_way_i2 & {4{wrt_en_wd_bf[2]}}) |
1464
                            {4{invall_i2 & ~invpa5_i2 & inv_addr_i2[6]}};
1465
 
1466
   assign wren_i2[15:12] = (w1_dec_way_i2 & {4{wrt_en_wd_bf[3]}}) |
1467
                             {4{invall_i2 & invpa5_i2 & inv_addr_i2[6]}};
1468
 
1469
   assign ifq_icv_wren_bf = wren_i2;
1470
 
1471
   // advance the wr way for the ICV array
1472
//   mux2ds #(8) wren_mux(.dout  (next_wren_i2),
1473
//                                  .in0   (wren_f),
1474
//                                  .in1   (wren_i2),
1475
//                                  .sel0  (~ifc_ifd_ifqadv_i2),
1476
//                                  .sel1  (ifc_ifd_ifqadv_i2));
1477
 
1478
//   assign wren_bf = ifc_inv_ifqadv_i2 ? wren_i2 : wren_f;
1479
//   dff #(8) icv_weff(.din  (wren_bf),
1480
//                               .q    (wren_f),
1481
//                               .clk  (clk),
1482
//                               .se   (se), .si(), .so());
1483
 
1484
//   assign ifq_icv_wren_bf[7:0] = wren_bf[7:0] & {8{~icvaddr6_i2}};
1485
//   assign ifq_icv_wren_bf[15:8] = wren_bf[7:0] & {8{icvaddr6_i2}};
1486
 
1487
 
1488
   //--------------------------
1489
   // Invalidates
1490
   //--------------------------
1491
   assign invalidate_i2 = (stpkt_i2 | evpkt_i2 | strmack_i2) &
1492
                                              (word0_inv_i2 |
1493
                             word1_inv_i2 |
1494
                                               ifd_inv_ifqop_i2[124]) |  // all ways
1495
                                             ldinv_i2;
1496
 
1497
   mux2ds #(1) invf_mux(.dout (invreq_i2),
1498
                                    .in0  (invalidate_f),
1499
                                    .in1  (invalidate_i2),
1500
                                    .sel0  (~ifc_inv_ifqadv_i2),
1501
                                    .sel1  (ifc_inv_ifqadv_i2));
1502
 
1503
   dff #(1) invf_ff(.din  (invreq_i2),
1504
                                .q    (invalidate_f),
1505
                                .clk  (clk),
1506
                                .se   (se), .si(), .so());
1507
 
1508
   // auto invalidate is done during bist
1509
   // no need to qualify bist_write with ifqadv_i2 since bist is done
1510
   // before anything else. 
1511
   assign ifq_fcl_invreq_bf = invreq_i2 | mbist_icache_write;
1512
 
1513
   // don't really need to OR with invalidate_f, since this will be
1514
   // gone in a cycle 
1515
//   assign inv_ifc_inv_pending = invalidate_i2 | invalidate_f;
1516
   assign inv_ifc_inv_pending = invalidate_i2;
1517
 
1518
   //---------------------------------
1519
   // Get the ifill/invalidation index
1520
   //---------------------------------
1521
 
1522
   // ifill index
1523
   assign icaddr_i2[11:5] = ifq_icd_index_bf[11:5];
1524
   assign missaddr5_i2 = ifq_icd_index_bf[5];
1525
   assign missaddr6_i2 = ifq_icd_index_bf[6];
1526
 
1527
   // evict invalidate index
1528
   //   assign    inv_addr_i2 = ifqop_i2[117:112];
1529
   assign inv_addr_i2 = ifd_inv_ifqop_i2[117:112];
1530
 
1531
   // index for invalidates caused by a load
1532
   // store dcache index when a load req is made
1533
 
1534
   assign ldthr[0] = ~lsu_ifu_ld_pcxpkt_tid[1] & ~lsu_ifu_ld_pcxpkt_tid[0];
1535
   assign ldthr[1] = ~lsu_ifu_ld_pcxpkt_tid[1] &  lsu_ifu_ld_pcxpkt_tid[0];
1536
   assign ldthr[2] =  lsu_ifu_ld_pcxpkt_tid[1] & ~lsu_ifu_ld_pcxpkt_tid[0];
1537
   assign ldthr[3] =  lsu_ifu_ld_pcxpkt_tid[1] &  lsu_ifu_ld_pcxpkt_tid[0];
1538
 
1539
   assign ldidx_sel_new = ldthr & {4{lsu_ifu_ld_pcxpkt_vld}};
1540
 
1541
//   dp_mux2es  #(`IC_IDX_SZ) t0_ldidx_mux(.dout (ldindex0_nxt),
1542
//                                                         .in0  (ldindex0),
1543
//                                                         .in1  (lsu_ifu_ld_icache_index),
1544
//                                                         .sel  (ldidx_sel_new[0]));
1545
   assign ldindex0_nxt = ldidx_sel_new[0] ? lsu_ifu_ld_icache_index :
1546
                                            ldindex0;
1547
 
1548
//   dp_mux2es  #(`IC_IDX_SZ) t1_ldidx_mux(.dout (ldindex1_nxt),
1549
//                                                         .in0  (ldindex1),
1550
//                                                         .in1  (lsu_ifu_ld_icache_index),
1551
//                                                         .sel  (ldidx_sel_new[1]));
1552
   assign ldindex1_nxt = ldidx_sel_new[1] ? lsu_ifu_ld_icache_index :
1553
                                            ldindex1;
1554
 
1555
//   dp_mux2es  #(`IC_IDX_SZ) t2_ldidx_mux(.dout (ldindex2_nxt),
1556
//                                                         .in0  (ldindex2),
1557
//                                                         .in1  (lsu_ifu_ld_icache_index),
1558
//                                                         .sel  (ldidx_sel_new[2]));
1559
   assign ldindex2_nxt = ldidx_sel_new[2] ? lsu_ifu_ld_icache_index :
1560
                                            ldindex2;
1561
 
1562
//   dp_mux2es  #(`IC_IDX_SZ) t3_ldidx_mux(.dout (ldindex3_nxt),
1563
//                                                         .in0  (ldindex3),
1564
//                                                         .in1  (lsu_ifu_ld_icache_index),
1565
//                                                         .sel  (ldidx_sel_new[3]));
1566
   assign ldindex3_nxt = ldidx_sel_new[3] ? lsu_ifu_ld_icache_index :
1567
                                            ldindex3;
1568
 
1569
 
1570
   dff #((11 - 4))  ldix0_reg(.din (ldindex0_nxt),
1571
                                            .q   (ldindex0),
1572
                                            .clk (clk), .se(se), .si(), .so());
1573
   dff #((11 - 4))  ldix1_reg(.din (ldindex1_nxt),
1574
                                            .q   (ldindex1),
1575
                                            .clk (clk), .se(se), .si(), .so());
1576
   dff #((11 - 4))  ldix2_reg(.din (ldindex2_nxt),
1577
                                            .q   (ldindex2),
1578
                                            .clk (clk), .se(se), .si(), .so());
1579
   dff #((11 - 4))  ldix3_reg(.din (ldindex3_nxt),
1580
                                            .q   (ldindex3),
1581
                                            .clk (clk), .se(se), .si(), .so());
1582
 
1583
   // Pick dcache index corresponding to current thread
1584
   mux4ds #((11 - 4)) ldinv_mux(.dout (ldinv_addr_i2),
1585
                                                    .in0  (ldindex0),
1586
                                                    .in1  (ldindex1),
1587
                                                    .in2  (ldindex2),
1588
                                                    .in3  (ldindex3),
1589
                                                    .sel0 (dcpxthr_i2[0]),
1590
                                                    .sel1 (dcpxthr_i2[1]),
1591
                                                    .sel2 (dcpxthr_i2[2]),
1592
                                                    .sel3 (dcpxthr_i2[3]));
1593
 
1594
   // Final Mux for Index
1595
   assign icvidx_sel_wr_i2 = imissrtn_i2 | ifc_inv_asireq_i2 |
1596
                             mbist_icache_write | ~ifc_inv_ifqadv_i2;
1597
   assign icvidx_sel_ld_i2 = ldinv_i2 & ifc_inv_ifqadv_i2;
1598
   assign icvidx_sel_inv_i2 = ~imissrtn_i2 & ~ldinv_i2 &
1599
                              ~ifc_inv_asireq_i2 & ifc_inv_ifqadv_i2 &
1600
                              ~mbist_icache_write;
1601
 
1602
   mux3ds #((11 - 4)) icv_idx_mux(
1603
                            .dout  (ifq_icv_wrindex_bf[11:5]),
1604
                                              .in0   (icaddr_i2[11:5]),
1605
                                              .in1   ({inv_addr_i2[11:6], 1'b0}),
1606
                                              .in2   (ldinv_addr_i2[11:5]),
1607
                                              .sel0  (icvidx_sel_wr_i2),
1608
                                              .sel1  (icvidx_sel_inv_i2),
1609
                                              .sel2  (icvidx_sel_ld_i2));
1610
 
1611
   sink #(145) s0(.in (ifd_inv_ifqop_i2));
1612
 
1613
 
1614
endmodule // sparc_ifu_invctl

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.