source: XOpenSparcT1/trunk/T1-CPU/tlu/sparc_tlu_intctl.v @ 6

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

versione iniziale opensparc

Line 
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T1 Processor File: sparc_tlu_intctl.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_tlu_intctl
24//  Description:       
25//    Contains the code for receiving interrupts from the crossbar,
26//    and sending interrupts out to other processors through the corssbar.
27//    The interrupt receive register (INRR, asi=0x49/VA=0),  incoming
28//    vector register (INVR, asi=0x7f/VA=0x40), and interrupt vector
29//    dispatch register (INDR, asi=0x77/VA=0) are implemented in this
30//    block.  This block also initiates thread reset/wake up when a
31//    reset packet is received. 
32//
33*/
34
35`include "iop.h"
36
37// from intdp.v for now
38`define INT_THR_HI  12
39
40////////////////////////////////////////////////////////////////////////
41// Local header file includes / local defines
42////////////////////////////////////////////////////////////////////////
43`include "tlu.h"
44
45module sparc_tlu_intctl(/*AUTOARG*/
46   // Outputs
47   so, int_rst_l, tlu_ifu_hwint_i3, tlu_ifu_rstthr_i2, tlu_ifu_rstint_i2, 
48   tlu_ifu_nukeint_i2, tlu_ifu_resumint_i2, tlu_ifu_pstate_ie, 
49   int_tlu_longop_done,  inc_ind_ld_int_i1, inc_indr_req_valid, 
50   inc_ind_rstthr_i1, // inc_ind_asi_thr, inc_ind_asi_wr_inrr,
51   // inc_ind_asi_rd_invr, inc_ind_asi_inrr, inc_ind_asi_wr_indr,
52   inc_ind_indr_grant, inc_ind_thr_m, tlu_lsu_int_ld_ill_va_w2,
53   inc_indr_req_thrid, tlu_asi_data_nf_vld_w2, tlu_asi_rdata_mxsel_g, 
54   // Inputs
55   // modified to abide to the Niagara reset methodology
56   // clk, se, si, reset, const_cpuid, lsu_tlu_cpx_vld, lsu_tlu_cpx_req,
57   rclk, se, sehold, si, rst_tri_en, arst_l, grst_l, const_cpuid, 
58   lsu_tlu_cpx_vld, lsu_tlu_cpx_req, lsu_tlu_pcxpkt_ack, tlu_ld_data_vld_g, 
59   ind_inc_thrid_i1, ind_inc_type_i1, tlu_int_asi_vld, tlu_int_asi_load, 
60   tlu_int_asi_store, tlu_int_asi_thrid, tlu_int_asi_state, tlu_int_tid_m, 
61   tlu_int_pstate_ie, int_pending_i2_l, // indr_inc_rst_pkt, tlu_int_redmode, 
62   tlu_asi_queue_rd_vld_g, tlu_va_ill_g); // tlu_flush_all_w2
63
64//
65// modified to abide to the Niagara reset methodology
66//   input            clk, se, si, reset;
67   input            rclk, se, si;
68   input            arst_l, grst_l; 
69   input            sehold; 
70   input            rst_tri_en; 
71   input [3:0]      const_cpuid;
72
73   input            lsu_tlu_cpx_vld;    // cpx from lsu
74   input [3:0]      lsu_tlu_cpx_req;    // cpx req type
75   // the flush bit is included in lsu_tlu_cpx_vld
76   // input         lsu_tlu_cpx_nc;
77   input            lsu_tlu_pcxpkt_ack;
78   
79// removed unused pins
80// input [`INT_THR_HI:0] lsu_tlu_st_rs3_data_g;
81// input            lsu_tlu_pmode;
82// input [3:0]  tlu_int_sftint_pend;
83   
84   input [4:0]  ind_inc_thrid_i1; // connect to lsu_tlu_intpkt[12:8]
85   input [1:0]  ind_inc_type_i1;  // connect to lsu_tlu_intpkt[16]
86
87   input            tlu_int_asi_vld;
88   input            tlu_int_asi_load;  // read enable
89   input            tlu_int_asi_store; // write enable
90   input [1:0]  tlu_int_asi_thrid; // thread making asi request
91   input [7:0]  tlu_int_asi_state; // asi to be read/written
92   // input        tlu_scpd_rd_vld_g; // rdata vld from scratchpad
93   // removed no longer necessary
94   // input        tlu_va_all_zero_g; // va address - all zero
95   input        tlu_va_ill_g;      // illega va range
96   input        tlu_asi_queue_rd_vld_g; // rdata vld from asi queues
97   input        tlu_ld_data_vld_g; // rdata vld from asi queues
98   // input        tlu_flush_all_w2;  // flush pipe from tcl
99
100   input [1:0]  tlu_int_tid_m;
101   
102   input [3:0]  tlu_int_pstate_ie;
103   // input [3:0]       tlu_int_redmode;
104   
105   // from int_dp
106   input [3:0]      int_pending_i2_l;   // uncleared interrupt
107   // input         indr_inc_rst_pkt;
108   // added for timing
109   // input [1:0]       lsu_tlu_rst_pkt;
110
111   output           int_rst_l, so;
112
113   // to ifu
114   output [3:0]     tlu_ifu_hwint_i3;   // interrupt
115   output [3:0]     tlu_ifu_rstthr_i2;  // reset, nuke or resume
116   output           tlu_ifu_rstint_i2;  // reset msg
117   output           tlu_ifu_nukeint_i2; // idle/suspend message
118   output           tlu_ifu_resumint_i2;// resume message
119   output [3:0]     tlu_ifu_pstate_ie;
120   
121   output [3:0]     int_tlu_longop_done;
122//
123// removed - IFU will derive the signal locally
124//   output [3:0]     tlu_ifu_int_activate_i3;// wake up signal for thread
125   
126   // to int_dp
127   output [3:0]     inc_ind_ld_int_i1;          // ld new interrupt
128   output [3:0]     inc_ind_rstthr_i1;          // ld new rst vector
129   
130   // convert the signal back to non-inverting version for grape
131   // output [3:0]     inc_ind_asi_thr_l;          // choose asi op thread
132   // output [3:0]     inc_ind_asi_thr;          // choose asi op thread
133   // output [3:0]     inc_ind_asi_wr_inrr;        // write to INRR (per thread)
134   // output [3:0]     inc_ind_asi_wr_indr;        // write to INDR
135   // output [3:0]     inc_ind_asi_rd_invr;        // read INVR and
136                                                // reset corr. bit in INRR
137   // obsolete output
138   // output        inc_ind_asi_inrr;           // choose which reg to read
139   // convert the signal back to non-inverting version for grape
140   // output [3:0]     inc_ind_indr_grant_l;       // move on to next pcx pkt
141   output [3:0]     inc_ind_indr_grant;       // move on to next pcx pkt
142   // convert the signal back to non-inverting version for grape
143   // output [3:0]     inc_ind_thr_m_l;            // M stage thread
144   output [3:0]     inc_ind_thr_m;            // M stage thread
145   
146   // pcx pkt fields
147   output           inc_indr_req_valid;     // valid bit for PCX int pkt
148   output [1:0] inc_indr_req_thrid;     // thread sending pcx int pkt
149
150   // to tlu
151   // output tlu_lsu_int_ldxa_vld_w2;  // valid asi data from int or scpd
152   output tlu_asi_data_nf_vld_w2;  // valid asi data from int or scpd
153   output tlu_lsu_int_ld_ill_va_w2; // illega va range - load 
154   // to intdp
155   output [3:0] tlu_asi_rdata_mxsel_g; // mux selects to the asi rdata
156
157   // local signals
158   // wire indr_inc_rst_pkt;
159   wire inc_ind_asi_inrr;           // choose which reg to read
160   wire int_tlu_asi_data_vld_g, int_tlu_asi_data_vld_w2;
161   wire int_ld_ill_va_g, int_ld_ill_va_w2;
162   wire hw_int_i1,
163                rst_int_i1,
164                nuke_int_i1,
165                resum_int_i1;
166
167   wire [3:0]       int_thr_i1,
168                    rstthr_i1,
169                    asi_thr;
170
171   wire [3:0]       int_pending_i2;
172//                  int_activate_i2;
173   
174   wire             asi_write, 
175                    asi_read,
176                    asi_invr,
177                    asi_indr;
178   
179   wire [3:0]       indr_vld,
180                    indr_rst,
181                    indr_vld_next,
182                    indr_grant;
183
184   // added for bug 3945
185   wire [3:0] indr_req_vec;
186   wire indr_req_valid_disable;
187
188   // wire [3:0]            int_or_redrst;
189   wire [3:0]       intd_done;
190
191   // wire          red_thread, valid_dest;
192   wire             local_rst;  // local reset
193   wire             local_rst_l;  // local reset
194   wire             clk;        // local clk
195   
196
197   //
198   // Code Starts Here
199   //
200   //=========================================================================================
201   //   reset
202   //=========================================================================================
203
204   dffrl_async dffrl_local_rst_l(
205       .din  (grst_l),
206       .clk  (clk),
207       .rst_l(arst_l),
208       .q    (local_rst_l),
209       .se   (se),
210       .si   (),
211       .so   ()
212   ); 
213   assign local_rst = ~local_rst_l;
214   assign int_rst_l = local_rst_l;
215
216   // create local clk
217   assign clk = rclk; 
218
219   //-------------------------------------
220   // Basic Operation
221   //-------------------------------------
222   sink s1(const_cpuid[3]);
223
224   assign  tlu_ifu_pstate_ie = tlu_int_pstate_ie;
225
226   // process cpx interrupt type
227   // int = 00
228   // the flush bit from cpx packet is now included in the
229   // lsu_tlu_cpx_vld qualification
230   assign  hw_int_i1 = (lsu_tlu_cpx_vld &
231                        // (lsu_tlu_cpx_req == `INT_RET) & ~lsu_tlu_cpx_nc &
232                        (lsu_tlu_cpx_req == `INT_RET) & 
233                        (ind_inc_thrid_i1[4:2] == const_cpuid[2:0])) ?
234                         ~ind_inc_type_i1[1] & ~ind_inc_type_i1[0] :
235                         1'b0;
236   //reset = 01
237   // the flush bit from cpx packet is now included in the
238   // lsu_tlu_cpx_vld qualification
239   assign  rst_int_i1 = (lsu_tlu_cpx_vld &
240                         // (lsu_tlu_cpx_req == `INT_RET) && ~lsu_tlu_cpx_nc &
241                         (lsu_tlu_cpx_req == `INT_RET) &
242                         (ind_inc_thrid_i1[4:2] == const_cpuid[2:0])) ?
243                          ~ind_inc_type_i1[1] & ind_inc_type_i1[0] :
244                          1'b0;
245   // idle/nuke = 10
246   // the flush bit from cpx packet is now included in the
247   // lsu_tlu_cpx_vld qualification
248   assign  nuke_int_i1 = (lsu_tlu_cpx_vld &
249                           // (lsu_tlu_cpx_req == `INT_RET) & ~lsu_tlu_cpx_nc &
250                           (lsu_tlu_cpx_req == `INT_RET) & 
251                           (ind_inc_thrid_i1[4:2] == const_cpuid[2:0])) ?
252                            ind_inc_type_i1[1] & ~ind_inc_type_i1[0] :
253                            1'b0;
254   // resume = 11
255   // the flush bit from cpx packet is now included in the
256   // lsu_tlu_cpx_vld qualification
257   assign  resum_int_i1 = (lsu_tlu_cpx_vld &
258                           // (lsu_tlu_cpx_req == `INT_RET) & ~lsu_tlu_cpx_nc &
259                           (lsu_tlu_cpx_req == `INT_RET) & 
260                           (ind_inc_thrid_i1[4:2] == const_cpuid[2:0])) ?
261                            ind_inc_type_i1[1] & ind_inc_type_i1[0] :
262                            1'b0;
263
264   dffr_s #1  rstint_ff(.din  (rst_int_i1),
265                      .q    (tlu_ifu_rstint_i2),
266                      .clk  (clk),
267//
268// modified to abide to the Niagara reset methodology
269//                    .rst  (reset),
270                      .rst  (local_rst),
271                      .se   (se), .si(), .so());
272   
273   dffr_s #1  nukint_ff(.din  (nuke_int_i1),
274                      .q    (tlu_ifu_nukeint_i2),
275                      .clk  (clk),
276//
277// modified to abide to the Niagara reset methodology
278//                    .rst  (reset),
279                      .rst  (local_rst),
280                      .se   (se), .si(), .so());
281   
282   dffr_s #1  resint_ff(.din  (resum_int_i1),
283                      .q    (tlu_ifu_resumint_i2),
284                      .clk  (clk),
285//
286// modified to abide to the Niagara reset methodology
287//                    .rst  (reset),
288                      .rst  (local_rst),
289                      .se   (se), .si(), .so());
290   
291   // decode int thread id
292   assign  int_thr_i1[0] = ~ind_inc_thrid_i1[1] & ~ind_inc_thrid_i1[0];
293   assign  int_thr_i1[1] = ~ind_inc_thrid_i1[1] &  ind_inc_thrid_i1[0];
294   assign  int_thr_i1[2] =  ind_inc_thrid_i1[1] & ~ind_inc_thrid_i1[0];
295   assign  int_thr_i1[3] =  ind_inc_thrid_i1[1] &  ind_inc_thrid_i1[0];
296
297   assign  inc_ind_ld_int_i1 = {4{hw_int_i1}} & int_thr_i1;
298   assign  inc_ind_rstthr_i1 = {4{rst_int_i1}} & int_thr_i1;
299   assign  rstthr_i1 = {4{rst_int_i1 | nuke_int_i1 | resum_int_i1}} 
300                        & int_thr_i1;
301
302   // decode thr_m
303   // convert the signal back to non-inverting version for grape
304   /*
305   assign  inc_ind_thr_m_l[0] = ~(~tlu_int_tid_m[1] & ~tlu_int_tid_m[0]);
306   assign  inc_ind_thr_m_l[1] = ~(~tlu_int_tid_m[1] &  tlu_int_tid_m[0]);
307   assign  inc_ind_thr_m_l[2] = ~( tlu_int_tid_m[1] & ~tlu_int_tid_m[0]);
308   assign  inc_ind_thr_m_l[3] = ~( tlu_int_tid_m[1] &  tlu_int_tid_m[0]);
309   */
310
311   assign  inc_ind_thr_m[0] = ~tlu_int_tid_m[1] & ~tlu_int_tid_m[0];
312   assign  inc_ind_thr_m[1] = ~tlu_int_tid_m[1] &  tlu_int_tid_m[0];
313   assign  inc_ind_thr_m[2] =  tlu_int_tid_m[1] & ~tlu_int_tid_m[0];
314   assign  inc_ind_thr_m[3] =  tlu_int_tid_m[1] &  tlu_int_tid_m[0];
315   
316
317   // Interrupt continues to be signalled even 1 cycle after read is
318   // done.  This should not be a problem, since the lsu will probably
319   // burn one cycle to complete the read by forwarding it to the reg
320   // file.  Otherwise, just burn another cycle in the IFU before
321   // starting the thread (this is also done right now).
322
323   assign  int_pending_i2 = ~int_pending_i2_l;
324
325   // removed IFU will derive the siganl locally
326   /*
327   assign  int_activate_i2 = ~int_pending_i2_l | tlu_int_sftint_pend;
328   // send message to SWL to wake up thread if it is halted
329   dff_s #4 act_signal_reg(.din (int_activate_i2[3:0]),
330                         .q   (tlu_ifu_int_activate_i3[3:0]),
331                         .clk (clk),
332                         .se  (se), .si(), .so());
333   */
334   
335   // ask IFU to schedule interrupt
336   dff_s #4 int_signal_reg(.din (int_pending_i2[3:0]),
337                         .q   (tlu_ifu_hwint_i3[3:0]),
338                         .clk (clk),
339                         .se  (se), .si(), .so());
340
341   dff_s #4 rst_signal_reg(.din (rstthr_i1[3:0]),
342                         .q   (tlu_ifu_rstthr_i2[3:0]),
343                         .clk (clk),
344                         .se  (se), .si(), .so());
345
346
347   //----------------------------------
348   // ASI Registers
349   //----------------------------------
350   //ASI_INTR_RECEIVE: 0x72
351   //ASI_UDB_INTR_W: 0x73
352   //ASI_UDB_INTR_R: 0x74
353   //ASI_MESSAGE_MASK: 0x7D
354
355   // decode asi thread
356   assign  asi_thr[0] = ~tlu_int_asi_thrid[1] & ~tlu_int_asi_thrid[0];
357   assign  asi_thr[1] = ~tlu_int_asi_thrid[1] &  tlu_int_asi_thrid[0];
358   assign  asi_thr[2] =  tlu_int_asi_thrid[1] & ~tlu_int_asi_thrid[0];
359   assign  asi_thr[3] =  tlu_int_asi_thrid[1] &  tlu_int_asi_thrid[0];
360
361   // convert the signal back to non-inverting version for grape
362   // assign  inc_ind_asi_thr_l = ~asi_thr;
363   // assign  inc_ind_asi_thr = asi_thr;
364   
365   // read or write op
366   assign  asi_write = tlu_int_asi_vld & tlu_int_asi_store;
367   assign  asi_read = tlu_int_asi_vld & tlu_int_asi_load;
368
369   // decode asi target
370   // ASI_INTR_RECEIVE
371   assign inc_ind_asi_inrr = ~tlu_int_asi_state[7] &
372              tlu_int_asi_state[6]  &
373              tlu_int_asi_state[5] &
374              tlu_int_asi_state[4] &
375              ~tlu_int_asi_state[3]  &
376              ~tlu_int_asi_state[2] &
377              tlu_int_asi_state[1] &
378              ~tlu_int_asi_state[0];      // 0x72
379
380   // need to also check if VA=0x40
381   // what else is mapped to this asi?
382   // ASI_UDB_INTR_R
383   assign asi_invr = ~tlu_int_asi_state[7] &
384              tlu_int_asi_state[6]  &
385              tlu_int_asi_state[5]  &
386              tlu_int_asi_state[4]  &
387              ~tlu_int_asi_state[3]  &
388              tlu_int_asi_state[2]  &
389              ~tlu_int_asi_state[1]  &
390              ~tlu_int_asi_state[0];      // 0x74
391
392   // VA<63:19>=0 is not checked
393   // ASI_UDB_INTR_W
394   assign asi_indr = ~tlu_int_asi_state[7] &
395              tlu_int_asi_state[6]  &
396              tlu_int_asi_state[5]  &
397              tlu_int_asi_state[4]  &
398              ~tlu_int_asi_state[3] &
399              ~tlu_int_asi_state[2]  &
400              tlu_int_asi_state[1]  &
401              tlu_int_asi_state[0];      // 0x73
402   /*         
403   // ASI_MESSAGE_MASK_REG
404   // not implemented any more
405   assign  inc_ind_asi_wr_inrr = asi_thr & {4{inc_ind_asi_inrr & asi_write}};
406   assign  inc_ind_asi_wr_indr = asi_thr & {4{asi_indr & asi_write}};
407   assign  inc_ind_asi_rd_invr = asi_thr & {4{asi_invr & asi_read}};
408
409   assign  red_thread = (tlu_int_redmode[0] & asi_thr[0] |
410                         tlu_int_redmode[1] & asi_thr[1] |
411                         tlu_int_redmode[2] & asi_thr[2] |
412                         tlu_int_redmode[3] & asi_thr[3]);
413   */
414   // modified for bug 2109
415   // modified for one-hot mux problem and support of macro test
416   //
417   assign tlu_asi_rdata_mxsel_g[0] = 
418              asi_invr & ~(rst_tri_en | sehold); 
419   assign tlu_asi_rdata_mxsel_g[1] = 
420              inc_ind_asi_inrr & ~(rst_tri_en | asi_invr | sehold);
421   assign tlu_asi_rdata_mxsel_g[2] = 
422              ~((|tlu_asi_rdata_mxsel_g[1:0]) | tlu_asi_rdata_mxsel_g[3]);
423   assign tlu_asi_rdata_mxsel_g[3] = 
424              tlu_asi_queue_rd_vld_g & ~(rst_tri_en | asi_invr | sehold |
425              inc_ind_asi_inrr); 
426   //
427   assign int_tlu_asi_data_vld_g = 
428          ((asi_invr | inc_ind_asi_inrr) & asi_read) | tlu_ld_data_vld_g; 
429           
430
431   dffr_s dffr_int_tlu_asi_data_vld_w2 (
432    .din (int_tlu_asi_data_vld_g),
433    .q   (int_tlu_asi_data_vld_w2),
434    .clk (clk),
435    .rst (local_rst),
436    .se  (1'b0),       
437    .si  (),         
438    .so  ()
439);
440
441// modified for timing
442// assign tlu_lsu_int_ldxa_vld_w2 =
443//            int_tlu_asi_data_vld_w2 & ~tlu_flush_all_w2;
444
445assign tlu_asi_data_nf_vld_w2 = 
446            int_tlu_asi_data_vld_w2; 
447   //
448   // illegal va range
449   //
450   /*
451   assign int_ld_ill_va_g =
452          ((asi_invr | inc_ind_asi_inrr) & asi_read &
453            ~tlu_va_all_zero_g) | tlu_va_ill_g;
454   */
455   assign int_ld_ill_va_g = tlu_va_ill_g; 
456
457   dffr_s dffr_tlu_lsu_int_ld_ill_va_w2 (
458    .din (int_ld_ill_va_g),
459    // .q   (tlu_lsu_int_ld_ill_va_w2),
460    .q   (int_ld_ill_va_w2),
461    .clk (clk),
462    .rst (local_rst),
463    .se  (1'b0),       
464    .si  (),         
465    .so  ()
466);
467
468assign tlu_lsu_int_ld_ill_va_w2 = int_ld_ill_va_w2;
469   // Write to INDR
470   // Can send reset pkt's only in red mode
471   // modified for timing
472   // modified for bug3170
473   /*
474   assign int_or_redrst[3:0] =
475              ({4{~indr_inc_rst_pkt}} | tlu_int_redmode[3:0]) &
476                            asi_thr[3:0];
477
478   assign indr_vld_next[3:0] =
479              inc_ind_asi_wr_indr[3:0] & int_or_redrst[3:0] |  // set
480                  indr_vld[3:0] & ~indr_rst[3:0];         // reset
481   //
482   // original code
483   assign indr_vld_next[3] =
484              (asi_indr & asi_write & asi_thr[3] &
485              (~(|lsu_tlu_rst_pkt[1:0]) | tlu_int_redmode[3])) |
486              (indr_vld[3] & ~indr_rst[3]);
487
488   assign indr_vld_next[2] =
489              (asi_indr & asi_write & asi_thr[2] &
490              (~(|lsu_tlu_rst_pkt[1:0]) | tlu_int_redmode[2])) |
491              (indr_vld[2] & ~indr_rst[2]);
492
493   assign indr_vld_next[1] =
494              (asi_indr & asi_write & asi_thr[1] &
495              (~(|lsu_tlu_rst_pkt[1:0]) | tlu_int_redmode[1])) |
496              (indr_vld[1] & ~indr_rst[1]);
497
498   assign indr_vld_next[0] =
499              (asi_indr & asi_write & asi_thr[0] &
500              (~(|lsu_tlu_rst_pkt[1:0]) | tlu_int_redmode[0])) |
501              (indr_vld[0] & ~indr_rst[0]);
502   */
503   assign indr_vld_next[3] = 
504              (asi_indr & asi_write & asi_thr[3]) |
505              (indr_vld[3] & ~indr_rst[3]); 
506
507   assign indr_vld_next[2] = 
508              (asi_indr & asi_write & asi_thr[2]) |
509              (indr_vld[2] & ~indr_rst[2]); 
510
511   assign indr_vld_next[1] = 
512              (asi_indr & asi_write & asi_thr[1]) |
513              (indr_vld[1] & ~indr_rst[1]); 
514
515   assign indr_vld_next[0] = 
516              (asi_indr & asi_write & asi_thr[0]) |
517              (indr_vld[0] & ~indr_rst[0]); 
518
519   dff_s #4 indr_vld_reg(.din (indr_vld_next[3:0]),
520                       .q   (indr_vld[3:0]),
521                       .clk (clk),
522                       .se  (se), .si(), .so());
523   //
524   // modified for bug 3945
525   dffr_s dffr_indr_req_valid_disable(
526       .din (|indr_vld[3:0]),
527           .q   (indr_req_valid_disable),
528           .clk (clk),
529           .rst  (local_rst | lsu_tlu_pcxpkt_ack), 
530           .se  (se), 
531       .si(), 
532       .so());
533
534   dffe_s #(4) dffe_indr_req_vec(
535       .din (indr_vld_next[3:0]),
536           .q   (indr_req_vec[3:0]),
537       .en  (~indr_req_valid_disable),
538           .clk (clk),
539           .se  (se), 
540       .si(), 
541       .so());
542   
543   // Round robin scheduler for indr request to pcx
544   sparc_ifu_rndrob  indr_sched(
545       // .req_vec (indr_vld[3:0]),
546       .req_vec (indr_req_vec[3:0]),
547           .advance (lsu_tlu_pcxpkt_ack),
548           .rst_tri_enable (rst_tri_en),
549           .clk (clk),
550           .reset  (local_rst),
551           .se  (se),
552           .si (si),
553           .grant_vec (indr_grant[3:0]),
554           .so ());
555
556// convert the signal back to non-inverting version for grape
557// modified to fix one-hot indetermination
558     assign  inc_ind_indr_grant[0] = 
559                 ~(|inc_ind_indr_grant[3:1]);
560     assign  inc_ind_indr_grant[1] = 
561                 indr_grant[1]; 
562     assign  inc_ind_indr_grant[2] = 
563                 indr_grant[2] & ~indr_grant[1];
564     assign  inc_ind_indr_grant[3] = 
565                 indr_grant[3] & ~(|inc_ind_indr_grant[2:1]);
566//
567   assign  indr_rst[3:0] = 
568               {4{local_rst}} | (indr_grant[3:0] & {4{lsu_tlu_pcxpkt_ack}});
569   assign  intd_done[3:0] = 
570               (indr_grant[3:0] & indr_vld[3:0] & {4{lsu_tlu_pcxpkt_ack}});
571
572   dffr_s #(4) intd_reg(
573       .din (intd_done[3:0]),
574           .q   (int_tlu_longop_done[3:0]),
575           .clk (clk),
576           .rst  (local_rst),
577           .se  (se), 
578       .si(), 
579       .so());
580
581   // INDR pcx request control signals
582   // modified for bug 3945
583   // assign  inc_indr_req_valid = (|indr_vld[3:0]) & ~lsu_tlu_pcxpkt_ack;
584   assign  inc_indr_req_valid = indr_req_valid_disable;
585   assign  inc_indr_req_thrid[1] = indr_grant[3] | indr_grant[2];
586   assign  inc_indr_req_thrid[0] = indr_grant[3] | indr_grant[1];
587   
588endmodule // sparc_tlu_intctl
Note: See TracBrowser for help on using the repository browser.