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