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

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

versione iniziale opensparc

Line 
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T1 Processor File: tlu_hyperv.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//      Description:    Block that contain most of the Hypervisor support
24//                      additions
25*/
26////////////////////////////////////////////////////////////////////////
27// Global header file includes
28////////////////////////////////////////////////////////////////////////
29`include        "sys.h" // system level definition file which contains the
30                        // time scale definition
31
32`include "tlu.h"
33
34////////////////////////////////////////////////////////////////////////
35// Local header file includes / local defines
36////////////////////////////////////////////////////////////////////////
37
38module  tlu_hyperv (/*AUTOARG*/
39    // outputs
40    tlu_htickcmp_rw_e, tlu_gl_rw_m, tlu_hpstate_din_sel0, tlu_hpstate_din_sel1,
41    tlu_hpstate_din_sel2, tlu_hpstate_din_sel3, tlu_update_hpstate_l_w2,
42    tlu_htickcmp_intdis, tlu_gl_lvl0, tlu_gl_lvl1, tlu_gl_lvl2, tlu_gl_lvl3, 
43    tlu_htstate_rw_d, tlu_wr_hintp_g, tlu_htstate_rw_g, tlu_set_hintp_sel_g, 
44    tlu_htba_en_l, tlu_scpd_wr_addr_g, tlu_scpd_wr_vld_g, tlu_scpd_rd_vld_m, 
45    tlu_scpd_rd_addr_m, tlu_hscpd_dacc_excpt_m, tlu_hyperv_rdpr_sel, 
46    tlu_exu_agp_swap, tlu_exu_agp, tlu_cpu_mondo_cmp, tlu_dev_mondo_cmp, 
47    tlu_resum_err_cmp, tlu_asi_queue_rd_vld_g, tlu_asi_queue_data_g, tlu_ld_data_vld_g, 
48    tlu_va_ill_g, tlu_asi_queue_rdata_g, tlu_qtail_dacc_excpt_m, tlu_asi_write_g, so, 
49    inc_ind_asi_wr_indr, inc_ind_asi_wr_inrr, inc_ind_asi_rd_invr, tlu_local_thrid_g, 
50    // inputs
51    ifu_tlu_thrid_d, ifu_tlu_sraddr_d, tlu_wsr_data_w_global, tlu_tickcmp_sel, 
52    tlu_thrd_traps_w2, tlu_wsr_inst_nq_g, tlu_dnrtry0_inst_g, tlu_dnrtry1_inst_g, 
53    tlu_dnrtry2_inst_g, tlu_dnrtry3_inst_g, tlu_dnrtry_global_g, tlu_tick_ctl_din, 
54    tlu_pstate_priv, tlu_select_tba_w2, tlu_hpstate_priv, tlu_hpstate_enb, 
55    tlu_asi_state_e, ifu_lsu_alt_space_e, ifu_lsu_ld_inst_e, ifu_lsu_st_inst_e, 
56    lsu_tlu_early_flush_w, tlu_por_rstint_g, tlu_agp_tid_w2, // exu_lsu_ldst_va_e,
57    tlu_local_flush_w, ifu_tlu_flush_fd_w, tlu_inst_vld_m, tlu_lsu_int_ldxa_vld_w2,
58    tlu_asi_data_nf_vld_w2, lsu_tlu_ldst_va_m, arst_l, grst_l, rst_tri_en, 
59    si, se, rclk);
60
61//=================================================
62// output
63//=================================================
64// mux select to tdp to access the hyper-privileged ASR registers
65output tlu_htickcmp_rw_e;
66output tlu_gl_rw_m;
67// output tlu_gl_rw_g;
68
69// global switch indicator - used to be in tlu_tcl
70output [1:0] tlu_exu_agp; 
71// output [1:0] tlu_exu_agp_tid; 
72output tlu_exu_agp_swap; 
73//
74// global register outputs
75output [`TSA_GLOBAL_WIDTH-1:0] tlu_gl_lvl0; // global register value t0
76output [`TSA_GLOBAL_WIDTH-1:0] tlu_gl_lvl1; // global register value t1
77output [`TSA_GLOBAL_WIDTH-1:0] tlu_gl_lvl2; // global register value t2
78output [`TSA_GLOBAL_WIDTH-1:0] tlu_gl_lvl3; // global register value t3
79
80// mux selects to choose source of data to store in the hpstate regs
81output [1:0] tlu_hpstate_din_sel0;
82output [1:0] tlu_hpstate_din_sel1;
83output [1:0] tlu_hpstate_din_sel2;
84output [1:0] tlu_hpstate_din_sel3;
85//
86// mux selects to read out the ASR registers
87// output [3:0] tlu_rdpr_mx5_sel;
88output [4:0] tlu_hyperv_rdpr_sel; 
89// signal indicating mx5 is used
90// output       tlu_rdpr_mx5_active;
91//
92// hpstate write enable
93// modified for timing
94// output [`TLU_THRD_NUM-1:0] tlu_update_hpstate_l_g;
95output [`TLU_THRD_NUM-1:0] tlu_update_hpstate_l_w2;
96//
97// htick compare reg write enable
98// output [`TLU_THRD_NUM-1:0] htickcmp_intdis_en;
99// htick compare interrupt disable
100output tlu_htickcmp_intdis;
101
102//  clock enable for hintp regs.
103// output [`TLU_THRD_NUM-1:0] tlu_hintp_en_l_g;
104// wr control for hintp regs.
105output [`TLU_THRD_NUM-1:0] tlu_wr_hintp_g;         
106// set control for hintp regs.
107// output [`TLU_THRD_NUM-1:0] tlu_set_hintp_g;
108output [`TLU_THRD_NUM-1:0] tlu_set_hintp_sel_g;
109//
110// update enable for the htba registers
111output [`TLU_THRD_NUM-1:0] tlu_htba_en_l;
112//
113// hypervisor lite indicator
114// output [`TLU_THRD_NUM-1:0] tlu_hyper_lite;
115//
116// hyper-privileged scratch-pad data access exception
117output tlu_hscpd_dacc_excpt_m;
118//
119// store instruction to alt space
120output tlu_asi_write_g;
121output [`TLU_THRD_NUM-1:0] inc_ind_asi_wr_indr;
122output [`TLU_THRD_NUM-1:0] inc_ind_asi_wr_inrr;
123output [`TLU_THRD_NUM-1:0] inc_ind_asi_rd_invr;
124output [`TLU_THRD_NUM-1:0] tlu_local_thrid_g;
125
126// read and write valids for the scratch-pad
127output tlu_scpd_rd_vld_m, tlu_scpd_wr_vld_g;
128output [`SCPD_RW_ADDR_WIDTH-1:0] tlu_scpd_wr_addr_g;
129output [`SCPD_RW_ADDR_WIDTH-1:0] tlu_scpd_rd_addr_m;
130//
131// decode of the htstate register write/read
132output tlu_htstate_rw_d; 
133output tlu_htstate_rw_g; 
134//
135// select for rdpr read in tlu_tdp
136// output tlu_htba_rsr_sel;
137//
138//
139output [`TLU_THRD_NUM-1:0] tlu_cpu_mondo_cmp; 
140output [`TLU_THRD_NUM-1:0] tlu_dev_mondo_cmp; 
141output [`TLU_THRD_NUM-1:0] tlu_resum_err_cmp; 
142output tlu_qtail_dacc_excpt_m; 
143//
144// asi queue rdata output
145output [`TLU_ASI_QUE_WIDTH-1:0] tlu_asi_queue_rdata_g;
146output tlu_asi_queue_rd_vld_g;
147output tlu_ld_data_vld_g;
148// output tlu_scpd_rd_vld_g;
149output tlu_va_ill_g;
150// output tlu_va_all_zero_g;
151output tlu_lsu_int_ldxa_vld_w2;
152//
153// global nets
154output so;
155
156//=================================================
157// input
158//=================================================
159// non-thread specific por reset indicator
160// modified for timing
161// input [1:0] ifu_tlu_thrid_e;
162input [1:0] ifu_tlu_thrid_d; 
163//
164// staged write asr instruction
165// modified for timing
166// input tlu_wsr_inst_g;
167input tlu_wsr_inst_nq_g;
168
169// non-threaded por instruciton
170input [`TLU_THRD_NUM-1:0] tlu_por_rstint_g;
171//
172// addr of sr(st/pr)
173input [`TLU_ASR_ADDR_WIDTH-1:0] ifu_tlu_sraddr_d;     
174//
175// staged pr/st data from irf.
176input [`TLU_GLOBAL_WIDTH-1:0] tlu_wsr_data_w_global; 
177
178// restored global value for done/retry instructions
179input [`TSA_GLOBAL_WIDTH-1:0] tlu_dnrtry_global_g;
180
181// thread specific done and retry signals
182input tlu_dnrtry0_inst_g, tlu_dnrtry1_inst_g;
183input tlu_dnrtry2_inst_g, tlu_dnrtry3_inst_g;
184//
185// thread specific trap assetion signals
186// modified due to timing
187// input tlu_thrd0_traps, tlu_thrd1_traps;
188// input tlu_thrd2_traps, tlu_thrd3_traps;
189input [`TLU_THRD_NUM-1:0] tlu_thrd_traps_w2; 
190//
191// indicating whether the trap is supervisor or hypervisor
192// added for bug 2889
193// modified due to timing
194// input tlu_select_tba_g;
195input tlu_select_tba_w2; 
196//
197input tlu_tick_ctl_din;
198// htick compare match
199// input tlu_htick_match;       
200//
201// select src for tickcmp
202input [`TLU_THRD_NUM-1:0] tlu_tickcmp_sel;   
203//
204// pstate - supervisor privilege 
205input [`TLU_THRD_NUM-1:0] tlu_pstate_priv;   
206// hpstate - hypervisor privilege 
207input [`TLU_THRD_NUM-1:0] tlu_hpstate_priv;   
208// hpstate - hypervisor lite enb 
209input [`TLU_THRD_NUM-1:0] tlu_hpstate_enb;   
210// thread id for the agp that needs swap
211// modified for timing
212// input [1:0] tlu_agp_tid_g;
213input [1:0] tlu_agp_tid_w2;
214// ASI addresses and valid bits for decode to
215// access the ASI registers
216input       ifu_lsu_alt_space_e; // valid bit for the ASI data
217input       ifu_lsu_ld_inst_e;  // read enable
218input       ifu_lsu_st_inst_e;  // write enable
219// replaced due to timing violations
220// input            tlu_nlsu_flush_w;   // trap flush
221input       tlu_local_flush_w;   // trap flush
222input       ifu_tlu_flush_fd_w;   // trap flush
223input       lsu_tlu_early_flush_w;   // trap flush
224input       tlu_asi_data_nf_vld_w2;   // trap flush
225input       tlu_inst_vld_m;     // instruciton valid
226//
227// asi to be read/written
228input [`TLU_ASI_STATE_WIDTH-1:0] tlu_asi_state_e; 
229// input [`TLU_ASI_VA_WIDTH-1:0] exu_lsu_ldst_va_e; 
230input [`TLU_ASI_VA_WIDTH-1:0] lsu_tlu_ldst_va_m; 
231// head and tail pointers
232input [`TLU_ASI_QUE_WIDTH-1:0] tlu_asi_queue_data_g;
233
234//reset
235// input tlu_rst_l;  // unit reset
236input grst_l ;  // unit reset
237input arst_l ;  // unit reset
238input rst_tri_en ;  // unit reset
239//clk
240input rclk;
241//
242// global nets
243input si, se;
244
245/*AUTOOUTPUT*/
246//
247// staged thread id
248wire [1:0] thrid_e, thrid_m, thrid_g;
249// decoded thread id
250wire [`TLU_THRD_NUM-1:0] thread_sel_id_e; 
251wire [`TLU_THRD_NUM-1:0] thread_sel_id_m; 
252wire [`TLU_THRD_NUM-1:0] thread_sel_id_g; 
253wire [`TLU_THRD_NUM-1:0] thread_sel_id_w2; 
254//
255// flush due to "early traps"
256wire        local_flush_all_w;   // trap flush
257wire        local_flush_all_w2;   // trap flush
258//
259// por indicators generations
260wire por_rstint0_g, por_rstint1_g;
261wire por_rstint2_g, por_rstint3_g;
262//
263// GL register definitions - one GL register/thread
264wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl0, gl_lvl1, gl_lvl2, gl_lvl3; 
265// updated value of the GL registers
266wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl0_new, gl_lvl1_new; 
267wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl2_new, gl_lvl3_new; 
268wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl0_update_g, gl_lvl1_update_g; 
269wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl2_update_g, gl_lvl3_update_g; 
270wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl0_update_w2, gl_lvl1_update_w2; 
271wire [`TSA_GLOBAL_WIDTH-1:0] gl_lvl2_update_w2, gl_lvl3_update_w2; 
272wire [`TSA_GLOBAL_WIDTH-1:0] wsr_gl_lvl0_data, wsr_gl_lvl1_data; 
273wire [`TSA_GLOBAL_WIDTH-1:0] wsr_gl_lvl2_data, wsr_gl_lvl3_data; 
274wire [`TSA_GLOBAL_WIDTH-1:0] dnrtry_gl_lvl0_data, dnrtry_gl_lvl1_data; 
275wire [`TSA_GLOBAL_WIDTH-1:0] dnrtry_gl_lvl2_data, dnrtry_gl_lvl3_data; 
276// value to be incremented for the GL registers
277// modified due to timing
278// wire gl0_incr_sel, gl1_incr_sel, gl2_incr_sel, gl3_incr_sel;
279// wire[1:0] gl_lvl0_incr, gl_lvl1_incr, gl_lvl2_incr, gl_lvl3_incr;
280// indicators to signal gl is at certain pre-defined values
281// added for timing
282wire [`TLU_THRD_NUM-1:0] gl_incr_sel_w2; 
283wire [`TLU_THRD_NUM-1:0] gl_update_sel_g; 
284wire [`TLU_THRD_NUM-1:0] gl_update_sel_w2; 
285wire [`TLU_THRD_NUM-1:0] gl_priv_max_sel_w2; 
286wire gl_lvl0_at_maxgl, gl_lvl1_at_maxgl; 
287wire gl_lvl2_at_maxgl, gl_lvl3_at_maxgl;
288wire gl_lvl0_at_maxstl, gl_lvl1_at_maxstl;
289wire gl_lvl2_at_maxstl, gl_lvl3_at_maxstl;
290// gl write enables 
291wire gl0_en, gl1_en, gl2_en, gl3_en; 
292wire [`TLU_THRD_NUM-1:0] dnrtry_inst_w2;
293// maxgl control
294wire [`TLU_THRD_NUM-1:0] maxstl_gl_dnrtry_sel;
295wire [`TLU_THRD_NUM-1:0] maxstl_gl_wr_sel;
296wire [`TLU_THRD_NUM-1:0] maxgl_gl_wr_sel;
297// decoded thread info for agp swap
298// wire [`TLU_THRD_NUM-1:0] agp_thrid;
299wire [`TLU_THRD_NUM-1:0] agp_thrid_w2;
300// modified for for timing fix
301// wire agp_swap;
302// wire [1:0] agp_new;
303wire wsr_inst_g, wsr_inst_w2; 
304wire agp_swap_w2, agp_swap_w3; 
305wire [1:0] agp_new_w2, agp_new_w3; 
306//
307// hyper-privileged ASR registers
308wire [`TLU_THRD_NUM-1:0] tlu_wr_hintp_g;         
309wire htba_rw_d, hpstate_rw_d, htstate_rw_d, hintp_rw_d; 
310wire htickcmp_rw_d, gl_rw_d; 
311wire htba_rw_e, hpstate_rw_e, htstate_rw_e, hintp_rw_e; 
312wire htickcmp_rw_e, gl_rw_e;
313wire htba_rw_m, hpstate_rw_m, htstate_rw_m, hintp_rw_m; 
314wire htickcmp_rw_m, gl_rw_m; 
315wire htba_rw_g, hpstate_rw_g, htstate_rw_g, hintp_rw_g; 
316wire htickcmp_rw_g, gl_rw_g;
317wire [`TLU_THRD_NUM-1:0] htickcmp_intdis_en;
318wire hpstate_rw_w2;
319//
320// hyper-lite mode indicator
321wire [`TLU_THRD_NUM-1:0] tlu_hyper_lite;
322//
323// contorls to update the hpstate registers
324// wire update_hpstate0_g, update_hpstate1_g;
325// wire update_hpstate2_g, update_hpstate3_g;
326wire [`TLU_THRD_NUM-1:0] update_hpstate_g; 
327wire [`TLU_THRD_NUM-1:0] update_hpstate_w2; 
328//
329// htick interrupt disable control
330wire htick_intdis0, htick_intdis1;
331wire htick_intdis2, htick_intdis3;
332//
333// local addr of sr(st/pr)
334wire [`TLU_ASR_ADDR_WIDTH-3:0] sraddr;
335
336// ASI_QUEUE for hyper visor
337// thread 0
338wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo0_head;
339wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo0_tail;
340wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo0_head;
341wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo0_tail;
342wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err0_head;
343wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err0_tail;
344wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err0_head;
345wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err0_tail;
346// thread 1
347wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo1_head;
348wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo1_tail;
349wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo1_head;
350wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo1_tail;
351wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err1_head;
352wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err1_tail;
353wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err1_head;
354wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err1_tail;
355// thread 2
356wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo2_head;
357wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo2_tail;
358wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo2_head;
359wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo2_tail;
360wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err2_head;
361wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err2_tail;
362wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err2_head;
363wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err2_tail;
364// thread 3
365wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo3_head;
366wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo3_tail;
367wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo3_head;
368wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo3_tail;
369wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err3_head;
370wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err3_tail;
371wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err3_head;
372wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err3_tail;
373//
374// read asi data from the asi queues
375wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo_hd_rdata;
376wire [`TLU_ASI_QUE_WIDTH-1:0] cpu_mondo_ta_rdata;
377wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo_hd_rdata;
378wire [`TLU_ASI_QUE_WIDTH-1:0] dev_mondo_ta_rdata;
379wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err_hd_rdata;
380wire [`TLU_ASI_QUE_WIDTH-1:0] resum_err_ta_rdata;
381wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err_hd_rdata;
382wire [`TLU_ASI_QUE_WIDTH-1:0] nresum_err_ta_rdata;
383wire [`TLU_ASI_QUE_WIDTH-1:0] asi_queue_rdata1_g;
384wire [`TLU_ASI_QUE_WIDTH-1:0] asi_queue_rdata2_g;
385wire asi_qrdata_mx_sel2;
386//
387// head and tail comparison results
388// modified due to timing violations
389// wire cpu_mondo_head_rw_e,  cpu_mondo_tail_rw_e;
390// wire dev_mondo_head_rw_e,  dev_mondo_tail_rw_e;
391// wire resum_err_head_rw_e,  resum_err_tail_rw_e;
392// wire nresum_err_head_rw_e, nresum_err_tail_rw_e;
393//
394wire cpu_mondo_head_rw_m,  cpu_mondo_tail_rw_m;
395wire dev_mondo_head_rw_m,  dev_mondo_tail_rw_m;
396wire resum_err_head_rw_m,  resum_err_tail_rw_m;
397wire nresum_err_head_rw_m, nresum_err_tail_rw_m;
398//
399wire cpu_mondo_head_rw_g,  cpu_mondo_tail_rw_g;
400wire dev_mondo_head_rw_g,  dev_mondo_tail_rw_g;
401wire resum_err_head_rw_g,  resum_err_tail_rw_g;
402wire nresum_err_head_rw_g, nresum_err_tail_rw_g;
403// creating one-hot selects
404// wire cpu_mondo_hd_onehot_g, cpu_mondo_ta_onehot_g;
405// wire dev_mondo_hd_onehot_g, dev_mondo_ta_onehot_g;
406// wire resum_err_hd_onehot_g, resum_err_ta_onehot_g;
407// wire nresum_err_hd_onehot_g, nresum_err_ta_onehot_g;
408// read
409wire [`TLU_THRD_NUM-1:0] cpu_mondo_head_rd_g;
410wire cpu_mondo_hd_rd_g;
411wire [`TLU_THRD_NUM-1:0] cpu_mondo_tail_rd_g;
412wire cpu_mondo_ta_rd_g;
413wire [`TLU_THRD_NUM-1:0] dev_mondo_head_rd_g;
414wire dev_mondo_hd_rd_g;
415wire [`TLU_THRD_NUM-1:0] dev_mondo_tail_rd_g;
416wire dev_mondo_ta_rd_g;
417wire [`TLU_THRD_NUM-1:0] resum_err_head_rd_g;
418wire resum_err_hd_rd_g;
419wire [`TLU_THRD_NUM-1:0] resum_err_tail_rd_g;
420wire resum_err_ta_rd_g;
421wire [`TLU_THRD_NUM-1:0] nresum_err_head_rd_g; 
422wire nresum_err_hd_rd_g; 
423wire [`TLU_THRD_NUM-1:0] nresum_err_tail_rd_g;
424wire nresum_err_ta_rd_g;
425wire [3:0] asi_qrdata_mx1_sel;
426wire [3:0] asi_qrdata_mx2_sel;
427// write
428wire [`TLU_THRD_NUM-1:0] cpu_mondo_head_wr_g;
429wire [`TLU_THRD_NUM-1:0] cpu_mondo_tail_wr_g;
430wire [`TLU_THRD_NUM-1:0] dev_mondo_head_wr_g;
431wire [`TLU_THRD_NUM-1:0] dev_mondo_tail_wr_g;
432wire [`TLU_THRD_NUM-1:0] resum_err_head_wr_g;
433wire [`TLU_THRD_NUM-1:0] resum_err_tail_wr_g;
434wire [`TLU_THRD_NUM-1:0] nresum_err_head_wr_g; 
435wire [`TLU_THRD_NUM-1:0] nresum_err_tail_wr_g;
436//
437// ASI va address
438// modified due to timing fix
439// wire [`TLU_ASI_VA_WIDTH-1:0] tlu_ldst_va_e;
440wire [`TLU_ASI_VA_WIDTH-1:0] tlu_ldst_va_m;
441//
442// ASI read or write enables
443wire asi_queue_write_e;
444wire asi_queue_read_e;
445wire asi_queue_write_pq_m; 
446wire asi_queue_read_pq_m;
447wire asi_queue_write_m; 
448wire asi_queue_read_m;
449wire asi_queue_write_uf_g; 
450// wire asi_queue_read_uf_g;
451wire asi_queue_write_g; 
452wire asi_queue_read_g;
453//
454// decoded ASI addresses
455// ASI QUE
456wire asi_queue_rw_e, asi_queue_rw_m, asi_queue_rw_g;
457wire asi_inrr_rw_e, asi_inrr_rw_m, asi_inrr_rw_g; 
458wire asi_indr_rw_e, asi_indr_rw_m, asi_indr_rw_g; 
459wire asi_invr_rw_e, asi_invr_rw_m, asi_invr_rw_g; 
460// supervisor scratch-pad asi state
461wire asi_scpd_rw_e, asi_scpd_rw_m; 
462// hypervisor scratch-pad asi state
463wire asi_hscpd_rw_e, asi_hscpd_rw_m; 
464wire asi_scpd_rw_vld_m, asi_scpd_rw_vld_g; 
465// legal va addresses
466// modified due to timing
467// wire que_legal_va_e;
468wire que_legal_va_m;
469// modified due to timing
470// illegal va range indicator
471// wire que_ill_va_e,
472wire que_ill_va_m, que_ill_va_g;
473// modified due to timing
474// wire scpd_ill_va_e,
475wire scpd_ill_va_m, scpd_ill_va_g;
476// alignment checking
477wire va_not_baligned_m; 
478// no longer necessary
479// wire va_all_zero_e, va_all_zero_m, va_all_zero_g;
480// write operation to queue tails
481wire qtail_write_m;
482//
483// data_access_exception for hyper-privileged scratch-pad
484wire hscpd_data_acc_excpt_m;
485wire hscpd_data_acc_excpt_pq_m;
486// write to hypervisor scratch-pad using 0x20 ASI state
487wire hscpd_priv_asi_acc_m;
488// access hypervisor scratchpad va addresses
489wire hscpd_va_rw_m; 
490//
491// relevant portion of the va address for the scratch-pad
492// modified due to timing fix
493// wire [`TLU_ASI_SCPD_VA_HI:0]       scpd_addr_va_e;
494wire [`SCPD_ASI_VA_ADDR_WIDTH-1:0] scpd_addr_va_m;
495wire [`SCPD_ASI_VA_ADDR_WIDTH-1:0] scpd_addr_va_g;
496//
497// load instruction data valid
498wire asi_ld_addr_vld_m, asi_ld_addr_vld_g;
499
500// privilege or hyper-privileged address indicators
501wire asr_hyperp, asr_priv;
502//
503// local reset
504wire local_rst_l; 
505wire local_rst; 
506// local clk
507wire clk; 
508
509////////////////////////////////////////////////////////////////////////
510// local reset
511////////////////////////////////////////////////////////////////////////
512
513dffrl_async dffrl_local_rst_l(
514    .din  (grst_l),
515    .clk  (clk),
516    .rst_l(arst_l),
517    .q    (local_rst_l),
518    .se   (se),
519    .si   (),
520    .so   ()
521); 
522
523assign local_rst = ~local_rst_l;
524
525////////////////////////////////////////////////////////////////////////
526// local clock
527////////////////////////////////////////////////////////////////////////
528
529assign clk = rclk; 
530
531////////////////////////////////////////////////////////////////////////
532// Hyper-lite mode indicator
533////////////////////////////////////////////////////////////////////////
534
535assign tlu_hyper_lite[0] = 
536           tlu_hpstate_priv[0]| (~tlu_hpstate_enb[0] & tlu_pstate_priv[0]); 
537assign tlu_hyper_lite[1] = 
538           tlu_hpstate_priv[1]| (~tlu_hpstate_enb[1] & tlu_pstate_priv[1]); 
539assign tlu_hyper_lite[2] = 
540           tlu_hpstate_priv[2]| (~tlu_hpstate_enb[2] & tlu_pstate_priv[2]); 
541assign tlu_hyper_lite[3] = 
542           tlu_hpstate_priv[3]| (~tlu_hpstate_enb[3] & tlu_pstate_priv[3]); 
543
544////////////////////////////////////////////////////////////////////////
545// Thread ID staging and decoding
546////////////////////////////////////////////////////////////////////////
547//
548assign  thread_sel_id_e[0] = ~thrid_e[1] & ~thrid_e[0];
549assign  thread_sel_id_e[1] = ~thrid_e[1] &  thrid_e[0];
550assign  thread_sel_id_e[2] =  thrid_e[1] & ~thrid_e[0];
551assign  thread_sel_id_e[3] =  thrid_e[1] &  thrid_e[0];
552
553dff_s #(`TLU_THRD_NUM) dff_thread_sel_id_m (
554    .din (thread_sel_id_e[`TLU_THRD_NUM-1:0]),
555    .q   (thread_sel_id_m[`TLU_THRD_NUM-1:0]),
556    .clk (clk),
557    .se  (se),       
558    .si  (),         
559    .so  ()
560);
561
562dff_s #(`TLU_THRD_NUM) dff_thread_id_sel_g (
563    .din (thread_sel_id_m[`TLU_THRD_NUM-1:0]),
564    .q   (thread_sel_id_g[`TLU_THRD_NUM-1:0]),
565    .clk (clk),
566    .se  (se),       
567    .si  (),         
568    .so  ()
569);
570
571dff_s #(`TLU_THRD_NUM) dff_thread_id_sel_w2 (
572    .din (thread_sel_id_g[`TLU_THRD_NUM-1:0]),
573    .q   (thread_sel_id_w2[`TLU_THRD_NUM-1:0]),
574    .clk (clk),
575    .se  (se),       
576    .si  (),         
577    .so  ()
578);
579
580dff_s #(2) dff_thrid_e (
581    .din (ifu_tlu_thrid_d[1:0]),
582    .q   (thrid_e[1:0]),
583    .clk (clk),
584    .se  (se),       
585    .si  (),         
586    .so  ()
587);
588
589dff_s #(2) dff_thrid_m (
590    .din (thrid_e[1:0]),
591    .q   (thrid_m[1:0]),
592    .clk (clk),
593    .se  (se),       
594    .si  (),         
595    .so  ()
596);
597
598dff_s #(2) dff_thrid_g (
599    .din (thrid_m[1:0]),
600    .q   (thrid_g[1:0]),
601    .clk (clk),
602    .se  (se),       
603    .si  (),         
604    .so  ()
605);
606//
607// modified due to rte failure
608assign tlu_local_thrid_g[0] = ~(|thrid_g[1:0]); 
609assign tlu_local_thrid_g[1] = ~thrid_g[1] &  thrid_g[0]; 
610assign tlu_local_thrid_g[2] =  thrid_g[1] & ~thrid_g[0]; 
611assign tlu_local_thrid_g[3] =  (&thrid_g[1:0]); 
612
613/*
614assign tlu_local_thrid_g[`TLU_THRD_NUM-1:0] =
615           thread_sel_id_g[`TLU_THRD_NUM-1:0];
616*/
617
618////////////////////////////////////////////////////////////////////////
619// POR indicator generation
620////////////////////////////////////////////////////////////////////////
621//
622// modified for bug 1945
623/*
624assign  por_rstint0_g = tlu_por_rstint_g & thread_sel_id_g[0];
625assign  por_rstint1_g = tlu_por_rstint_g & thread_sel_id_g[1];
626assign  por_rstint2_g = tlu_por_rstint_g & thread_sel_id_g[2];
627assign  por_rstint3_g = tlu_por_rstint_g & thread_sel_id_g[3];
628*/
629assign  por_rstint0_g = tlu_por_rstint_g[0];
630assign  por_rstint1_g = tlu_por_rstint_g[1];
631assign  por_rstint2_g = tlu_por_rstint_g[2];
632assign  por_rstint3_g = tlu_por_rstint_g[3];
633
634////////////////////////////////////////////////////////////////////////
635// Hyper-privileged ASR decodes
636////////////////////////////////////////////////////////////////////////
637//
638// flush signal - modified for timing
639// assign  local_flush_all_w = tlu_nlsu_flush_w | lsu_tlu_early_flush_w;
640assign  local_flush_all_w = 
641            tlu_local_flush_w | lsu_tlu_early_flush_w | ifu_tlu_flush_fd_w;
642
643dffr_s dffr_local_flush_all_w2 (
644    .din (local_flush_all_w),
645    .q   (local_flush_all_w2),
646    .rst (local_rst),
647    .clk (clk),
648    .se  (se),
649    .si  (),
650    .so ()
651);
652
653// added for timing
654assign tlu_lsu_int_ldxa_vld_w2 = 
655           tlu_asi_data_nf_vld_w2 & ~local_flush_all_w2;
656
657assign  asr_hyperp = ifu_tlu_sraddr_d[`TLU_ASR_ADDR_WIDTH-1];
658assign  asr_priv   = ifu_tlu_sraddr_d[`TLU_ASR_ADDR_WIDTH-2];
659
660assign  sraddr[`TLU_ASR_ADDR_WIDTH-3:0] =       
661            ifu_tlu_sraddr_d[`TLU_ASR_ADDR_WIDTH-3:0];
662
663// hypervisor tick compare - 0x1f - hyper-priviledged
664assign htickcmp_rw_d = sraddr[4] & sraddr[3] & sraddr[2] & sraddr[1] & sraddr[0] &
665                                   asr_hyperp;
666//
667// hypervisor processor state - 0x00 - hyper-priviledged
668assign hpstate_rw_d = ~sraddr[4] & ~sraddr[3] & ~sraddr[2] & ~sraddr[1] & ~sraddr[0] &
669                                   asr_hyperp;
670//
671// hypervisor trap state - 0x01 - hyper-priviledged
672assign htstate_rw_d = ~sraddr[4] & ~sraddr[3] & ~sraddr[2] & ~sraddr[1] & sraddr[0] &
673                                   asr_hyperp;
674
675assign tlu_htstate_rw_d = htstate_rw_d;
676//
677// hypervisor interrupt pending - 0x03 - hyper-priviledged
678assign hintp_rw_d = ~sraddr[4] & ~sraddr[3] & ~sraddr[2] & sraddr[1] & sraddr[0] &
679                                 asr_hyperp;
680//
681// hypervisor trap base address - 0x05 - hyper-priviledged
682assign htba_rw_d = ~sraddr[4] & ~sraddr[3] & sraddr[2] & ~sraddr[1] & sraddr[0] &
683                               asr_hyperp;     
684
685// global register - 0x10 - privileged
686assign gl_rw_d = sraddr[4] & ~sraddr[3] & ~sraddr[2] & ~sraddr[1] & ~sraddr[0] &
687                             asr_priv;
688//
689// staging of the ASR decoded controls
690// staging from d to e stage
691dff_s dff_htba_rw_d_e (
692    .din (htba_rw_d),
693    .q   (htba_rw_e),
694    .clk (clk),
695    .se  (se),       
696    .si  (),         
697    .so  ()
698);
699
700dff_s dff_hpstate_rw_d_e (
701    .din (hpstate_rw_d),
702    .q   (hpstate_rw_e),
703    .clk (clk),
704    .se  (se),       
705    .si  (),         
706    .so  ()
707);
708
709dff_s dff_htstate_rw_d_e (
710    .din (htstate_rw_d),
711    .q   (htstate_rw_e),
712    .clk (clk),
713    .se  (se),       
714    .si  (),         
715    .so  ()
716);
717
718dff_s dff_hintp_rw_e (
719    .din (hintp_rw_d),
720    .q   (hintp_rw_e),
721    .clk (clk),
722    .se  (se),       
723    .si  (),         
724    .so  ()
725);
726
727dff_s dff_htickcmp_rw_d_e (
728    .din (htickcmp_rw_d),
729    .q   (htickcmp_rw_e),
730    .clk (clk),
731    .se  (se),       
732    .si  (),         
733    .so  ()
734);
735
736dff_s dff_gl_rw_d_e (
737    .din (gl_rw_d),
738    .q   (gl_rw_e),
739    .clk (clk),
740    .se  (se),       
741    .si  (),         
742    .so  ()
743);
744
745// staging from e to m stage
746dff_s dff_htba_rw_m_m (
747    .din (htba_rw_e),
748    .q   (htba_rw_m),
749    .clk (clk),
750    .se  (se),       
751    .si  (),         
752    .so  ()
753);
754
755dff_s dff_hpstate_rw_m_m (
756    .din (hpstate_rw_e),
757    .q   (hpstate_rw_m),
758    .clk (clk),
759    .se  (se),       
760    .si  (),         
761    .so  ()
762);
763
764dff_s dff_htstate_rw_m_m (
765    .din (htstate_rw_e),
766    .q   (htstate_rw_m),
767    .clk (clk),
768    .se  (se),       
769    .si  (),         
770    .so  ()
771);
772
773dff_s dff_hintp_rw_m_m (
774    .din (hintp_rw_e),
775    .q   (hintp_rw_m),
776    .clk (clk),
777    .se  (se),       
778    .si  (),         
779    .so  ()
780);
781
782dff_s dff_htickcmp_rw_m_m (
783    .din (htickcmp_rw_e),
784    .q   (htickcmp_rw_m),
785    .clk (clk),
786    .se  (se),       
787    .si  (),         
788    .so  ()
789);
790
791dff_s dff_gl_rw_m_m (
792    .din (gl_rw_e),
793    .q   (gl_rw_m),
794    .clk (clk),
795    .se  (se),       
796    .si  (),         
797    .so  ()
798);
799
800// staging from e to g stage
801dff_s dff_gl_rw_m_g (
802    .din (gl_rw_m),
803    .q   (gl_rw_g),
804    .clk (clk),
805    .se  (se),       
806    .si  (),         
807    .so  ()
808);
809
810dff_s dff_hpstate_rw_m_g (
811    .din (hpstate_rw_m),
812    .q   (hpstate_rw_g),
813    .clk (clk),
814    .se  (se),       
815    .si  (),         
816    .so  ()
817);
818
819dff_s dff_htickcmp_rw_m_g (
820    .din (htickcmp_rw_m),
821    .q   (htickcmp_rw_g),
822    .clk (clk),
823    .se  (se),       
824    .si  (),         
825    .so  ()
826);
827
828dff_s dff_htba_rw_m_g (
829    .din (htba_rw_m),
830    .q   (htba_rw_g),
831    .clk (clk),
832    .se  (se),       
833    .si  (),         
834    .so  ()
835);
836
837dff_s dff_hintp_rw_g (
838    .din (hintp_rw_m),
839    .q   (hintp_rw_g),
840    .clk (clk),
841    .se  (se),       
842    .si  (),         
843    .so  ()
844);
845
846dff_s dff_htstate_rw_m_g (
847    .din (htstate_rw_m),
848    .q   (htstate_rw_g),
849    .clk (clk),
850    .se  (se),       
851    .si  (),         
852    .so  ()
853);
854//
855// stage to w2
856dff_s dff_hpstate_rw_m_w2 (
857    .din (hpstate_rw_g),
858    .q   (hpstate_rw_w2),
859    .clk (clk),
860    .se  (se),       
861    .si  (),         
862    .so  ()
863);
864
865// constructing the mux select to access the
866// hyper-privileged ASR registers
867//
868assign tlu_htickcmp_rw_e = htickcmp_rw_e;
869assign tlu_htstate_rw_g = htstate_rw_g;
870//
871// using htba_rw_e as one of the selects for rdpr read in tlu_tdp
872// assign tlu_htba_rsr_sel = htba_rw_e;
873//
874// construciton mux selects for tlu_rdpr_mx5 in tlu_tdp to read out
875// the ASR information
876//
877assign  tlu_hyperv_rdpr_sel[0] = gl_rw_e; 
878assign  tlu_hyperv_rdpr_sel[1] = hintp_rw_e; 
879assign  tlu_hyperv_rdpr_sel[2] = hpstate_rw_e; 
880assign  tlu_hyperv_rdpr_sel[3] = htstate_rw_e; 
881assign  tlu_hyperv_rdpr_sel[4] = htba_rw_e; 
882// assign  tlu_rdpr_mx5_active = |(tlu_rdpr_mx5_sel[3:0]);
883//
884// buffer gl_rw_g for agp_tid_sel in tlu_tcl
885// modified for timing
886// assign tlu_gl_rw_g = gl_rw_g;
887assign tlu_gl_rw_m = gl_rw_m;
888
889////////////////////////////////////////////////////////////////////////
890// GL register controls
891////////////////////////////////////////////////////////////////////////
892
893dffr_s #(`TLU_THRD_NUM)  dffr_gl_update_sel_w2 (
894    .din (gl_update_sel_g[`TLU_THRD_NUM-1:0]), 
895    .q   (gl_update_sel_w2[`TLU_THRD_NUM-1:0]),
896    .rst (local_rst),
897    .clk (clk),
898    .se  (se),
899    .si  (),
900    .so ()
901);
902
903dffr_s #(`TLU_THRD_NUM) dffr_dnrtry_inst_w2 (
904    .din ({tlu_dnrtry3_inst_g, tlu_dnrtry2_inst_g,
905           tlu_dnrtry1_inst_g,tlu_dnrtry0_inst_g}),
906    .q   (dnrtry_inst_w2[`TLU_THRD_NUM-1:0]),
907    .rst (local_rst),
908    .clk (clk),
909    .se  (se),
910    .si  (),
911    .so ()
912);
913//
914// added for timing
915assign wsr_inst_g = tlu_wsr_inst_nq_g & ~ifu_tlu_flush_fd_w;
916
917dffr_s dffr_wsr_inst_w2 (
918    .din (wsr_inst_g),
919    .q   (wsr_inst_w2),
920    .rst (local_rst),
921    .clk (clk),
922    .se  (se),
923    .si  (),
924    .so ()
925);
926
927// THREAD0
928
929assign gl_lvl0_at_maxgl  = (gl_lvl0[`TSA_GLOBAL_WIDTH-1:0] == `MAXGL_GL);
930assign gl_lvl0_at_maxstl = (gl_lvl0[`TSA_GLOBAL_WIDTH-1:0] == `MAXSTL_GL);
931//
932// generate the control to prevent writing beyond maxstl or maxgl
933
934assign maxstl_gl_wr_sel[0] = 
935           ~tlu_hyper_lite[0] & 
936           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > {1'b0,`MAXSTL}); 
937assign maxstl_gl_wr_sel[1] = 
938           ~tlu_hyper_lite[1] & 
939           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > {1'b0,`MAXSTL}); 
940assign maxstl_gl_wr_sel[2] = 
941           ~tlu_hyper_lite[2] & 
942           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > {1'b0,`MAXSTL});
943assign maxstl_gl_wr_sel[3] = 
944           ~tlu_hyper_lite[3] & 
945           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > {1'b0,`MAXSTL}); 
946//
947// added for bug 79252
948assign maxstl_gl_dnrtry_sel[0] = 
949           ~tlu_hyper_lite[0] & 
950           (&tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);
951assign maxstl_gl_dnrtry_sel[1] = 
952           ~tlu_hyper_lite[1] & 
953           (&tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);
954assign maxstl_gl_dnrtry_sel[2] = 
955           ~tlu_hyper_lite[2] & 
956           (&tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);
957assign maxstl_gl_dnrtry_sel[3] = 
958           ~tlu_hyper_lite[3] & 
959           (&tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]); 
960//
961// added for bug 79252
962assign dnrtry_gl_lvl0_data[`TSA_GLOBAL_WIDTH-1:0] = 
963            (maxstl_gl_dnrtry_sel[0])? `MAXSTL_GL:
964            tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0];
965assign dnrtry_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0] = 
966            (maxstl_gl_dnrtry_sel[1])? `MAXSTL_GL:
967            tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0];
968assign dnrtry_gl_lvl2_data[`TSA_GLOBAL_WIDTH-1:0] = 
969            (maxstl_gl_dnrtry_sel[2])? `MAXSTL_GL:
970            tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0];
971assign dnrtry_gl_lvl3_data[`TSA_GLOBAL_WIDTH-1:0] = 
972            (maxstl_gl_dnrtry_sel[3])? `MAXSTL_GL:
973            tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0];
974
975//
976// maxgl cap
977assign maxgl_gl_wr_sel[0] = 
978           tlu_hyper_lite[0] & 
979           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > `MAXGL); 
980assign maxgl_gl_wr_sel[1] = 
981           tlu_hyper_lite[1] & 
982           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > `MAXGL); 
983assign maxgl_gl_wr_sel[2] = 
984           tlu_hyper_lite[2] & 
985           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > `MAXGL); 
986assign maxgl_gl_wr_sel[3] = 
987           tlu_hyper_lite[3] & 
988           (tlu_wsr_data_w_global[`TLU_GLOBAL_WIDTH-1:0] > `MAXGL); 
989//
990// trap level to be incremented if thread not at MAXGL and not in redmode
991// modified for bug 2889
992// modified due to timing
993/*
994assign gl0_incr_sel =
995           tlu_thrd0_traps & (~(gl_lvl0_at_maxgl | tlu_select_tba_g) | 
996           (~gl_lvl0_at_maxstl & tlu_select_tba_g));
997           
998assign gl_lvl0_incr[1:0] = {1'b0, gl0_incr_sel};
999
1000assign gl0_en = (gl_rw_g & wsr_inst_g & thread_sel_id_g[0]) |
1001                             gl0_incr_sel | local_rst | por_rstint0_g   |
1002                 tlu_dnrtry0_inst_g; 
1003
1004assign gl_lvl0_new[`TSA_GLOBAL_WIDTH-1:0] =
1005                (gl_rw_g & wsr_inst_g & thread_sel_id_g[0]) ?
1006                         wsr_gl_lvl0_data[`TSA_GLOBAL_WIDTH-1:0] :
1007               ((local_rst | por_rstint0_g) ? `MAXGL_GL :
1008                   ((tlu_dnrtry0_inst_g) ?
1009                         tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0] :     // done/retry restore
1010                         gl_lvl0[`TSA_GLOBAL_WIDTH-1:0] + gl_lvl0_incr[1:0])); // trap increments
1011*/
1012// modified for bug 79252
1013assign wsr_gl_lvl0_data[`TSA_GLOBAL_WIDTH-1:0] = 
1014            (maxstl_gl_wr_sel[0])? `MAXSTL_GL:
1015           ((maxgl_gl_wr_sel[0]) ? `MAXGL_GL : 
1016            tlu_wsr_data_w_global[`TSA_GLOBAL_WIDTH-1:0]);
1017assign gl_lvl0_update_g[`TSA_GLOBAL_WIDTH-1:0] = 
1018                (gl_rw_g & wsr_inst_g & thread_sel_id_g[0]) ? 
1019                         wsr_gl_lvl0_data[`TSA_GLOBAL_WIDTH-1:0] : 
1020               ((local_rst | por_rstint0_g) ? `MAXGL_GL :
1021                         dnrtry_gl_lvl0_data[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1022                         // tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1023
1024dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl_lvl0_update_w2 (
1025     .din (gl_lvl0_update_g[`TSA_GLOBAL_WIDTH-1:0]), 
1026     .q   (gl_lvl0_update_w2[`TSA_GLOBAL_WIDTH-1:0]),
1027     .en  (gl_update_sel_g[0]), 
1028     .clk (clk),
1029     .se  (se),       
1030     .si  (),         
1031     .so  ()
1032);
1033//
1034// modified for bug3468 and bug3505
1035assign gl_incr_sel_w2[0] = 
1036            tlu_thrd_traps_w2[0] & ~(gl_lvl0_at_maxgl | 
1037           (gl_lvl0_at_maxstl & tlu_select_tba_w2));
1038//            tlu_thrd_traps_w2[0] & (~(gl_lvl0_at_maxgl | tlu_select_tba_w2) | 
1039assign gl_update_sel_g[0] = 
1040           (gl_rw_g & wsr_inst_g & thread_sel_id_g[0]) | 
1041                        local_rst |     por_rstint0_g | tlu_dnrtry0_inst_g; 
1042//
1043// modified for bug3468
1044assign gl_priv_max_sel_w2[0] =
1045           (gl_lvl0_at_maxgl & tlu_select_tba_w2) & tlu_thrd_traps_w2[0];
1046assign gl0_en = 
1047           gl_incr_sel_w2[0] | gl_update_sel_w2[0] | gl_priv_max_sel_w2[0]; 
1048// assign gl0_en = gl_incr_sel_w2[0] | gl_update_sel_w2[0];
1049
1050assign gl_lvl0_new[`TSA_GLOBAL_WIDTH-1:0] = 
1051           (gl_update_sel_w2[0]) ? gl_lvl0_update_w2:
1052           (~gl_update_sel_w2[0] & gl_priv_max_sel_w2[0]) ? 
1053            `MAXSTL_GL: 
1054            gl_lvl0[`TSA_GLOBAL_WIDTH-1:0] + 2'b01;
1055
1056// Reset required as processor will start out at gl=1 after reset.
1057/****************************
1058   to fix bug 6028 manually in the gate netlist, the following needs
1059   to be a mux_flop with recirculating path from q to d0 input. But
1060   to make it resetable, need to brake this recirculating path and
1061   insert an AND gate such that local_rst_l is ANDed with the q output.
1062
1063dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl0 (
1064     .din (gl_lvl0_new[`TSA_GLOBAL_WIDTH-1:0]),
1065     .q   (gl_lvl0[`TSA_GLOBAL_WIDTH-1:0]),
1066     .en  (gl0_en),
1067     .clk (clk),
1068     .se  (se),       
1069     .si  (),         
1070     .so  ()
1071);
1072******************************/
1073
1074wire [1:0] gl_lvl0_or_rst, gl_lvl0_or_rst_or_new;
1075
1076assign gl_lvl0_or_rst[1:0] = gl_lvl0[1:0] & {2{~local_rst}};
1077
1078assign gl_lvl0_or_rst_or_new[1:0] = (gl0_en&~local_rst) ? gl_lvl0_new[1:0] : gl_lvl0_or_rst[1:0];
1079
1080dff_s    #(2) dffe_gl0 (
1081        .din(gl_lvl0_or_rst_or_new[1:0]) ,
1082        .q(gl_lvl0[1:0]),
1083        .clk (clk), .se(se), .si(), .so());
1084
1085/******************************/
1086
1087
1088assign tlu_gl_lvl0[`TSA_GLOBAL_WIDTH-1:0] = gl_lvl0[`TSA_GLOBAL_WIDTH-1:0];
1089
1090`ifdef FPGA_SYN_1THREAD
1091`else
1092   
1093// THREAD1
1094
1095assign gl_lvl1_at_maxgl  = (gl_lvl1[`TSA_GLOBAL_WIDTH-1:0] == `MAXGL_GL);
1096assign gl_lvl1_at_maxstl = (gl_lvl1[`TSA_GLOBAL_WIDTH-1:0] == `MAXSTL_GL);
1097//
1098// trap level to be incremented if thread not at MAXGL and not in redmode
1099// modified for bug 2889
1100// modified due to timing
1101/*
1102assign gl1_incr_sel =
1103           tlu_thrd1_traps & (~(gl_lvl1_at_maxgl | tlu_select_tba_g) | 
1104           (~gl_lvl1_at_maxstl & tlu_select_tba_g));
1105
1106assign gl_lvl1_incr[1:0] = {1'b0, gl1_incr_sel};
1107
1108assign gl1_en = (gl_rw_g & wsr_inst_g & thread_sel_id_g[1]) |
1109                             gl1_incr_sel | local_rst | por_rstint1_g   |
1110                 tlu_dnrtry1_inst_g; 
1111
1112assign gl_lvl1_new[`TSA_GLOBAL_WIDTH-1:0] =
1113                (gl_rw_g & wsr_inst_g & thread_sel_id_g[1])?
1114                         wsr_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0] :
1115                   ((local_rst | por_rstint1_g) ? `MAXGL_GL :
1116                   ((tlu_dnrtry1_inst_g) ?
1117                         dnrtry_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0] :     // done/retry restore
1118                         // tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0] :     // done/retry restore
1119                         gl_lvl1[`TSA_GLOBAL_WIDTH-1:0] + gl_lvl1_incr[1:0])); // trap increments
1120
1121*/
1122assign wsr_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0] = 
1123            (maxstl_gl_wr_sel[1])? `MAXSTL_GL:
1124           ((maxgl_gl_wr_sel[1]) ? `MAXGL_GL : 
1125            tlu_wsr_data_w_global[`TSA_GLOBAL_WIDTH-1:0]);
1126assign gl_lvl1_update_g[`TSA_GLOBAL_WIDTH-1:0] = 
1127                (gl_rw_g & wsr_inst_g & thread_sel_id_g[1]) ? 
1128                         wsr_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0] : 
1129               ((local_rst | por_rstint1_g) ? `MAXGL_GL :
1130                         dnrtry_gl_lvl1_data[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1131                         // tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1132
1133dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl_lvl1_update_w2 (
1134     .din (gl_lvl1_update_g[`TSA_GLOBAL_WIDTH-1:0]), 
1135     .q   (gl_lvl1_update_w2[`TSA_GLOBAL_WIDTH-1:0]),
1136     .en  (gl_update_sel_g[1]), 
1137     .clk (clk),
1138     .se  (se),       
1139     .si  (),         
1140     .so  ()
1141);
1142//
1143// modified for bug3468 and bug3505
1144assign gl_incr_sel_w2[1] = 
1145            tlu_thrd_traps_w2[1] & ~(gl_lvl1_at_maxgl | 
1146           (gl_lvl1_at_maxstl & tlu_select_tba_w2));
1147//            tlu_thrd_traps_w2[1] & (~(gl_lvl1_at_maxgl | tlu_select_tba_w2) | 
1148assign gl_update_sel_g[1] = 
1149           (gl_rw_g & wsr_inst_g & thread_sel_id_g[1]) | 
1150                        local_rst |     por_rstint1_g | tlu_dnrtry1_inst_g; 
1151//
1152// modified for bug3468
1153assign gl_priv_max_sel_w2[1] =
1154           (gl_lvl1_at_maxgl & tlu_select_tba_w2) & tlu_thrd_traps_w2[1];
1155//
1156assign gl1_en = 
1157           gl_incr_sel_w2[1] | gl_update_sel_w2[1] | gl_priv_max_sel_w2[1]; 
1158// assign gl1_en = gl_incr_sel_w2[1] | gl_update_sel_w2[1];
1159
1160assign gl_lvl1_new[`TSA_GLOBAL_WIDTH-1:0] = 
1161           (gl_update_sel_w2[1]) ? gl_lvl1_update_w2:
1162           (~gl_update_sel_w2[1] & gl_priv_max_sel_w2[1]) ? 
1163            `MAXSTL_GL: 
1164            gl_lvl1[`TSA_GLOBAL_WIDTH-1:0] + 2'b01;
1165
1166// Reset required as processor will start out at gl=1 after reset.
1167/****************************
1168   to fix bug 6028 manually in the gate netlist, the following needs
1169   to be a mux_flop with recirculating path from q to d0 input. But
1170   to make it resetable, need to brake this recirculating path and
1171   insert an AND gate such that local_rst_l is ANDed with the q output.
1172dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl1 (
1173     .din (gl_lvl1_new[`TSA_GLOBAL_WIDTH-1:0]),
1174     .q   (gl_lvl1[`TSA_GLOBAL_WIDTH-1:0]),
1175     .en  (gl1_en),
1176     .clk (clk),
1177     .se  (se),       
1178     .si  (),         
1179     .so  ()
1180);
1181******************************/
1182
1183wire [1:0] gl_lvl1_or_rst, gl_lvl1_or_rst_or_new;
1184
1185assign gl_lvl1_or_rst[1:0] = gl_lvl1[1:0] & {2{~local_rst}};
1186
1187assign gl_lvl1_or_rst_or_new[1:0] = (gl1_en&~local_rst) ? gl_lvl1_new[1:0] : gl_lvl1_or_rst[1:0];
1188
1189dff_s    #(2) dffe_gl1 (
1190        .din(gl_lvl1_or_rst_or_new[1:0]) ,
1191        .q(gl_lvl1[1:0]),
1192        .clk (clk), .se(se), .si(), .so());
1193
1194/******************************/
1195
1196
1197assign tlu_gl_lvl1[`TSA_GLOBAL_WIDTH-1:0] = gl_lvl1[`TSA_GLOBAL_WIDTH-1:0];
1198
1199// THREAD2
1200
1201assign gl_lvl2_at_maxgl  = (gl_lvl2[`TSA_GLOBAL_WIDTH-1:0] == `MAXGL_GL);
1202assign gl_lvl2_at_maxstl = (gl_lvl2[`TSA_GLOBAL_WIDTH-1:0] == `MAXSTL_GL);
1203//
1204// trap level to be incremented if thread not at MAXGL and not in redmode
1205// modified for bug 2889
1206// modified due to timing
1207/*
1208assign gl2_incr_sel =
1209           tlu_thrd2_traps & (~(gl_lvl2_at_maxgl | tlu_select_tba_g) | 
1210           (~gl_lvl2_at_maxstl & tlu_select_tba_g));
1211
1212assign gl_lvl2_incr[1:0] = {1'b0, gl2_incr_sel};
1213
1214assign gl2_en = (gl_rw_g & wsr_inst_g & thread_sel_id_g[2]) |
1215                             gl2_incr_sel | local_rst | por_rstint2_g   |
1216                 tlu_dnrtry2_inst_g; 
1217
1218assign gl_lvl2_new[`TSA_GLOBAL_WIDTH-1:0] =
1219                (gl_rw_g & wsr_inst_g & thread_sel_id_g[2])?
1220                         wsr_gl_lvl2_data[`TSA_GLOBAL_WIDTH-1:0] :
1221                   ((local_rst | por_rstint2_g) ? `MAXGL_GL :
1222                   ((tlu_dnrtry2_inst_g) ?
1223                         tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0] :     // done/retry restore
1224                         gl_lvl2[`TSA_GLOBAL_WIDTH-1:0] + gl_lvl2_incr[1:0])); // trap increments
1225*/
1226assign wsr_gl_lvl2_data[`TSA_GLOBAL_WIDTH-1:0] = 
1227            (maxstl_gl_wr_sel[2])? `MAXSTL_GL:
1228           ((maxgl_gl_wr_sel[2]) ? `MAXGL_GL : 
1229            tlu_wsr_data_w_global[`TSA_GLOBAL_WIDTH-1:0]);
1230assign gl_lvl2_update_g[`TSA_GLOBAL_WIDTH-1:0] = 
1231                (gl_rw_g & wsr_inst_g & thread_sel_id_g[2]) ? 
1232                         wsr_gl_lvl2_data[`TSA_GLOBAL_WIDTH-1:0] : 
1233               ((local_rst | por_rstint2_g) ? `MAXGL_GL :
1234                         dnrtry_gl_lvl2_data[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1235                         // tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1236
1237dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl_lvl2_update_w2 (
1238     .din (gl_lvl2_update_g[`TSA_GLOBAL_WIDTH-1:0]), 
1239     .q   (gl_lvl2_update_w2[`TSA_GLOBAL_WIDTH-1:0]),
1240     .en  (gl_update_sel_g[2]), 
1241     .clk (clk),
1242     .se  (se),       
1243     .si  (),         
1244     .so  ()
1245);
1246//
1247// modified for bug3468 and bug3505
1248assign gl_incr_sel_w2[2] = 
1249           tlu_thrd_traps_w2[2] & ~(gl_lvl2_at_maxgl | 
1250           (gl_lvl2_at_maxstl & tlu_select_tba_w2));
1251//            tlu_thrd_traps_w2[2] & (~(gl_lvl2_at_maxgl | tlu_select_tba_w2) | 
1252assign gl_update_sel_g[2] = 
1253           (gl_rw_g & wsr_inst_g & thread_sel_id_g[2]) | 
1254                        local_rst |     por_rstint2_g | tlu_dnrtry2_inst_g; 
1255//
1256// modified for bug3468
1257assign gl_priv_max_sel_w2[2] =
1258           (gl_lvl2_at_maxgl & tlu_select_tba_w2) & tlu_thrd_traps_w2[2];
1259//
1260assign gl2_en = 
1261           gl_incr_sel_w2[2] | gl_update_sel_w2[2] | gl_priv_max_sel_w2[2]; 
1262// assign gl2_en = gl_incr_sel_w2[2] | gl_update_sel_w2[2];
1263
1264assign gl_lvl2_new[`TSA_GLOBAL_WIDTH-1:0] = 
1265           (gl_update_sel_w2[2]) ? gl_lvl2_update_w2:
1266           (~gl_update_sel_w2[2] & gl_priv_max_sel_w2[2]) ? 
1267            `MAXSTL_GL: 
1268            gl_lvl2[`TSA_GLOBAL_WIDTH-1:0] + 2'b01;
1269
1270// Reset required as processor will start out at gl=1 after reset.
1271/****************************
1272   to fix bug 6028 manually in the gate netlist, the following needs
1273   to be a mux_flop with recirculating path from q to d0 input. But
1274   to make it resetable, need to brake this recirculating path and
1275   insert an AND gate such that local_rst_l is ANDed with the q output.
1276dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl2 (
1277     .din (gl_lvl2_new[`TSA_GLOBAL_WIDTH-1:0]),
1278     .q   (gl_lvl2[`TSA_GLOBAL_WIDTH-1:0]),
1279     .en  (gl2_en),
1280     .clk (clk),
1281     .se  (se),       
1282     .si  (),         
1283     .so  ()
1284);
1285******************************/
1286
1287wire [1:0] gl_lvl2_or_rst, gl_lvl2_or_rst_or_new;
1288
1289assign gl_lvl2_or_rst[1:0] = gl_lvl2[1:0] & {2{~local_rst}};
1290
1291assign gl_lvl2_or_rst_or_new[1:0] = (gl2_en&~local_rst) ? gl_lvl2_new[1:0] : gl_lvl2_or_rst[1:0];
1292
1293dff_s    #(2) dffe_gl2 (
1294        .din(gl_lvl2_or_rst_or_new[1:0]) ,
1295        .q(gl_lvl2[1:0]),
1296        .clk (clk), .se(se), .si(), .so());
1297
1298/******************************/
1299
1300assign tlu_gl_lvl2[`TSA_GLOBAL_WIDTH-1:0] = gl_lvl2[`TSA_GLOBAL_WIDTH-1:0];
1301
1302// THREAD3
1303
1304assign gl_lvl3_at_maxgl  = (gl_lvl3[`TSA_GLOBAL_WIDTH-1:0] == `MAXGL_GL);
1305assign gl_lvl3_at_maxstl = (gl_lvl3[`TSA_GLOBAL_WIDTH-1:0] == `MAXSTL_GL);
1306//
1307// trap level to be incremented if thread not at MAXGL and not in redmode
1308// modified for bug 2889
1309// modified due to timing
1310/*
1311assign gl3_incr_sel =
1312           tlu_thrd3_traps & (~(gl_lvl3_at_maxgl | tlu_select_tba_g) | 
1313           (~gl_lvl3_at_maxstl & tlu_select_tba_g));
1314
1315assign gl_lvl3_incr = {1'b0, gl3_incr_sel};
1316
1317assign gl3_en = (gl_rw_g & wsr_inst_g & thread_sel_id_g[3]) |
1318                             gl3_incr_sel | local_rst | por_rstint3_g   |
1319                 tlu_dnrtry3_inst_g; 
1320
1321assign gl_lvl3_new[`TSA_GLOBAL_WIDTH-1:0] =
1322                (gl_rw_g & wsr_inst_g & thread_sel_id_g[3])?
1323                         wsr_gl_lvl3_data[`TSA_GLOBAL_WIDTH-1:0] :
1324               ((local_rst | por_rstint3_g) ? `MAXGL_GL :
1325                   ((tlu_dnrtry3_inst_g) ?
1326                         tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0] :     // done/retry restore
1327                     gl_lvl3[`TSA_GLOBAL_WIDTH-1:0] + gl_lvl3_incr[1:0])); // trap increments
1328*/
1329assign wsr_gl_lvl3_data[`TSA_GLOBAL_WIDTH-1:0] = 
1330            (maxstl_gl_wr_sel[3])? `MAXSTL_GL:
1331           ((maxgl_gl_wr_sel[3]) ? `MAXGL_GL : 
1332            tlu_wsr_data_w_global[`TSA_GLOBAL_WIDTH-1:0]);
1333assign gl_lvl3_update_g[`TSA_GLOBAL_WIDTH-1:0] = 
1334                (gl_rw_g & wsr_inst_g & thread_sel_id_g[3]) ? 
1335                         wsr_gl_lvl3_data[`TSA_GLOBAL_WIDTH-1:0] : 
1336               ((local_rst | por_rstint3_g) ? `MAXGL_GL :
1337                         dnrtry_gl_lvl3_data[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1338                         // tlu_dnrtry_global_g[`TSA_GLOBAL_WIDTH-1:0]);     // done/retry restore
1339
1340dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl_lvl3_update_w2 (
1341     .din (gl_lvl3_update_g[`TSA_GLOBAL_WIDTH-1:0]), 
1342     .q   (gl_lvl3_update_w2[`TSA_GLOBAL_WIDTH-1:0]),
1343     .en  (gl_update_sel_g[3]), 
1344     .clk (clk),
1345     .se  (se),       
1346     .si  (),         
1347     .so  ()
1348);
1349//
1350// modified for bug3468
1351assign gl_incr_sel_w2[3] = 
1352           tlu_thrd_traps_w2[3] & ~(gl_lvl3_at_maxgl | 
1353           (gl_lvl3_at_maxstl & tlu_select_tba_w2));
1354//            tlu_thrd_traps_w2[3] & (~(gl_lvl3_at_maxgl | tlu_select_tba_w2) | 
1355assign gl_update_sel_g[3] = 
1356           (gl_rw_g & wsr_inst_g & thread_sel_id_g[3]) | 
1357                        local_rst |     por_rstint3_g | tlu_dnrtry3_inst_g; 
1358//
1359// modified for bug3468
1360assign gl_priv_max_sel_w2[3] =
1361           (gl_lvl3_at_maxgl & tlu_select_tba_w2) & tlu_thrd_traps_w2[3];
1362//
1363assign gl3_en = 
1364           gl_incr_sel_w2[3] | gl_update_sel_w2[3] | gl_priv_max_sel_w2[3];
1365// assign gl3_en = gl_incr_sel_w2[3] | gl_update_sel_w2[3];
1366
1367assign gl_lvl3_new[`TSA_GLOBAL_WIDTH-1:0] = 
1368           (gl_update_sel_w2[3]) ? gl_lvl3_update_w2:
1369           (~gl_update_sel_w2[3] & gl_priv_max_sel_w2[3]) ? 
1370            `MAXSTL_GL: 
1371            gl_lvl3[`TSA_GLOBAL_WIDTH-1:0] + 2'b01;
1372
1373// Reset required as processor will start out at gl1 after reset.
1374/****************************
1375   to fix bug 6028 manually in the gate netlist, the following needs
1376   to be a mux_flop with recirculating path from q to d0 input. But
1377   to make it resetable, need to brake this recirculating path and
1378   insert an AND gate such that local_rst_l is ANDed with the q output.
1379dffe_s #(`TSA_GLOBAL_WIDTH) dffe_gl3 (
1380     .din (gl_lvl3_new[`TSA_GLOBAL_WIDTH-1:0]),
1381     .q   (gl_lvl3[`TSA_GLOBAL_WIDTH-1:0]),
1382     .en  (gl3_en),
1383     .clk (clk),
1384     .se  (se),       
1385     .si  (),         
1386     .so  ()
1387);
1388******************************/
1389
1390wire [1:0] gl_lvl3_or_rst, gl_lvl3_or_rst_or_new;
1391
1392assign gl_lvl3_or_rst[1:0] = gl_lvl3[1:0] & {2{~local_rst}};
1393
1394assign gl_lvl3_or_rst_or_new[1:0] = (gl3_en&~local_rst) ? gl_lvl3_new[1:0] : gl_lvl3_or_rst[1:0];
1395
1396dff_s    #(2) dffe_gl3 (
1397        .din(gl_lvl3_or_rst_or_new[1:0]) ,
1398        .q(gl_lvl3[1:0]),
1399        .clk (clk), .se(se), .si(), .so());
1400
1401/******************************/
1402
1403assign tlu_gl_lvl3[`TSA_GLOBAL_WIDTH-1:0] = gl_lvl3[`TSA_GLOBAL_WIDTH-1:0];
1404
1405`endif // !`ifdef FPGA_SYN_1THREAD
1406   
1407////////////////////////////////////////////////////////////////////////
1408// Global swap
1409////////////////////////////////////////////////////////////////////////
1410// modified due to timing
1411/*
1412assign agp_thrid[0] = ~tlu_agp_tid_g[0] & ~tlu_agp_tid_g[1] & gl0_en;
1413assign agp_thrid[1] =  tlu_agp_tid_g[0] & ~tlu_agp_tid_g[1] & gl1_en;
1414assign agp_thrid[2] = ~tlu_agp_tid_g[0] &  tlu_agp_tid_g[1] & gl2_en;
1415assign agp_thrid[3] =  tlu_agp_tid_g[0] &  tlu_agp_tid_g[1] & gl3_en;
1416
1417assign agp_swap =
1418           (agp_thrid[0])?
1419               |(gl_lvl0_new[1:0] ^ gl_lvl0[1:0]):
1420               ((agp_thrid[1])?
1421                     |(gl_lvl1_new[1:0] ^ gl_lvl1[1:0]):
1422                     ((agp_thrid[2])?
1423                         |(gl_lvl2_new[1:0] ^ gl_lvl2[1:0]):
1424                         ((agp_thrid[3])?
1425                            |(gl_lvl3_new[1:0] ^ gl_lvl3[1:0]):1'b0)));
1426
1427assign agp_new[1:0] =
1428           (agp_thrid[1])? gl_lvl1_new[1:0] :
1429               ((agp_thrid[2])? gl_lvl2_new[1:0] :
1430                   ((agp_thrid[3])? gl_lvl3_new[1:0] :
1431                        gl_lvl0_new[1:0]));
1432
1433dffr_s dffr_tlu_exu_agp_swap (
1434    .din (agp_swap),
1435    .q   (tlu_exu_agp_swap),
1436    .clk (clk),
1437    .rst (local_rst),
1438    .se  (se),       
1439    .si  (),         
1440    .so  ()
1441);
1442
1443dff_s #(2) dff_tlu_exu_agp (
1444    .din (agp_new[1:0]),
1445    .q   (tlu_exu_agp[1:0]),
1446    .clk (clk),
1447    .se  (se),       
1448    .si  (),         
1449    .so  ()
1450);
1451
1452dff_s #(2) dff_tlu_exu_agp_tid (
1453    .din (tlu_agp_tid_g[1:0]),
1454    .q   (tlu_exu_agp_tid[1:0]),
1455    .clk (clk),
1456    .se  (se),       
1457    .si  (),         
1458    .so  ()
1459);
1460*/
1461
1462assign agp_thrid_w2[0] = ~tlu_agp_tid_w2[0] & ~tlu_agp_tid_w2[1] & gl0_en; 
1463
1464`ifdef FPGA_SYN_1THREAD
1465   assign agp_thrid_w2[1] = 1'b0; 
1466   assign agp_thrid_w2[2] = 1'b0; 
1467   assign agp_thrid_w2[3] = 1'b0; 
1468   assign agp_swap_w2 = (agp_thrid_w2[0])? 
1469                          |(gl_lvl0_new[1:0] ^ gl_lvl0[1:0]):1'b0;
1470   dffr_s dffr_agp_swap_w3 (
1471    .din (agp_swap_w2),
1472    .q   (agp_swap_w3),
1473    .rst (local_rst),
1474    .clk (clk),
1475    .se  (se),
1476    .si  (),
1477    .so ()
1478);
1479
1480   assign agp_new_w2[1:0] = gl_lvl0_new[1:0];
1481   
1482`else
1483   
1484assign agp_thrid_w2[1] =  tlu_agp_tid_w2[0] & ~tlu_agp_tid_w2[1] & gl1_en; 
1485assign agp_thrid_w2[2] = ~tlu_agp_tid_w2[0] &  tlu_agp_tid_w2[1] & gl2_en; 
1486assign agp_thrid_w2[3] =  tlu_agp_tid_w2[0] &  tlu_agp_tid_w2[1] & gl3_en; 
1487   
1488assign agp_swap_w2 = 
1489           (agp_thrid_w2[0])? 
1490               |(gl_lvl0_new[1:0] ^ gl_lvl0[1:0]): 
1491               ((agp_thrid_w2[1])? 
1492                     |(gl_lvl1_new[1:0] ^ gl_lvl1[1:0]): 
1493                     ((agp_thrid_w2[2])? 
1494                         |(gl_lvl2_new[1:0] ^ gl_lvl2[1:0]): 
1495                         ((agp_thrid_w2[3])? 
1496                            |(gl_lvl3_new[1:0] ^ gl_lvl3[1:0]):1'b0)));
1497
1498dffr_s dffr_agp_swap_w3 (
1499    .din (agp_swap_w2),
1500    .q   (agp_swap_w3),
1501    .rst (local_rst),
1502    .clk (clk),
1503    .se  (se),
1504    .si  (),
1505    .so ()
1506);
1507
1508assign agp_new_w2[1:0] = 
1509           (agp_thrid_w2[1])? gl_lvl1_new[1:0] :
1510               ((agp_thrid_w2[2])? gl_lvl2_new[1:0] :
1511                   ((agp_thrid_w2[3])? gl_lvl3_new[1:0] : 
1512                        gl_lvl0_new[1:0])); 
1513`endif // !`ifdef FPGA_SYN_1THREAD
1514
1515//
1516// added for timing fixes
1517dff_s #(2) dff_agp_new_w3 (
1518    .din (agp_new_w2[1:0]),
1519    .q   (agp_new_w3[1:0]),
1520    .clk (clk),
1521    .se  (se),       
1522    .si  (),         
1523    .so  ()
1524);
1525assign tlu_exu_agp_swap = agp_swap_w3;
1526assign tlu_exu_agp[1:0] = agp_new_w3[1:0];
1527
1528////////////////////////////////////////////////////////////////////////
1529// HPSTATE register controls
1530////////////////////////////////////////////////////////////////////////
1531//
1532// added for timing
1533dffr_s #(`TLU_THRD_NUM) dffr_update_hpstate_w2 (
1534    .din (update_hpstate_g[`TLU_THRD_NUM-1:0]),
1535    .q   (update_hpstate_w2[`TLU_THRD_NUM-1:0]),
1536    .rst (local_rst),
1537    .clk (clk),
1538    .se  (se),       
1539    .si  (),         
1540    .so  ()
1541);
1542
1543// thread 0
1544assign tlu_hpstate_din_sel0[0] = dnrtry_inst_w2[0] & ~rst_tri_en; 
1545assign tlu_hpstate_din_sel0[1] = (hpstate_rw_w2 & wsr_inst_w2) & 
1546                                 ~rst_tri_en                   & 
1547                                 ~tlu_hpstate_din_sel0[0]      & 
1548                                  thread_sel_id_w2[0];
1549//
1550// generating write enables to update the hpstate registers
1551// modified for timing
1552/*
1553assign tlu_hpstate_din_sel0[0] = tlu_dnrtry0_inst_g;
1554assign tlu_hpstate_din_sel0[1] = (hpstate_rw_g & wsr_inst_g) &
1555                                 ~tlu_hpstate_din_sel0[0]        & 
1556                                  thread_sel_id_g[0];
1557assign update_hpstate0_g =  tlu_thrd0_traps | tlu_dnrtry0_inst_g |
1558                                  ((hpstate_rw_g & wsr_inst_g) &
1559                            thread_sel_id_g[0]);
1560
1561assign tlu_update_hpstate_l_g[0] = ~(update_hpstate0_g | local_rst);
1562*/
1563assign update_hpstate_g[0] = 
1564           tlu_dnrtry0_inst_g | ((hpstate_rw_g & wsr_inst_g) & 
1565           thread_sel_id_g[0]);
1566
1567assign tlu_update_hpstate_l_w2[0] = 
1568           ~(update_hpstate_w2[0] | local_rst | tlu_thrd_traps_w2[0]);
1569//
1570// thread 1
1571assign tlu_hpstate_din_sel1[0] = dnrtry_inst_w2[1] & ~rst_tri_en;
1572assign tlu_hpstate_din_sel1[1] = (hpstate_rw_w2 & wsr_inst_w2) & 
1573                                 ~rst_tri_en                   & 
1574                                 ~tlu_hpstate_din_sel1[0]      & 
1575                                  thread_sel_id_w2[1];
1576//
1577// generating write enables to update the hpstate registers
1578// modified for timing
1579/*
1580assign tlu_hpstate_din_sel1[0] = tlu_dnrtry1_inst_g;
1581assign tlu_hpstate_din_sel1[1] = (hpstate_rw_g & wsr_inst_g) &
1582                                 ~tlu_hpstate_din_sel1[0]        & 
1583                                  thread_sel_id_g[1];
1584assign update_hpstate1_g =  tlu_thrd1_traps | tlu_dnrtry1_inst_g |
1585                                  ((hpstate_rw_g & wsr_inst_g) &
1586                            thread_sel_id_g[1]);
1587
1588assign tlu_update_hpstate_l_g[1] = ~(update_hpstate1_g | local_rst);
1589*/
1590assign update_hpstate_g[1] = 
1591           tlu_dnrtry1_inst_g | ((hpstate_rw_g & wsr_inst_g) & 
1592           thread_sel_id_g[1]);
1593
1594assign tlu_update_hpstate_l_w2[1] = 
1595           ~(update_hpstate_w2[1] | local_rst | tlu_thrd_traps_w2[1]);
1596//
1597// thread 2
1598assign tlu_hpstate_din_sel2[0] = dnrtry_inst_w2[2] & ~rst_tri_en;
1599assign tlu_hpstate_din_sel2[1] = (hpstate_rw_w2 & wsr_inst_w2) & 
1600                                 ~rst_tri_en                   & 
1601                                 ~tlu_hpstate_din_sel2[0]      & 
1602                                  thread_sel_id_w2[2];
1603//
1604// generating write enables to update the hpstate registers
1605// modified for timing
1606/*
1607assign tlu_hpstate_din_sel2[0] = tlu_dnrtry2_inst_g;
1608assign tlu_hpstate_din_sel2[1] = (hpstate_rw_g & wsr_inst_g) &
1609                                 ~tlu_hpstate_din_sel2[0]        & 
1610                                  thread_sel_id_g[2];
1611assign update_hpstate2_g =  tlu_thrd2_traps | tlu_dnrtry2_inst_g |
1612                                  ((hpstate_rw_g & wsr_inst_g) &
1613                            thread_sel_id_g[2]);
1614
1615assign tlu_update_hpstate_l_g[2] = ~(update_hpstate2_g | local_rst);
1616*/
1617assign update_hpstate_g[2] = 
1618           tlu_dnrtry2_inst_g | ((hpstate_rw_g & wsr_inst_g) & 
1619           thread_sel_id_g[2]);
1620
1621assign tlu_update_hpstate_l_w2[2] = 
1622           ~(update_hpstate_w2[2] | local_rst | tlu_thrd_traps_w2[2]);
1623//
1624// thread 3
1625assign tlu_hpstate_din_sel3[0] = dnrtry_inst_w2[3] & ~rst_tri_en;
1626assign tlu_hpstate_din_sel3[1] = (hpstate_rw_w2 & wsr_inst_w2) & 
1627                                 ~tlu_hpstate_din_sel3[0]      & 
1628                                 ~rst_tri_en                   & 
1629                                  thread_sel_id_w2[3];
1630//
1631// generating write enables to update the hpstate registers
1632// modified for timing
1633/*
1634assign tlu_hpstate_din_sel3[0] = tlu_dnrtry3_inst_g;
1635assign tlu_hpstate_din_sel3[1] = (hpstate_rw_g & wsr_inst_g) &
1636                                 ~tlu_hpstate_din_sel3[0]        & 
1637                                  thread_sel_id_g[3];
1638assign update_hpstate3_g =  tlu_thrd3_traps | tlu_dnrtry3_inst_g |
1639                                  ((hpstate_rw_g & wsr_inst_g) &
1640                            thread_sel_id_g[3]);
1641
1642assign tlu_update_hpstate_l_g[3] = ~(update_hpstate3_g | local_rst);
1643*/
1644assign update_hpstate_g[3] = 
1645           tlu_dnrtry3_inst_g | ((hpstate_rw_g & wsr_inst_g) & 
1646           thread_sel_id_g[3]);
1647
1648assign tlu_update_hpstate_l_w2[3] = 
1649           ~(update_hpstate_w2[3] | local_rst | tlu_thrd_traps_w2[3]);
1650
1651////////////////////////////////////////////////////////////////////////
1652// HTICKCMP register controls
1653////////////////////////////////////////////////////////////////////////
1654// thread 0
1655assign htickcmp_intdis_en[0] = 
1656           (htickcmp_rw_g & wsr_inst_g & thread_sel_id_g[0]) | 
1657            local_rst | por_rstint0_g;
1658//
1659// HTICK_CMP.INT_DIS
1660dffe_s dffe_hintdis0  (
1661     .din (tlu_tick_ctl_din), 
1662     .q   (htick_intdis0),
1663     .en  (htickcmp_intdis_en[0]), 
1664     .clk (clk),
1665     .se  (se),       
1666     .si  (),
1667     .so ()
1668);
1669
1670// thread 1
1671assign htickcmp_intdis_en[1] = 
1672           (htickcmp_rw_g & wsr_inst_g & thread_sel_id_g[1]) |
1673                        local_rst | por_rstint1_g;
1674//
1675// HTICK_CMP.INT_DIS
1676dffe_s dffe_hintdis1  (
1677     .din (tlu_tick_ctl_din), 
1678     .q   (htick_intdis1),
1679     .en  (htickcmp_intdis_en[1]), 
1680     .clk (clk),
1681     .se  (se),       
1682     .si  (),
1683     .so ()
1684);
1685
1686// thread 2
1687assign htickcmp_intdis_en[2] = 
1688           (htickcmp_rw_g & wsr_inst_g & thread_sel_id_g[2]) |
1689                        local_rst | por_rstint2_g;
1690//
1691// HTICK_CMP.INT_DIS
1692dffe_s dffe_hintdis2  (
1693     .din (tlu_tick_ctl_din), 
1694     .q   (htick_intdis2),
1695     .en  (htickcmp_intdis_en[2]), 
1696     .clk (clk),
1697     .se  (se),       
1698     .si  (),
1699     .so ()
1700);
1701
1702// thread 3
1703assign htickcmp_intdis_en[3] = 
1704           (htickcmp_rw_g & wsr_inst_g & thread_sel_id_g[3]) |
1705                        local_rst | por_rstint3_g;
1706// HTICK_CMP.INT_DIS
1707//
1708dffe_s dffe_hintdis3  (
1709     .din (tlu_tick_ctl_din), 
1710     .q   (htick_intdis3),
1711     .en  (htickcmp_intdis_en[3]), 
1712     .clk (clk),
1713     .se  (se),       
1714     .si  (),
1715     .so ()
1716);
1717//
1718// generating for the non-thread specific htick_cmp
1719// interrupt disable
1720assign tlu_htickcmp_intdis =
1721               (thread_sel_id_e[0] & htick_intdis0) | (thread_sel_id_e[1] & htick_intdis1) |
1722                   (thread_sel_id_e[2] & htick_intdis2) | (thread_sel_id_e[3] & htick_intdis3);
1723
1724////////////////////////////////////////////////////////////////////////
1725// HINTP register controls
1726////////////////////////////////////////////////////////////////////////
1727// thread 0
1728//
1729// modified for timing
1730// assign tlu_set_hintp_g[0] =
1731//            (~htick_intdis0 & tlu_tickcmp_sel[0])? tlu_htick_match: 1'b0;
1732assign tlu_set_hintp_sel_g[0] = ~htick_intdis0 & tlu_tickcmp_sel[0];
1733// modified for bug 4886
1734assign tlu_wr_hintp_g[0] = 
1735           (hintp_rw_g & wsr_inst_g & thread_sel_id_g[0]) | local_rst; 
1736//
1737// modified for timing - moved to tlu_tdp
1738// assign tlu_hintp_en_l_g[0] =
1739//            ~(tlu_set_hintp_g[0] | tlu_wr_hintp_g[0]);
1740//
1741// thread 1
1742//
1743// modified for timing
1744// assign tlu_set_hintp_g[1] =
1745//            (~htick_intdis1 & tlu_tickcmp_sel[1])? tlu_htick_match: 1'b0;
1746assign tlu_set_hintp_sel_g[1] = ~htick_intdis1 & tlu_tickcmp_sel[1];
1747assign tlu_wr_hintp_g[1] = 
1748           (hintp_rw_g & wsr_inst_g & thread_sel_id_g[1]) | local_rst; 
1749//
1750// modified for timing - moved to tlu_tdp
1751// assign tlu_hintp_en_l_g[1] =
1752//            ~(tlu_set_hintp_g[1] | tlu_wr_hintp_g[1]);
1753//
1754// thread 2
1755//
1756// modified for timing
1757// assign tlu_set_hintp_g[2] =
1758//            (~htick_intdis2 & tlu_tickcmp_sel[2])? tlu_htick_match: 1'b0;
1759assign tlu_set_hintp_sel_g[2] = ~htick_intdis2 & tlu_tickcmp_sel[2];
1760assign tlu_wr_hintp_g[2] = 
1761           (hintp_rw_g & wsr_inst_g & thread_sel_id_g[2]) | local_rst; 
1762//
1763// modified for timing - moved to tlu_tdp
1764// assign tlu_hintp_en_l_g[2] =
1765//            ~(tlu_set_hintp_g[2] | tlu_wr_hintp_g[2]);
1766//
1767// thread 3
1768//
1769// modified for timing
1770// assign tlu_set_hintp_g[3] =
1771//            (~htick_intdis3 & tlu_tickcmp_sel[3])? tlu_htick_match: 1'b0;
1772assign tlu_set_hintp_sel_g[3] = ~htick_intdis3 & tlu_tickcmp_sel[3];
1773assign tlu_wr_hintp_g[3] = 
1774           (hintp_rw_g & wsr_inst_g & thread_sel_id_g[3]) | local_rst; 
1775//
1776// modified for timing - moved to tlu_tdp
1777// assign tlu_hintp_en_l_g[3] =
1778//            ~(tlu_set_hintp_g[3] | tlu_wr_hintp_g[3]);
1779
1780////////////////////////////////////////////////////////////////////////
1781// HTBA register controls
1782////////////////////////////////////////////////////////////////////////
1783
1784assign tlu_htba_en_l[0] = ~(htba_rw_g & wsr_inst_g & thread_sel_id_g[0]);
1785assign tlu_htba_en_l[1] = ~(htba_rw_g & wsr_inst_g & thread_sel_id_g[1]);
1786assign tlu_htba_en_l[2] = ~(htba_rw_g & wsr_inst_g & thread_sel_id_g[2]);
1787assign tlu_htba_en_l[3] = ~(htba_rw_g & wsr_inst_g & thread_sel_id_g[3]);
1788
1789////////////////////////////////////////////////////////////////////////
1790// ASI QUEUE register controls and data
1791////////////////////////////////////////////////////////////////////////
1792// ASI read or write op
1793//
1794assign asi_queue_write_e = ifu_lsu_alt_space_e & ifu_lsu_st_inst_e;
1795assign asi_queue_read_e  = ifu_lsu_alt_space_e & ifu_lsu_ld_inst_e;
1796//
1797// qualify the asi write and read controls
1798assign asi_queue_write_m = tlu_inst_vld_m & asi_queue_write_pq_m;
1799assign asi_queue_read_m  = tlu_inst_vld_m & asi_queue_read_pq_m;
1800//
1801// modified due to timing violations
1802// assign asi_queue_write_g =
1803//      ~(tlu_flush_pipe_w | ifu_tlu_flush_w) & asi_queue_write_uf_g;
1804assign asi_queue_write_g = 
1805           ~local_flush_all_w & asi_queue_write_uf_g;
1806assign tlu_asi_write_g = asi_queue_write_g;
1807
1808// assign asi_queue_read_g  =
1809//     ~(tlu_flush_pipe_w | ifu_tlu_flush_w) & asi_queue_read_uf_g;
1810//
1811// staging the asi controls
1812dffr_s #(2) dffr_asi_ctl_m (
1813    .din ({asi_queue_write_e, asi_queue_read_e}),
1814    .q   ({asi_queue_write_pq_m, asi_queue_read_pq_m}),
1815    .rst (local_rst),
1816    .clk (clk),
1817    .se  (se),       
1818    .si  (),         
1819    .so  ()
1820);
1821
1822dffr_s #(2) dffr_asi_ctl_g (
1823    .din ({asi_queue_write_m, asi_queue_read_m}),
1824    .q   ({asi_queue_write_uf_g, asi_queue_read_g}),
1825    .rst (local_rst),
1826    .clk (clk),
1827    .se  (se),       
1828    .si  (),         
1829    .so  ()
1830);
1831//
1832// ASI address decode
1833// decoding the ASI state 0x25 for the ASI_QUEUES
1834assign asi_queue_rw_e = 
1835          (ifu_lsu_alt_space_e)? 
1836          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`TLU_ASI_QUE_ASI):
1837           1'b0;
1838//
1839// staging the asi controls
1840dffr_s dffr_asi_queue_rw_m (
1841    .din (asi_queue_rw_e),
1842    .q   (asi_queue_rw_m),
1843    .rst (local_rst),
1844    .clk (clk),
1845    .se  (se),       
1846    .si  (),         
1847    .so  ()
1848);
1849
1850dffr_s dffr_asi_queue_rw_g (
1851    .din (asi_queue_rw_m),
1852    .q   (asi_queue_rw_g),
1853    .rst (local_rst),
1854    .clk (clk),
1855    .se  (se),       
1856    .si  (),         
1857    .so  ()
1858);
1859//
1860// modified due to timing violations
1861/*
1862// assign tlu_ldst_va_e[`TLU_ASI_VA_WIDTH-1:0] =
1863//          exu_lsu_ldst_va_e[`TLU_ASI_VA_WIDTH-1:0]; 
1864dff_s #(`TLU_ASI_VA_WIDTH) dff_tlu_ldst_va_m (
1865    .din (exu_lsu_ldst_va_e[`TLU_ASI_VA_WIDTH-1:0]),
1866    .q   (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]),
1867    .clk (clk),
1868    .se  (se),       
1869    .si  (),         
1870    .so  ()
1871);
1872
1873// modified for timing
1874assign que_legal_va_e =
1875           cpu_mondo_head_rw_e  | cpu_mondo_tail_rw_e |
1876           dev_mondo_head_rw_e  | dev_mondo_tail_rw_e |
1877           resum_err_head_rw_e  | resum_err_tail_rw_e |
1878           nresum_err_head_rw_e | nresum_err_tail_rw_e;
1879
1880assign que_ill_va_e =
1881           (ifu_lsu_alt_space_e)?
1882           (((|exu_lsu_ldst_va_e[`ASI_VA_WIDTH-1:`TLU_ASI_QUE_VA_HI+1]) |
1883           (|exu_lsu_ldst_va_e[`TLU_ASI_QUE_VA_LO-1:0]) | ~que_legal_va_e) &
1884            asi_queue_pq_rw_e): 1'b0;
1885*/
1886assign tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0] = 
1887           lsu_tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0];
1888
1889assign que_legal_va_m = 
1890           cpu_mondo_head_rw_m  | cpu_mondo_tail_rw_m |
1891           dev_mondo_head_rw_m  | dev_mondo_tail_rw_m |
1892           resum_err_head_rw_m  | resum_err_tail_rw_m |
1893           nresum_err_head_rw_m | nresum_err_tail_rw_m; 
1894
1895//
1896// illegal range check for queue va
1897assign que_ill_va_m = 
1898           (asi_queue_rw_m)? ~que_legal_va_m : 1'b0;
1899//
1900// staged illegal va range
1901//
1902dffr_s dffr_que_ill_va_g (
1903    .din (que_ill_va_m),
1904    .q   (que_ill_va_g),
1905    .rst (local_rst),
1906    .clk (clk),
1907    .se  (se),       
1908    .si  (),         
1909    .so  ()
1910);
1911//
1912// added for timing - interrupt register decodes
1913// interrupt receiver registers
1914assign asi_inrr_rw_e = 
1915          (ifu_lsu_alt_space_e)? 
1916          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`TLU_INRR_ASI):
1917           1'b0;
1918
1919dffr_s dffr_asi_inrr_rw_m (
1920    .din (asi_inrr_rw_e),
1921    .q   (asi_inrr_rw_m),
1922    .rst (local_rst),
1923    .clk (clk),
1924    .se  (se),       
1925    .si  (),         
1926    .so  ()
1927);
1928
1929dffr_s dffr_asi_inrr_rw_g (
1930    .din (asi_inrr_rw_m),
1931    .q   (asi_inrr_rw_g),
1932    .rst (local_rst),
1933    .clk (clk),
1934    .se  (se),       
1935    .si  (),         
1936    .so  ()
1937);
1938
1939assign inc_ind_asi_wr_inrr[0] = 
1940           (asi_inrr_rw_g & asi_queue_write_uf_g   & 
1941           ~local_flush_all_w & thread_sel_id_g[0]);
1942assign inc_ind_asi_wr_inrr[1] = 
1943           (asi_inrr_rw_g & asi_queue_write_uf_g   & 
1944           ~local_flush_all_w & thread_sel_id_g[1]);
1945assign inc_ind_asi_wr_inrr[2] = 
1946           (asi_inrr_rw_g & asi_queue_write_uf_g   & 
1947           ~local_flush_all_w & thread_sel_id_g[2]);
1948assign inc_ind_asi_wr_inrr[3] = 
1949           (asi_inrr_rw_g & asi_queue_write_uf_g   & 
1950           ~local_flush_all_w & thread_sel_id_g[3]);
1951//
1952// interrupt dispatch registers
1953assign asi_indr_rw_e = 
1954          (ifu_lsu_alt_space_e)? 
1955          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`TLU_INDR_ASI):
1956           1'b0;
1957
1958dffr_s dffr_asi_indr_rw_m (
1959    .din (asi_indr_rw_e),
1960    .q   (asi_indr_rw_m),
1961    .rst (local_rst),
1962    .clk (clk),
1963    .se  (se),       
1964    .si  (),         
1965    .so  ()
1966);
1967
1968dffr_s dffr_asi_indr_rw_g (
1969    .din (asi_indr_rw_m),
1970    .q   (asi_indr_rw_g),
1971    .rst (local_rst),
1972    .clk (clk),
1973    .se  (se),       
1974    .si  (),         
1975    .so  ()
1976);
1977
1978assign inc_ind_asi_wr_indr[0] = 
1979           asi_indr_rw_g & ~local_flush_all_w & asi_queue_write_uf_g & 
1980           thread_sel_id_g[0];
1981assign inc_ind_asi_wr_indr[1] = 
1982           asi_indr_rw_g & ~local_flush_all_w & asi_queue_write_uf_g & 
1983           thread_sel_id_g[1];
1984assign inc_ind_asi_wr_indr[2] = 
1985           asi_indr_rw_g & ~local_flush_all_w & asi_queue_write_uf_g & 
1986           thread_sel_id_g[2];
1987assign inc_ind_asi_wr_indr[3] = 
1988           asi_indr_rw_g & ~local_flush_all_w & asi_queue_write_uf_g & 
1989           thread_sel_id_g[3];
1990
1991//
1992// interrupt vector registers
1993assign asi_invr_rw_e = 
1994          (ifu_lsu_alt_space_e)? 
1995          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`TLU_INVR_ASI):
1996           1'b0;
1997
1998dffr_s dffr_asi_invr_rw_m (
1999    .din (asi_invr_rw_e),
2000    .q   (asi_invr_rw_m),
2001    .rst (local_rst),
2002    .clk (clk),
2003    .se  (se),       
2004    .si  (),         
2005    .so  ()
2006);
2007
2008dffr_s dffr_asi_invr_rw_g (
2009    .din (asi_invr_rw_m),
2010    .q   (asi_invr_rw_g),
2011    .rst (local_rst),
2012    .clk (clk),
2013    .se  (se),       
2014    .si  (),         
2015    .so  ()
2016);
2017
2018assign inc_ind_asi_rd_invr[0] = 
2019           (asi_invr_rw_g & asi_queue_read_g & 
2020           ~local_flush_all_w & thread_sel_id_g[0]);
2021assign inc_ind_asi_rd_invr[1] = 
2022           (asi_invr_rw_g & asi_queue_read_g & 
2023           ~local_flush_all_w & thread_sel_id_g[1]);
2024assign inc_ind_asi_rd_invr[2] = 
2025           (asi_invr_rw_g & asi_queue_read_g & 
2026           ~local_flush_all_w & thread_sel_id_g[2]);
2027assign inc_ind_asi_rd_invr[3] = 
2028           (asi_invr_rw_g & asi_queue_read_g & 
2029           ~local_flush_all_w & thread_sel_id_g[3]);
2030//
2031// timing changes: all va e stage signals have been moved to m-stage
2032// decoding the VA portion of the ASI address
2033// cpu_mondo_head: 0x3c0
2034assign cpu_mondo_head_rw_m = 
2035          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`CPU_MONDO_HEAD);
2036//
2037// cpu_mondo_tail: 0x3c8
2038assign cpu_mondo_tail_rw_m = 
2039          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`CPU_MONDO_TAIL);
2040//
2041// dev_mondo_head: 0x3d0
2042assign dev_mondo_head_rw_m = 
2043          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`DEV_MONDO_HEAD);
2044//
2045// dev_mondo_tail: 0x3d8
2046assign dev_mondo_tail_rw_m = 
2047          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`DEV_MONDO_TAIL);
2048//
2049// resum_err_head: 0x3e0
2050assign resum_err_head_rw_m = 
2051          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`RESUM_ERR_HEAD);
2052//
2053// resum_err_tail: 0x3e8
2054assign resum_err_tail_rw_m = 
2055          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`RESUM_ERR_TAIL);
2056//
2057// nresum_err_head: 0x3f0
2058assign nresum_err_head_rw_m = 
2059          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`NRESUM_ERR_HEAD);
2060//
2061// nresum_err_tail: 0x3f8
2062assign nresum_err_tail_rw_m = 
2063          (tlu_ldst_va_m[`TLU_ASI_VA_WIDTH-1:0]==`NRESUM_ERR_TAIL);
2064//
2065// timing change: replaced by flopped tlu_ldst_va_m decodes
2066// staging the ASI queue rw decodes
2067// cpu_mondo_head
2068/*
2069dff_s dff_cpu_mondo_head_rw_m (
2070     .din (cpu_mondo_head_rw_e),
2071     .q   (cpu_mondo_head_rw_m),
2072     .clk (clk),
2073     .se  (se),       
2074     .si  (),         
2075     .so  ()
2076);
2077
2078dff_s dff_dev_mondo_head_rw_m (
2079     .din (dev_mondo_head_rw_e),
2080     .q   (dev_mondo_head_rw_m),
2081     .clk (clk),
2082     .se  (se),       
2083     .si  (),         
2084     .so  ()
2085);
2086
2087dff_s dff_resum_err_head_rw_m (
2088     .din (resum_err_head_rw_e),
2089     .q   (resum_err_head_rw_m),
2090     .clk (clk),
2091     .se  (se),       
2092     .si  (),         
2093     .so  ()
2094);
2095
2096dff_s dff_nresum_err_head_rw_m (
2097     .din (nresum_err_head_rw_e),
2098     .q   (nresum_err_head_rw_m),
2099     .clk (clk),
2100     .se  (se),       
2101     .si  (),         
2102     .so  ()
2103);
2104
2105dff_s dff_cpu_mondo_tail_rw_m (
2106     .din (cpu_mondo_tail_rw_e),
2107     .q   (cpu_mondo_tail_rw_m),
2108     .clk (clk),
2109     .se  (se),       
2110     .si  (),         
2111     .so  ()
2112);
2113
2114dff_s dff_dev_mondo_tail_rw_m (
2115     .din (dev_mondo_tail_rw_e),
2116     .q   (dev_mondo_tail_rw_m),
2117     .clk (clk),
2118     .se  (se),       
2119     .si  (),         
2120     .so  ()
2121);
2122
2123dff_s dff_resum_err_tail_rw_m (
2124     .din (resum_err_tail_rw_e),
2125     .q   (resum_err_tail_rw_m),
2126     .clk (clk),
2127     .se  (se),       
2128     .si  (),         
2129     .so  ()
2130);
2131
2132dff_s dff_nresum_err_tail_rw_m (
2133     .din (nresum_err_tail_rw_e),
2134     .q   (nresum_err_tail_rw_m),
2135     .clk (clk),
2136     .se  (se),       
2137     .si  (),         
2138     .so  ()
2139);
2140//
2141// illegal range check
2142dffr_s dffr_que_ill_va_m (
2143    .din (que_ill_va_e),
2144    .q   (que_ill_va_m),
2145    .rst (local_rst),
2146    .clk (clk),
2147    .se  (se),       
2148    .si  (),         
2149    .so  ()
2150);
2151*/
2152
2153// staging the ASI queue rw decodes
2154// cpu_mondo_head
2155dff_s dff_cpu_mondo_head_rw_g (
2156     .din (cpu_mondo_head_rw_m), 
2157     .q   (cpu_mondo_head_rw_g),
2158     .clk (clk),
2159     .se  (se),       
2160     .si  (),         
2161     .so  ()
2162);
2163//
2164// dev_mondo_head
2165dff_s dff_dev_mondo_head_rw_g (
2166     .din (dev_mondo_head_rw_m), 
2167     .q   (dev_mondo_head_rw_g),
2168     .clk (clk),
2169     .se  (se),       
2170     .si  (),         
2171     .so  ()
2172);
2173//
2174// resum_err_head
2175dff_s dff_resum_err_head_rw_g (
2176     .din (resum_err_head_rw_m), 
2177     .q   (resum_err_head_rw_g),
2178     .clk (clk),
2179     .se  (se),       
2180     .si  (),         
2181     .so  ()
2182);
2183//
2184// nresum_err_head
2185dff_s dff_nresum_err_head_rw_g (
2186     .din (nresum_err_head_rw_m), 
2187     .q   (nresum_err_head_rw_g),
2188     .clk (clk),
2189     .se  (se),       
2190     .si  (),         
2191     .so  ()
2192);
2193//
2194// cpu_mondo_tail
2195//
2196dff_s dff_cpu_mondo_tail_rw_g (
2197     .din (cpu_mondo_tail_rw_m), 
2198     .q   (cpu_mondo_tail_rw_g),
2199     .clk (clk),
2200     .se  (se),       
2201     .si  (),         
2202     .so  ()
2203);
2204//
2205// dev_mondo_tail
2206//
2207dff_s dff_dev_mondo_tail_rw_g (
2208     .din (dev_mondo_tail_rw_m), 
2209     .q   (dev_mondo_tail_rw_g),
2210     .clk (clk),
2211     .se  (se),       
2212     .si  (),         
2213     .so  ()
2214);
2215//
2216// resum_err_tail
2217//
2218dff_s dff_resum_err_tail_rw_g (
2219     .din (resum_err_tail_rw_m), 
2220     .q   (resum_err_tail_rw_g),
2221     .clk (clk),
2222     .se  (se),       
2223     .si  (),         
2224     .so  ()
2225);
2226//
2227// nresum_err_tail
2228//
2229dff_s dff_nresum_err_tail_rw_g (
2230     .din (nresum_err_tail_rw_m), 
2231     .q   (nresum_err_tail_rw_g),
2232     .clk (clk),
2233     .se  (se),       
2234     .si  (),         
2235     .so  ()
2236);
2237//
2238// generating thread specific read and write enables 
2239//
2240// cpu_mondo_head read
2241// assign cpu_mondo_head_rd_g[0] =
2242//            asi_queue_read_g & cpu_mondo_head_rw_g &
2243//            asi_queue_rw_g   & thread_sel_id_g[0];
2244assign cpu_mondo_head_rd_g[0] = 
2245           ~(|cpu_mondo_head_rd_g[3:1]);
2246assign cpu_mondo_head_rd_g[1] = 
2247           asi_queue_read_g & cpu_mondo_head_rw_g & 
2248           asi_queue_rw_g   & thread_sel_id_g[1];
2249assign cpu_mondo_head_rd_g[2] = 
2250           asi_queue_read_g & cpu_mondo_head_rw_g & 
2251           asi_queue_rw_g   & thread_sel_id_g[2];
2252assign cpu_mondo_head_rd_g[3] = 
2253           asi_queue_read_g & cpu_mondo_head_rw_g & 
2254           asi_queue_rw_g   & thread_sel_id_g[3];
2255//
2256// non-thread specific read
2257assign cpu_mondo_hd_rd_g = 
2258           asi_queue_read_g & cpu_mondo_head_rw_g & 
2259           asi_queue_rw_g;
2260//
2261// cpu_mondo_head write
2262//
2263assign cpu_mondo_head_wr_g[0] = 
2264           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_head_rw_g & 
2265           asi_queue_rw_g & thread_sel_id_g[0];
2266assign cpu_mondo_head_wr_g[1] = 
2267           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_head_rw_g & 
2268           asi_queue_rw_g & thread_sel_id_g[1];
2269assign cpu_mondo_head_wr_g[2] = 
2270           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_head_rw_g & 
2271           asi_queue_rw_g & thread_sel_id_g[2];
2272assign cpu_mondo_head_wr_g[3] = 
2273           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_head_rw_g & 
2274           asi_queue_rw_g & thread_sel_id_g[3];
2275//
2276// cpu_mondo_tail read
2277// assign cpu_mondo_tail_rd_g[0] =
2278//            asi_queue_read_g & cpu_mondo_tail_rw_g &
2279//            asi_queue_rw_g   & thread_sel_id_g[0];
2280assign cpu_mondo_tail_rd_g[0] = 
2281           ~(|cpu_mondo_tail_rd_g[3:1]);
2282assign cpu_mondo_tail_rd_g[1] = 
2283           asi_queue_read_g & cpu_mondo_tail_rw_g & 
2284           asi_queue_rw_g   & thread_sel_id_g[1];
2285assign cpu_mondo_tail_rd_g[2] = 
2286           asi_queue_read_g & cpu_mondo_tail_rw_g & 
2287           asi_queue_rw_g   & thread_sel_id_g[2];
2288assign cpu_mondo_tail_rd_g[3] = 
2289           asi_queue_read_g & cpu_mondo_tail_rw_g & 
2290           asi_queue_rw_g   & thread_sel_id_g[3];
2291//
2292// non-thread specific read
2293assign cpu_mondo_ta_rd_g = 
2294           asi_queue_read_g & cpu_mondo_tail_rw_g & 
2295           asi_queue_rw_g;
2296//
2297// cpu_mondo_tail write
2298//
2299assign cpu_mondo_tail_wr_g[0] = 
2300           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_tail_rw_g & 
2301           asi_queue_rw_g & thread_sel_id_g[0];
2302assign cpu_mondo_tail_wr_g[1] = 
2303           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_tail_rw_g & 
2304           asi_queue_rw_g & thread_sel_id_g[1];
2305assign cpu_mondo_tail_wr_g[2] = 
2306           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_tail_rw_g & 
2307           asi_queue_rw_g & thread_sel_id_g[2];
2308assign cpu_mondo_tail_wr_g[3] = 
2309           ~local_flush_all_w & asi_queue_write_uf_g & cpu_mondo_tail_rw_g & 
2310           asi_queue_rw_g & thread_sel_id_g[3];
2311//
2312// dev_mondo_head read
2313// assign dev_mondo_head_rd_g[0] =
2314//            asi_queue_read_g & dev_mondo_head_rw_g &
2315//            asi_queue_rw_g   & thread_sel_id_g[0];
2316assign dev_mondo_head_rd_g[0] = 
2317           ~(|dev_mondo_head_rd_g[3:1]);
2318assign dev_mondo_head_rd_g[1] = 
2319           asi_queue_read_g & dev_mondo_head_rw_g & 
2320           asi_queue_rw_g   & thread_sel_id_g[1];
2321assign dev_mondo_head_rd_g[2] = 
2322           asi_queue_read_g & dev_mondo_head_rw_g & 
2323           asi_queue_rw_g   & thread_sel_id_g[2];
2324assign dev_mondo_head_rd_g[3] = 
2325           asi_queue_read_g & dev_mondo_head_rw_g & 
2326           asi_queue_rw_g   & thread_sel_id_g[3];
2327//
2328// non-thread specific read
2329assign dev_mondo_hd_rd_g = 
2330           asi_queue_read_g & dev_mondo_head_rw_g & 
2331           asi_queue_rw_g;
2332//
2333// dev_mondo_head write
2334//
2335assign dev_mondo_head_wr_g[0] = 
2336           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_head_rw_g & 
2337           asi_queue_rw_g & thread_sel_id_g[0];
2338assign dev_mondo_head_wr_g[1] = 
2339           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_head_rw_g & 
2340           asi_queue_rw_g & thread_sel_id_g[1];
2341assign dev_mondo_head_wr_g[2] = 
2342           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_head_rw_g & 
2343           asi_queue_rw_g & thread_sel_id_g[2];
2344assign dev_mondo_head_wr_g[3] = 
2345           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_head_rw_g & 
2346           asi_queue_rw_g & thread_sel_id_g[3];
2347//
2348// dev_mondo_tail read
2349// assign dev_mondo_tail_rd_g[0] =
2350//            asi_queue_read_g & dev_mondo_tail_rw_g &
2351//            asi_queue_rw_g   & thread_sel_id_g[0];
2352assign dev_mondo_tail_rd_g[0] = 
2353           ~(|dev_mondo_tail_rd_g[3:1]);
2354assign dev_mondo_tail_rd_g[1] = 
2355           asi_queue_read_g & dev_mondo_tail_rw_g & 
2356           asi_queue_rw_g   & thread_sel_id_g[1];
2357assign dev_mondo_tail_rd_g[2] = 
2358           asi_queue_read_g & dev_mondo_tail_rw_g & 
2359           asi_queue_rw_g   & thread_sel_id_g[2];
2360assign dev_mondo_tail_rd_g[3] = 
2361           asi_queue_read_g & dev_mondo_tail_rw_g & 
2362           asi_queue_rw_g   & thread_sel_id_g[3];
2363//
2364// non-thread specific read
2365assign dev_mondo_ta_rd_g = 
2366           asi_queue_read_g & dev_mondo_tail_rw_g & 
2367           asi_queue_rw_g;
2368//
2369// dev_mondo_tail write
2370//
2371assign dev_mondo_tail_wr_g[0] = 
2372           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_tail_rw_g & 
2373           asi_queue_rw_g & thread_sel_id_g[0];
2374assign dev_mondo_tail_wr_g[1] = 
2375           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_tail_rw_g & 
2376           asi_queue_rw_g & thread_sel_id_g[1];
2377assign dev_mondo_tail_wr_g[2] = 
2378           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_tail_rw_g & 
2379           asi_queue_rw_g & thread_sel_id_g[2];
2380assign dev_mondo_tail_wr_g[3] = 
2381           ~local_flush_all_w & asi_queue_write_uf_g & dev_mondo_tail_rw_g & 
2382           asi_queue_rw_g & thread_sel_id_g[3];
2383//
2384// resum_err_head read
2385// assign resum_err_head_rd_g[0] =
2386//            asi_queue_read_g & resum_err_head_rw_g &
2387//            asi_queue_rw_g   & thread_sel_id_g[0];
2388assign resum_err_head_rd_g[0] = 
2389           ~(|resum_err_head_rd_g[3:1]);
2390assign resum_err_head_rd_g[1] = 
2391           asi_queue_read_g & resum_err_head_rw_g & 
2392           asi_queue_rw_g   & thread_sel_id_g[1];
2393assign resum_err_head_rd_g[2] = 
2394           asi_queue_read_g & resum_err_head_rw_g & 
2395           asi_queue_rw_g   & thread_sel_id_g[2];
2396assign resum_err_head_rd_g[3] = 
2397           asi_queue_read_g & resum_err_head_rw_g & 
2398           asi_queue_rw_g   & thread_sel_id_g[3];
2399//
2400// non-thread specific read
2401assign resum_err_hd_rd_g = 
2402           asi_queue_read_g & resum_err_head_rw_g & 
2403           asi_queue_rw_g;
2404//
2405// resum_err_head write
2406//
2407assign resum_err_head_wr_g[0] = 
2408           asi_queue_write_g & resum_err_head_rw_g & 
2409           asi_queue_rw_g    & thread_sel_id_g[0];
2410assign resum_err_head_wr_g[1] = 
2411           asi_queue_write_g & resum_err_head_rw_g & 
2412           asi_queue_rw_g    & thread_sel_id_g[1];
2413assign resum_err_head_wr_g[2] = 
2414           asi_queue_write_g & resum_err_head_rw_g & 
2415           asi_queue_rw_g    & thread_sel_id_g[2];
2416assign resum_err_head_wr_g[3] = 
2417           asi_queue_write_g & resum_err_head_rw_g & 
2418           asi_queue_rw_g    & thread_sel_id_g[3];
2419//
2420// resum_err_tail read
2421// assign resum_err_tail_rd_g[0] =
2422//            asi_queue_read_g & resum_err_tail_rw_g &
2423//            asi_queue_rw_g   & thread_sel_id_g[0];
2424assign resum_err_tail_rd_g[0] = 
2425           ~(|resum_err_tail_rd_g[3:1]);
2426assign resum_err_tail_rd_g[1] = 
2427           asi_queue_read_g & resum_err_tail_rw_g & 
2428           asi_queue_rw_g   & thread_sel_id_g[1];
2429assign resum_err_tail_rd_g[2] = 
2430           asi_queue_read_g & resum_err_tail_rw_g & 
2431           asi_queue_rw_g   & thread_sel_id_g[2];
2432assign resum_err_tail_rd_g[3] = 
2433           asi_queue_read_g & resum_err_tail_rw_g & 
2434           asi_queue_rw_g   & thread_sel_id_g[3];
2435//
2436// non-thread specific read
2437assign resum_err_ta_rd_g = 
2438           asi_queue_read_g & resum_err_tail_rw_g & 
2439           asi_queue_rw_g;
2440//
2441// resum_err_tail write
2442//
2443assign resum_err_tail_wr_g[0] = 
2444           asi_queue_write_g & resum_err_tail_rw_g & 
2445           asi_queue_rw_g    & thread_sel_id_g[0];
2446assign resum_err_tail_wr_g[1] = 
2447           asi_queue_write_g & resum_err_tail_rw_g & 
2448           asi_queue_rw_g    & thread_sel_id_g[1];
2449assign resum_err_tail_wr_g[2] = 
2450           asi_queue_write_g & resum_err_tail_rw_g & 
2451           asi_queue_rw_g    & thread_sel_id_g[2];
2452assign resum_err_tail_wr_g[3] = 
2453           asi_queue_write_g & resum_err_tail_rw_g & 
2454           asi_queue_rw_g    & thread_sel_id_g[3];
2455//
2456// nresum_err_head read
2457// assign nresum_err_head_rd_g[0] =
2458//            asi_queue_read_g & nresum_err_head_rw_g &
2459//            asi_queue_rw_g   & thread_sel_id_g[0];
2460assign nresum_err_head_rd_g[0] = 
2461           ~(|nresum_err_head_rd_g[3:1]);
2462assign nresum_err_head_rd_g[1] = 
2463           asi_queue_read_g & nresum_err_head_rw_g & 
2464           asi_queue_rw_g   & thread_sel_id_g[1];
2465assign nresum_err_head_rd_g[2] = 
2466           asi_queue_read_g & nresum_err_head_rw_g & 
2467           asi_queue_rw_g   & thread_sel_id_g[2];
2468assign nresum_err_head_rd_g[3] = 
2469           asi_queue_read_g & nresum_err_head_rw_g & 
2470           asi_queue_rw_g   & thread_sel_id_g[3];
2471//
2472// non-thread specific read
2473assign nresum_err_hd_rd_g = 
2474           asi_queue_read_g & nresum_err_head_rw_g & 
2475           asi_queue_rw_g;
2476//
2477// nresum_err_head write
2478//
2479assign nresum_err_head_wr_g[0] = 
2480           asi_queue_write_g & nresum_err_head_rw_g & 
2481           asi_queue_rw_g    & thread_sel_id_g[0];
2482assign nresum_err_head_wr_g[1] = 
2483           asi_queue_write_g & nresum_err_head_rw_g & 
2484           asi_queue_rw_g    & thread_sel_id_g[1];
2485assign nresum_err_head_wr_g[2] = 
2486           asi_queue_write_g & nresum_err_head_rw_g & 
2487           asi_queue_rw_g    & thread_sel_id_g[2];
2488assign nresum_err_head_wr_g[3] = 
2489           asi_queue_write_g & nresum_err_head_rw_g & 
2490           asi_queue_rw_g    & thread_sel_id_g[3];
2491//
2492// nresum_err_tail read
2493// assign nresum_err_tail_rd_g[0] =
2494//            asi_queue_read_g & nresum_err_tail_rw_g &
2495//            asi_queue_rw_g   & thread_sel_id_g[0];
2496assign nresum_err_tail_rd_g[0] = 
2497           ~(|nresum_err_tail_rd_g[3:1]);
2498assign nresum_err_tail_rd_g[1] = 
2499           asi_queue_read_g & nresum_err_tail_rw_g & 
2500           asi_queue_rw_g   & thread_sel_id_g[1];
2501assign nresum_err_tail_rd_g[2] = 
2502           asi_queue_read_g & nresum_err_tail_rw_g & 
2503           asi_queue_rw_g   & thread_sel_id_g[2];
2504assign nresum_err_tail_rd_g[3] = 
2505           asi_queue_read_g & nresum_err_tail_rw_g & 
2506           asi_queue_rw_g   & thread_sel_id_g[3];
2507//
2508// non-thread specific read
2509assign nresum_err_ta_rd_g = 
2510           asi_queue_read_g & nresum_err_tail_rw_g & 
2511           asi_queue_rw_g;
2512//
2513// nresum_err_tail write
2514//
2515assign nresum_err_tail_wr_g[0] = 
2516           asi_queue_write_g & nresum_err_tail_rw_g & 
2517           asi_queue_rw_g    & thread_sel_id_g[0];
2518assign nresum_err_tail_wr_g[1] = 
2519           asi_queue_write_g & nresum_err_tail_rw_g & 
2520           asi_queue_rw_g    & thread_sel_id_g[1];
2521assign nresum_err_tail_wr_g[2] = 
2522           asi_queue_write_g & nresum_err_tail_rw_g & 
2523           asi_queue_rw_g    & thread_sel_id_g[2];
2524assign nresum_err_tail_wr_g[3] = 
2525           asi_queue_write_g & nresum_err_tail_rw_g & 
2526           asi_queue_rw_g    & thread_sel_id_g[3];
2527//
2528// storing the head and pointers for the queues
2529// thread 0
2530//
2531dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo0_head (
2532     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2533     .q   (cpu_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2534     .en  (cpu_mondo_head_wr_g[0]), 
2535     .clk (clk),
2536     .se  (se),       
2537     .si  (),         
2538     .so  ()
2539);
2540
2541dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo0_tail (
2542     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2543     .q   (cpu_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2544     .en  (cpu_mondo_tail_wr_g[0]), 
2545     .clk (clk),
2546     .se  (se),       
2547     .si  (),         
2548     .so  ()
2549);
2550
2551dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo0_head (
2552     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2553     .q   (dev_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2554     .en  (dev_mondo_head_wr_g[0]), 
2555     .clk (clk),
2556     .se  (se),       
2557     .si  (),         
2558     .so  ()
2559);
2560
2561dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo0_tail (
2562     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2563     .q   (dev_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2564     .en  (dev_mondo_tail_wr_g[0]), 
2565     .clk (clk),
2566     .se  (se),       
2567     .si  (),         
2568     .so  ()
2569);
2570
2571dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err0_head (
2572     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2573     .q   (resum_err0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2574     .en  (resum_err_head_wr_g[0]), 
2575     .clk (clk),
2576     .se  (se),       
2577     .si  (),         
2578     .so  ()
2579);
2580
2581dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err0_tail (
2582     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2583     .q   (resum_err0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2584     .en  (resum_err_tail_wr_g[0]), 
2585     .clk (clk),
2586     .se  (se),       
2587     .si  (),         
2588     .so  ()
2589);
2590
2591dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err0_head (
2592     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2593     .q   (nresum_err0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2594     .en  (nresum_err_head_wr_g[0]), 
2595     .clk (clk),
2596     .se  (se),       
2597     .si  (),         
2598     .so  ()
2599);
2600
2601dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err0_tail (
2602     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2603     .q   (nresum_err0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2604     .en  (nresum_err_tail_wr_g[0]), 
2605     .clk (clk),
2606     .se  (se),       
2607     .si  (),         
2608     .so  ()
2609);
2610//
2611// thread 1
2612//
2613dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo1_head (
2614     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2615     .q   (cpu_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2616     .en  (cpu_mondo_head_wr_g[1]), 
2617     .clk (clk),
2618     .se  (se),       
2619     .si  (),         
2620     .so  ()
2621);
2622
2623dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo1_tail (
2624     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2625     .q   (cpu_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2626     .en  (cpu_mondo_tail_wr_g[1]), 
2627     .clk (clk),
2628     .se  (se),       
2629     .si  (),         
2630     .so  ()
2631);
2632
2633dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo1_head (
2634     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2635     .q   (dev_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2636     .en  (dev_mondo_head_wr_g[1]), 
2637     .clk (clk),
2638     .se  (se),       
2639     .si  (),         
2640     .so  ()
2641);
2642
2643dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo1_tail (
2644     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2645     .q   (dev_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2646     .en  (dev_mondo_tail_wr_g[1]), 
2647     .clk (clk),
2648     .se  (se),       
2649     .si  (),         
2650     .so  ()
2651);
2652
2653dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err1_head (
2654     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2655     .q   (resum_err1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2656     .en  (resum_err_head_wr_g[1]), 
2657     .clk (clk),
2658     .se  (se),       
2659     .si  (),         
2660     .so  ()
2661);
2662
2663dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err1_tail (
2664     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2665     .q   (resum_err1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2666     .en  (resum_err_tail_wr_g[1]), 
2667     .clk (clk),
2668     .se  (se),       
2669     .si  (),         
2670     .so  ()
2671);
2672
2673dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err1_head (
2674     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2675     .q   (nresum_err1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2676     .en  (nresum_err_head_wr_g[1]), 
2677     .clk (clk),
2678     .se  (se),       
2679     .si  (),         
2680     .so  ()
2681);
2682
2683dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err1_tail (
2684     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2685     .q   (nresum_err1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2686     .en  (nresum_err_tail_wr_g[1]), 
2687     .clk (clk),
2688     .se  (se),       
2689     .si  (),         
2690     .so  ()
2691);
2692//
2693// thread 2
2694//
2695dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo2_head (
2696     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2697     .q   (cpu_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2698     .en  (cpu_mondo_head_wr_g[2]), 
2699     .clk (clk),
2700     .se  (se),       
2701     .si  (),         
2702     .so  ()
2703);
2704
2705dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo2_tail (
2706     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2707     .q   (cpu_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2708     .en  (cpu_mondo_tail_wr_g[2]), 
2709     .clk (clk),
2710     .se  (se),       
2711     .si  (),         
2712     .so  ()
2713);
2714
2715dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo2_head (
2716     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2717     .q   (dev_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2718     .en  (dev_mondo_head_wr_g[2]), 
2719     .clk (clk),
2720     .se  (se),       
2721     .si  (),         
2722     .so  ()
2723);
2724
2725dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo2_tail (
2726     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2727     .q   (dev_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2728     .en  (dev_mondo_tail_wr_g[2]), 
2729     .clk (clk),
2730     .se  (se),       
2731     .si  (),         
2732     .so  ()
2733);
2734
2735dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err2_head (
2736     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2737     .q   (resum_err2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2738     .en  (resum_err_head_wr_g[2]), 
2739     .clk (clk),
2740     .se  (se),       
2741     .si  (),         
2742     .so  ()
2743);
2744
2745dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err2_tail (
2746     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2747     .q   (resum_err2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2748     .en  (resum_err_tail_wr_g[2]), 
2749     .clk (clk),
2750     .se  (se),       
2751     .si  (),         
2752     .so  ()
2753);
2754
2755dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err2_head (
2756     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2757     .q   (nresum_err2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2758     .en  (nresum_err_head_wr_g[2]), 
2759     .clk (clk),
2760     .se  (se),       
2761     .si  (),         
2762     .so  ()
2763);
2764
2765dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err2_tail (
2766     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2767     .q   (nresum_err2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2768     .en  (nresum_err_tail_wr_g[2]), 
2769     .clk (clk),
2770     .se  (se),       
2771     .si  (),         
2772     .so  ()
2773);
2774//
2775// thread 3
2776//
2777dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo3_head (
2778     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2779     .q   (cpu_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2780     .en  (cpu_mondo_head_wr_g[3]), 
2781     .clk (clk),
2782     .se  (se),       
2783     .si  (),         
2784     .so  ()
2785);
2786
2787dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_cpu_mondo3_tail (
2788     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2789     .q   (cpu_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2790     .en  (cpu_mondo_tail_wr_g[3]), 
2791     .clk (clk),
2792     .se  (se),       
2793     .si  (),         
2794     .so  ()
2795);
2796
2797dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo3_head (
2798     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2799     .q   (dev_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2800     .en  (dev_mondo_head_wr_g[3]), 
2801     .clk (clk),
2802     .se  (se),       
2803     .si  (),         
2804     .so  ()
2805);
2806
2807dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_dev_mondo3_tail (
2808     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2809     .q   (dev_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2810     .en  (dev_mondo_tail_wr_g[3]), 
2811     .clk (clk),
2812     .se  (se),       
2813     .si  (),         
2814     .so  ()
2815);
2816
2817dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err3_head (
2818     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2819     .q   (resum_err3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2820     .en  (resum_err_head_wr_g[3]), 
2821     .clk (clk),
2822     .se  (se),       
2823     .si  (),         
2824     .so  ()
2825);
2826
2827dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_resum_err3_tail (
2828     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2829     .q   (resum_err3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2830     .en  (resum_err_tail_wr_g[3]), 
2831     .clk (clk),
2832     .se  (se),       
2833     .si  (),         
2834     .so  ()
2835);
2836
2837dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err3_head (
2838     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2839     .q   (nresum_err3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2840     .en  (nresum_err_head_wr_g[3]), 
2841     .clk (clk),
2842     .se  (se),       
2843     .si  (),         
2844     .so  ()
2845);
2846
2847dffe_s #(`TLU_ASI_QUE_WIDTH) dffe_nresum_err3_tail (
2848     .din (tlu_asi_queue_data_g[`TLU_ASI_QUE_WIDTH-1:0]), 
2849     .q   (nresum_err3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2850     .en  (nresum_err_tail_wr_g[3]), 
2851     .clk (clk),
2852     .se  (se),       
2853     .si  (),         
2854     .so  ()
2855);
2856//
2857// reading out the asi queues
2858//
2859// added for bug2332
2860// assign cpu_mondo_hd_onehot_g =
2861//            ~(|cpu_mondo_head_rd_g[3:1]);
2862// cpu_mondo_head
2863mux4ds #(`TLU_ASI_QUE_WIDTH) mx_cpu_mondo_head (
2864    .in0  (cpu_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2865    .in1  (cpu_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2866    .in2  (cpu_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2867    .in3  (cpu_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2868    .sel0 (cpu_mondo_head_rd_g[0]),
2869    .sel1 (cpu_mondo_head_rd_g[1]),
2870    .sel2 (cpu_mondo_head_rd_g[2]),
2871    .sel3 (cpu_mondo_head_rd_g[3]),
2872    .dout (cpu_mondo_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2873); 
2874//
2875// added for bug2332
2876// assign cpu_mondo_ta_onehot_g =
2877//            ~(|cpu_mondo_tail_rd_g[3:1]);
2878// cpu_mondo_tail
2879mux4ds #(`TLU_ASI_QUE_WIDTH) mx_cpu_mondo_tail (
2880    .in0  (cpu_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2881    .in1  (cpu_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2882    .in2  (cpu_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2883    .in3  (cpu_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2884    .sel0 (cpu_mondo_tail_rd_g[0]),
2885    .sel1 (cpu_mondo_tail_rd_g[1]),
2886    .sel2 (cpu_mondo_tail_rd_g[2]),
2887    .sel3 (cpu_mondo_tail_rd_g[3]),
2888    .dout (cpu_mondo_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2889); 
2890//
2891// added for bug2332
2892// assign dev_mondo_hd_onehot_g =
2893//            ~(|dev_mondo_head_rd_g[3:1]);
2894// dev_mondo_head
2895mux4ds #(`TLU_ASI_QUE_WIDTH) mx_dev_mondo_head (
2896    .in0  (dev_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2897    .in1  (dev_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2898    .in2  (dev_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2899    .in3  (dev_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2900    .sel0 (dev_mondo_head_rd_g[0]),
2901    .sel1 (dev_mondo_head_rd_g[1]),
2902    .sel2 (dev_mondo_head_rd_g[2]),
2903    .sel3 (dev_mondo_head_rd_g[3]),
2904    .dout (dev_mondo_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2905); 
2906//
2907// added for bug2332
2908// assign dev_mondo_ta_onehot_g =
2909//            ~(|dev_mondo_tail_rd_g[3:1]);
2910// dev_mondo_tail
2911mux4ds #(`TLU_ASI_QUE_WIDTH) mx_dev_mondo_tail (
2912    .in0  (dev_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2913    .in1  (dev_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2914    .in2  (dev_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2915    .in3  (dev_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2916    .sel0 (dev_mondo_tail_rd_g[0]),
2917    .sel1 (dev_mondo_tail_rd_g[1]),
2918    .sel2 (dev_mondo_tail_rd_g[2]),
2919    .sel3 (dev_mondo_tail_rd_g[3]),
2920    .dout (dev_mondo_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2921); 
2922//
2923// added for bug2332
2924// assign resum_err_hd_onehot_g =
2925//            ~(|resum_err_head_rd_g[3:1]);
2926// resum_err_head
2927mux4ds #(`TLU_ASI_QUE_WIDTH) mx_resum_err_head (
2928    .in0  (resum_err0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2929    .in1  (resum_err1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2930    .in2  (resum_err2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2931    .in3  (resum_err3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2932    .sel0 (resum_err_head_rd_g[0]),
2933    .sel1 (resum_err_head_rd_g[1]),
2934    .sel2 (resum_err_head_rd_g[2]),
2935    .sel3 (resum_err_head_rd_g[3]),
2936    .dout (resum_err_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2937); 
2938//
2939// added for bug2332
2940// assign resum_err_ta_onehot_g =
2941//            ~(|resum_err_tail_rd_g[3:1]);
2942// resum_err_tail
2943mux4ds #(`TLU_ASI_QUE_WIDTH) mx_resum_err_tail (
2944    .in0  (resum_err0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2945    .in1  (resum_err1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2946    .in2  (resum_err2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2947    .in3  (resum_err3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2948    .sel0 (resum_err_tail_rd_g[0]),
2949    .sel1 (resum_err_tail_rd_g[1]),
2950    .sel2 (resum_err_tail_rd_g[2]),
2951    .sel3 (resum_err_tail_rd_g[3]),
2952    .dout (resum_err_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2953); 
2954//
2955// added for bug2332
2956// assign nresum_err_hd_onehot_g =
2957//            ~(|nresum_err_head_rd_g[3:1]);
2958// nresum_err_head
2959mux4ds #(`TLU_ASI_QUE_WIDTH) mx_nresum_err_head (
2960    .in0  (nresum_err0_head[`TLU_ASI_QUE_WIDTH-1:0]),
2961    .in1  (nresum_err1_head[`TLU_ASI_QUE_WIDTH-1:0]),
2962    .in2  (nresum_err2_head[`TLU_ASI_QUE_WIDTH-1:0]),
2963    .in3  (nresum_err3_head[`TLU_ASI_QUE_WIDTH-1:0]),
2964    .sel0 (nresum_err_head_rd_g[0]),
2965    .sel1 (nresum_err_head_rd_g[1]),
2966    .sel2 (nresum_err_head_rd_g[2]),
2967    .sel3 (nresum_err_head_rd_g[3]),
2968    .dout (nresum_err_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2969); 
2970//
2971// added for bug2332
2972// assign nresum_err_ta_onehot_g =
2973//            ~(|nresum_err_tail_rd_g[3:1]);
2974// nresum_err_tail
2975mux4ds #(`TLU_ASI_QUE_WIDTH) mx_nresum_err_tail (
2976    .in0  (nresum_err0_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2977    .in1  (nresum_err1_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2978    .in2  (nresum_err2_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2979    .in3  (nresum_err3_tail[`TLU_ASI_QUE_WIDTH-1:0]),
2980    .sel0 (nresum_err_tail_rd_g[0]),
2981    .sel1 (nresum_err_tail_rd_g[1]),
2982    .sel2 (nresum_err_tail_rd_g[2]),
2983    .sel3 (nresum_err_tail_rd_g[3]),
2984    .dout (nresum_err_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0])
2985); 
2986//
2987// added for bug 2332
2988assign asi_qrdata_mx1_sel[0] = cpu_mondo_hd_rd_g | 
2989                               ~(|asi_qrdata_mx1_sel[3:1]);
2990assign asi_qrdata_mx1_sel[1] = cpu_mondo_ta_rd_g;
2991assign asi_qrdata_mx1_sel[2] = dev_mondo_hd_rd_g;
2992assign asi_qrdata_mx1_sel[3] = dev_mondo_ta_rd_g;
2993//
2994// selecting between the eight queues
2995mux4ds #(`TLU_ASI_QUE_WIDTH) mx1_asi_queue_rdata (
2996    .in0  (cpu_mondo_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
2997    .in1  (cpu_mondo_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
2998    .in2  (dev_mondo_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
2999    .in3  (dev_mondo_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
3000    .sel0 (asi_qrdata_mx1_sel[0]),
3001    .sel1 (asi_qrdata_mx1_sel[1]),
3002    .sel2 (asi_qrdata_mx1_sel[2]),
3003    .sel3 (asi_qrdata_mx1_sel[3]),
3004    .dout (asi_queue_rdata1_g[`TLU_ASI_QUE_WIDTH-1:0])
3005);
3006//
3007// added for bug 2332
3008assign asi_qrdata_mx2_sel[0] = resum_err_hd_rd_g | 
3009                               ~(|asi_qrdata_mx2_sel[3:1]);
3010assign asi_qrdata_mx2_sel[1] = resum_err_ta_rd_g;
3011assign asi_qrdata_mx2_sel[2] = nresum_err_hd_rd_g;
3012assign asi_qrdata_mx2_sel[3] = nresum_err_ta_rd_g;
3013
3014mux4ds #(`TLU_ASI_QUE_WIDTH) mx2_asi_queue_rdata (
3015    .in0  (resum_err_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
3016    .in1  (resum_err_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
3017    .in2  (nresum_err_hd_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
3018    .in3  (nresum_err_ta_rdata[`TLU_ASI_QUE_WIDTH-1:0]),
3019    .sel0 (asi_qrdata_mx2_sel[0]),
3020    .sel1 (asi_qrdata_mx2_sel[1]),
3021    .sel2 (asi_qrdata_mx2_sel[2]),
3022    .sel3 (asi_qrdata_mx2_sel[3]),
3023    .dout (asi_queue_rdata2_g[`TLU_ASI_QUE_WIDTH-1:0])
3024);
3025//
3026// constructing the select for the final asi queue rdata output
3027assign asi_qrdata_mx_sel2 = 
3028           resum_err_hd_rd_g  | resum_err_ta_rd_g | 
3029           nresum_err_hd_rd_g | nresum_err_ta_rd_g;   
3030//
3031mux2ds #(`TLU_ASI_QUE_WIDTH) mx_tlu_asi_queue_rdata (
3032    .in0  (asi_queue_rdata2_g[`TLU_ASI_QUE_WIDTH-1:0]),
3033    .in1  (asi_queue_rdata1_g[`TLU_ASI_QUE_WIDTH-1:0]),
3034    .sel0 (asi_qrdata_mx_sel2),
3035    .sel1 (~asi_qrdata_mx_sel2),
3036    .dout (tlu_asi_queue_rdata_g[`TLU_ASI_QUE_WIDTH-1:0])
3037);
3038//
3039// forming the valid signal for the asi queue rdata
3040assign tlu_asi_queue_rd_vld_g =
3041       asi_qrdata_mx_sel2 | cpu_mondo_hd_rd_g | cpu_mondo_ta_rd_g |
3042       dev_mondo_hd_rd_g  | dev_mondo_ta_rd_g; 
3043
3044assign tlu_ld_data_vld_g = asi_ld_addr_vld_g; 
3045
3046////////////////////////////////////////////////////////////////////////
3047// SCPD and HSCPD control logic
3048////////////////////////////////////////////////////////////////////////
3049//
3050// privileged scratch pad access
3051assign asi_scpd_rw_e = 
3052           ifu_lsu_alt_space_e & 
3053          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`PRI_SCPD_ASI_STATE);
3054
3055// hyprivileged scratch pad access
3056assign asi_hscpd_rw_e = 
3057           ifu_lsu_alt_space_e & 
3058          (tlu_asi_state_e[`TLU_ASI_STATE_WIDTH-1:0]==`HPRI_SCPD_ASI_STATE);
3059//
3060// staged the scpd/hscpd rw ctls
3061dffr_s #(2) dffr_asi_scpd_rw_ctls (
3062    .din ({asi_hscpd_rw_e, asi_scpd_rw_e}),
3063    .q   ({asi_hscpd_rw_m, asi_scpd_rw_m}),
3064    .rst (local_rst),
3065    .clk (clk),
3066    .se  (se),       
3067    .si  (),         
3068    .so  ()
3069);
3070
3071// address generation
3072//
3073// modified due to timing fix 
3074/*
3075 assign scpd_addr_va_e[`SCPD_ASI_VA_ADDR_WIDTH-1:0] =
3076            tlu_ldst_va_e[`TLU_ASI_SCPD_VA_HI:`TLU_ASI_SCPD_VA_LO];
3077
3078 staged the shifted va address
3079 modified due to timing fix
3080
3081dff_s #(`SCPD_ASI_VA_ADDR_WIDTH) dff_scpd_addr_va_m (
3082    .din (scpd_addr_va_e[`SCPD_ASI_VA_ADDR_WIDTH-1:0]),
3083    .q   (scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0]),
3084    .clk (clk),
3085    .se  (se),       
3086    .si  (),         
3087    .so  ()
3088);
3089*/
3090
3091assign scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0] = 
3092            tlu_ldst_va_m[`TLU_ASI_SCPD_VA_HI:`TLU_ASI_SCPD_VA_LO];
3093
3094dff_s #(`SCPD_ASI_VA_ADDR_WIDTH) dff_scpd_addr_va_g (
3095    .din (scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0]),
3096    .q   (scpd_addr_va_g[`SCPD_ASI_VA_ADDR_WIDTH-1:0]),
3097    .clk (clk),
3098    .se  (se),       
3099    .si  (),         
3100    .so  ()
3101);
3102
3103assign tlu_scpd_rd_addr_m[`SCPD_RW_ADDR_WIDTH-1:0] = 
3104           {thrid_m[1:0], scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0]}; 
3105
3106assign tlu_scpd_wr_addr_g[`SCPD_RW_ADDR_WIDTH-1:0] = 
3107           {thrid_g[1:0], scpd_addr_va_g[`SCPD_ASI_VA_ADDR_WIDTH-1:0]}; 
3108//
3109// illegal range check for scratch-pd va
3110// modified due to timing
3111/*
3112assign scpd_ill_va_e =
3113           (ifu_lsu_alt_space_e)?
3114           ((asi_scpd_rw_e | asi_hscpd_rw_e) &
3115           ((|exu_lsu_ldst_va_e[`ASI_VA_WIDTH-1:`TLU_ASI_SCPD_VA_HI+1]) |
3116            (|exu_lsu_ldst_va_e[`TLU_ASI_SCPD_VA_LO-1:0]))) :
3117            1'b0;
3118// staged illegal va range
3119dffr_s dffr_scpd_ill_va_m (
3120    .din (scpd_ill_va_e),
3121    .q   (scpd_ill_va_m),
3122    .rst (local_rst),
3123    .clk (clk),
3124    .se  (se),       
3125    .si  (),         
3126    .so  ()
3127);
3128*/
3129//
3130assign va_not_baligned_m = (|tlu_ldst_va_m[`TLU_ASI_SCPD_VA_LO-1:0]); 
3131assign scpd_ill_va_m = 
3132           (asi_scpd_rw_m | asi_hscpd_rw_m) & 
3133            va_not_baligned_m;
3134       
3135//
3136dffr_s dffr_scpd_ill_va_g (
3137    .din (scpd_ill_va_m),
3138    .q   (scpd_ill_va_g),
3139    .rst (local_rst),
3140    .clk (clk),
3141    .se  (se),       
3142    .si  (),         
3143    .so  ()
3144);
3145//
3146// generating read and write valid
3147assign asi_scpd_rw_vld_m = 
3148            (asi_scpd_rw_m | asi_hscpd_rw_m) & 
3149           ~(hscpd_data_acc_excpt_m | va_not_baligned_m);
3150
3151dffr_s dffr_asi_scpd_rw_vld_g (
3152    .din (asi_scpd_rw_vld_m),
3153    .q   (asi_scpd_rw_vld_g),
3154    .rst (local_rst),
3155    .clk (clk),
3156    .se  (se),       
3157    .si  (),         
3158    .so  ()
3159);
3160
3161assign tlu_scpd_wr_vld_g = 
3162           asi_queue_write_g & asi_scpd_rw_vld_g; 
3163//
3164// control to the memory macro for the read
3165// modified due to timing
3166assign tlu_scpd_rd_vld_m = 
3167           // asi_queue_read_m & asi_scpd_rw_vld_m;
3168           asi_queue_read_pq_m & asi_scpd_rw_vld_m; 
3169//
3170// control to the int block for the selection of read data
3171// replaced by queue vld
3172// assign tlu_scpd_rd_vld_g =
3173//            asi_queue_read_g & asi_scpd_rw_vld_g;
3174
3175// decoding for hypervisor only scratch-pad
3176assign hscpd_va_rw_m = 
3177          ((scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0] == 
3178            `HSCPD_ASI_VA_ADDR_LO) | 
3179           (scpd_addr_va_m[`SCPD_ASI_VA_ADDR_WIDTH-1:0] == 
3180            `HSCPD_ASI_VA_ADDR_HI)); 
3181
3182////////////////////////////////////////////////////////////////////////
3183// Potential trap indicators
3184////////////////////////////////////////////////////////////////////////
3185// possible traps are:
3186// 1) head ptr <> tail ptr (with the exception of nresum_err_queue)
3187// 2) write to tail by supervisor - data_access_exception
3188
3189//
3190// write to hypervisor scratch-pad using 0x20 ASI state
3191
3192assign hscpd_priv_asi_acc_m = 
3193       hscpd_va_rw_m & asi_scpd_rw_m; 
3194
3195// modified due to timing - moved the inst_vld qualification to tlu_tcl
3196assign hscpd_data_acc_excpt_pq_m = 
3197           hscpd_priv_asi_acc_m & 
3198           (asi_queue_write_pq_m | asi_queue_read_pq_m);
3199/*
3200           hscpd_priv_asi_acc_m &
3201           // (asi_queue_write_m | asi_queue_read_m)  &
3202           (asi_queue_write_pq_m | asi_queue_read_pq_m) &
3203           ((thread_sel_id_m[0] & ~tlu_hyper_lite[0]) |
3204            (thread_sel_id_m[1] & ~tlu_hyper_lite[1]) |
3205            (thread_sel_id_m[2] & ~tlu_hyper_lite[2]) |
3206            (thread_sel_id_m[3] & ~tlu_hyper_lite[3]));
3207*/
3208//
3209// data_access_exception to access the hyper-privileged scratch-pad
3210
3211assign tlu_hscpd_dacc_excpt_m = hscpd_data_acc_excpt_pq_m;
3212//
3213// revised for bug 3586
3214
3215assign hscpd_data_acc_excpt_m = 
3216           hscpd_data_acc_excpt_pq_m & 
3217           ((thread_sel_id_m[0] & ~tlu_hyper_lite[0]) |
3218            (thread_sel_id_m[1] & ~tlu_hyper_lite[1]) |
3219            (thread_sel_id_m[2] & ~tlu_hyper_lite[2]) |
3220            (thread_sel_id_m[3] & ~tlu_hyper_lite[3])); 
3221
3222// illegal va range indicator
3223assign tlu_va_ill_g = 
3224           (que_ill_va_g | scpd_ill_va_g) & asi_queue_read_g; 
3225
3226// load instruction valid - scpd or asi queue
3227assign asi_ld_addr_vld_m  = 
3228             asi_queue_read_m & (asi_queue_rw_m | 
3229           ((asi_hscpd_rw_m | asi_scpd_rw_m) & 
3230            ~hscpd_data_acc_excpt_m));
3231
3232// staging the ld address valid
3233dffr_s dffr_asi_ld_addr_vld_g (
3234    .din (asi_ld_addr_vld_m),
3235    .q   (asi_ld_addr_vld_g),
3236    .rst (local_rst),
3237    .clk (clk),
3238    .se  (se),       
3239    .si  (),         
3240    .so  ()
3241);
3242//
3243// redefined va illegal checking - the following code is
3244// no longer necessary
3245// zero va range detector
3246/*
3247assign va_all_zero_e =
3248            (~(|exu_lsu_ldst_va_e[`ASI_VA_WIDTH-1:0])) &
3249             asi_queue_read_g;
3250//
3251// staged illegal va range
3252dffr_s dffr_va_all_zero_m (
3253    .din (va_all_zero_e),
3254    .q   (va_all_zero_m),
3255    .rst (local_rst),
3256    .clk (clk),
3257    .se  (se),       
3258    .si  (),         
3259    .so  ()
3260);
3261//
3262dffr_s dffr_va_all_zero_g (
3263    .din (va_all_zero_m),
3264    .q   (va_all_zero_g),
3265    .rst (local_rst),
3266    .clk (clk),
3267    .se  (se),       
3268    .si  (),         
3269    .so  ()
3270);
3271
3272assign tlu_va_all_zero_g = va_all_zero_g;
3273*/
3274
3275////////////////////////////////////////////////////////////////////////
3276// queue traps - head ptr <> tail ptr
3277////////////////////////////////////////////////////////////////////////
3278// note: these traps are level-sensitive
3279//
3280// thread 0
3281
3282assign tlu_cpu_mondo_cmp[0] = 
3283           (|(cpu_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3284              cpu_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3285assign tlu_dev_mondo_cmp[0]= 
3286           (|(dev_mondo0_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3287              dev_mondo0_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3288assign tlu_resum_err_cmp[0] = 
3289           (|(resum_err0_head[`TLU_ASI_QUE_WIDTH-1:0] ^ 
3290              resum_err0_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3291// thread 1
3292
3293assign tlu_cpu_mondo_cmp[1] = 
3294           (|(cpu_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3295              cpu_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3296assign tlu_dev_mondo_cmp[1]= 
3297           (|(dev_mondo1_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3298              dev_mondo1_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3299assign tlu_resum_err_cmp[1] = 
3300           (|(resum_err1_head[`TLU_ASI_QUE_WIDTH-1:0] ^ 
3301              resum_err1_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3302//
3303// thread 2
3304
3305assign tlu_cpu_mondo_cmp[2] = 
3306           (|(cpu_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3307              cpu_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3308assign tlu_dev_mondo_cmp[2]= 
3309           (|(dev_mondo2_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3310              dev_mondo2_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3311assign tlu_resum_err_cmp[2] = 
3312           (|(resum_err2_head[`TLU_ASI_QUE_WIDTH-1:0] ^ 
3313              resum_err2_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3314// thread 3
3315
3316assign tlu_cpu_mondo_cmp[3] = 
3317           (|(cpu_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3318              cpu_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3319assign tlu_dev_mondo_cmp[3]= 
3320           (|(dev_mondo3_head[`TLU_ASI_QUE_WIDTH-1:0] ^
3321              dev_mondo3_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3322assign tlu_resum_err_cmp[3] = 
3323           (|(resum_err3_head[`TLU_ASI_QUE_WIDTH-1:0] ^ 
3324              resum_err3_tail[`TLU_ASI_QUE_WIDTH-1:0]));
3325
3326// write to tail by supervisor
3327// modified due to timing - moved the inst_vld qualification to tlu_tcl
3328assign qtail_write_m = 
3329           (nresum_err_tail_rw_m | resum_err_tail_rw_m  | 
3330            cpu_mondo_tail_rw_m  | dev_mondo_tail_rw_m) &
3331            asi_queue_write_pq_m & asi_queue_rw_m;
3332            // asi_queue_write_m & asi_queue_rw_m;
3333
3334//
3335// modified for timing - qualification moved to tcl
3336assign tlu_qtail_dacc_excpt_m = qtail_write_m;
3337/*
3338           ((thread_sel_id_m[0] & que_trap_en[0] & tlu_pstate_priv[0])  |
3339            (thread_sel_id_m[1] & que_trap_en[1] & tlu_pstate_priv[1])  |
3340            (thread_sel_id_m[2] & que_trap_en[2] & tlu_pstate_priv[2])  |
3341            (thread_sel_id_m[3] & que_trap_en[3] & tlu_pstate_priv[3])) &
3342             qtail_write_m;
3343*/
3344             
3345endmodule
Note: See TracBrowser for help on using the repository browser.