| 1 | // ========== Copyright Header Begin ========================================== |
| 2 | // |
| 3 | // OpenSPARC T2 Processor File: axis_ccx_mon.v |
| 4 | // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved |
| 5 | // 4150 Network Circle, Santa Clara, California 95054, U.S.A. |
| 6 | // |
| 7 | // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 8 | // |
| 9 | // This program is free software; you can redistribute it and/or modify |
| 10 | // it under the terms of the GNU General Public License as published by |
| 11 | // the Free Software Foundation; version 2 of the License. |
| 12 | // |
| 13 | // This program is distributed in the hope that it will be useful, |
| 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | // GNU General Public License for more details. |
| 17 | // |
| 18 | // You should have received a copy of the GNU General Public License |
| 19 | // along with this program; if not, write to the Free Software |
| 20 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 21 | // |
| 22 | // For the avoidance of doubt, and except that if any non-GPL license |
| 23 | // choice is available it will apply instead, Sun elects to use only |
| 24 | // the General Public License version 2 (GPLv2) at this time for any |
| 25 | // software where a choice of GPL license versions is made |
| 26 | // available with the language indicating that GPLv2 or any later version |
| 27 | // may be used, or where a choice of which version of the GPL is applied is |
| 28 | // otherwise unspecified. |
| 29 | // |
| 30 | // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| 31 | // CA 95054 USA or visit www.sun.com if you need additional information or |
| 32 | // have any questions. |
| 33 | // |
| 34 | // ========== Copyright Header End ============================================ |
| 35 | module axis_cmp_mon ( |
| 36 | clk, |
| 37 | reset96, |
| 38 | spc_pcx_req_pq, |
| 39 | pcx_spc_grant_px, |
| 40 | spc_pcx_atom_pq, |
| 41 | spc_pcx_data_pa, |
| 42 | cpx_spc_data_cx2, |
| 43 | |
| 44 | CLK_CNT, |
| 45 | core_mask, |
| 46 | core_id, |
| 47 | en_status, |
| 48 | pcx_cpx_en, |
| 49 | pcx_cpx_short, |
| 50 | pcx_cpx_io, |
| 51 | watch_dog_finish |
| 52 | ); |
| 53 | |
| 54 | |
| 55 | input clk; |
| 56 | input reset96; |
| 57 | input [ 8:0] spc_pcx_req_pq; |
| 58 | input [ 8:0] pcx_spc_grant_px; |
| 59 | input [ 8:0] spc_pcx_atom_pq; |
| 60 | input [129:0] spc_pcx_data_pa; |
| 61 | input [145:0] cpx_spc_data_cx2; |
| 62 | input [ 39:0] CLK_CNT; |
| 63 | input [ 7:0] core_mask; |
| 64 | input [ 2:0] core_id; |
| 65 | input en_status; |
| 66 | input pcx_cpx_en; |
| 67 | input pcx_cpx_short; |
| 68 | input pcx_cpx_io; |
| 69 | |
| 70 | output watch_dog_finish; |
| 71 | |
| 72 | |
| 73 | |
| 74 | reg [15:0] WDOG0, WDOG1, WDOG2, WDOG3, WDOG4,WDOG5,WDOG6,WDOG7; |
| 75 | reg WDOG_IDLE0, WDOG_IDLE1, WDOG_IDLE2, WDOG_IDLE3 , WDOG_IDLE4, WDOG_IDLE5, WDOG_IDLE6, WDOG_IDLE7; |
| 76 | |
| 77 | reg REQ_CY; |
| 78 | reg ERROR_BANK; |
| 79 | reg [1:0] REQ_OUTSTANDING0; |
| 80 | reg [1:0] REQ_OUTSTANDING1; |
| 81 | reg [1:0] REQ_OUTSTANDING2; |
| 82 | reg [1:0] REQ_OUTSTANDING3; |
| 83 | reg [1:0] REQ_OUTSTANDING4; |
| 84 | reg [1:0] REQ_OUTSTANDING5; |
| 85 | reg [1:0] REQ_OUTSTANDING6; |
| 86 | reg [1:0] REQ_OUTSTANDING7; |
| 87 | reg [1:0] REQ_OUTSTANDING8; |
| 88 | reg [63:0] CONSOLE_DATA; |
| 89 | |
| 90 | reg [3:0] HYP_WATCH_CNT; |
| 91 | reg [1:0] HYP_WATCH_ITER; |
| 92 | |
| 93 | reg [2:0] core_id_r; |
| 94 | reg [8:0] tlu_early_ttype_g_r; |
| 95 | reg [1:0] true_trap_tid_g_r; |
| 96 | reg [2:0] trp_lvl_r; |
| 97 | reg [ 48:0] tlu_restore_pc_w1_r; |
| 98 | reg [129:0] spc_pcx_data_pa_r; |
| 99 | reg [145:0] cpx_spc_data_cx2_r; |
| 100 | |
| 101 | |
| 102 | /******************************************************************************************************************* |
| 103 | * This logic makes sure threads are not inactive for more than 8K cycles. |
| 104 | *******************************************************************************************************************/ |
| 105 | wire wdog_fwdv = (spc_pcx_data_pa[122:119] == 4'h6); |
| 106 | |
| 107 | `ifdef CMP_IOBDG |
| 108 | wire wdog_clk = (CLK_CNT > 190000); |
| 109 | `else |
| 110 | wire wdog_clk = (CLK_CNT > 20000); |
| 111 | `endif |
| 112 | |
| 113 | wire wdog_reqv0 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b000) & ~wdog_fwdv & wdog_clk & core_mask[0]; |
| 114 | wire wdog_reqv1 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b001) & ~wdog_fwdv & wdog_clk & core_mask[1]; |
| 115 | wire wdog_reqv2 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b010) & ~wdog_fwdv & wdog_clk & core_mask[2]; |
| 116 | wire wdog_reqv3 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b011) & ~wdog_fwdv & wdog_clk & core_mask[3]; |
| 117 | wire wdog_reqv4 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b100) & ~wdog_fwdv & wdog_clk & core_mask[4]; |
| 118 | wire wdog_reqv5 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b101) & ~wdog_fwdv & wdog_clk & core_mask[5]; |
| 119 | wire wdog_reqv6 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b110) & ~wdog_fwdv & wdog_clk & core_mask[6]; |
| 120 | wire wdog_reqv7 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b111) & ~wdog_fwdv & wdog_clk & core_mask[7]; |
| 121 | |
| 122 | wire wdog_intv0 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b00) & core_mask[0]; |
| 123 | wire wdog_intv1 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b01) & core_mask[1]; |
| 124 | wire wdog_intv2 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b10) & core_mask[2]; |
| 125 | wire wdog_intv3 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b11) & core_mask[3]; |
| 126 | wire wdog_intv4 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b11) & core_mask[4]; |
| 127 | wire wdog_intv5 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b11) & core_mask[5]; |
| 128 | wire wdog_intv6 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b11) & core_mask[6]; |
| 129 | wire wdog_intv7 = (cpx_spc_data_cx2[145:141] == 5'h17) & ~cpx_spc_data_cx2[137] & (cpx_spc_data_cx2[9:8] == 2'b11) & core_mask[7]; |
| 130 | |
| 131 | wire [15:0] wdog0p = wdog_reqv0 ? 16'hFFFF : |
| 132 | (WDOG0 == 16'h0000) ? 16'h0000 : |
| 133 | WDOG_IDLE0 ? WDOG0 : ((WDOG0 - 1'b1) & 16'hFFFF); |
| 134 | wire [15:0] wdog1p = wdog_reqv1 ? 16'hFFFF : |
| 135 | (WDOG1 == 16'h0000) ? 16'h0000 : |
| 136 | WDOG_IDLE1 ? WDOG1 : ((WDOG1 - 1'b1) & 16'hFFFF); |
| 137 | wire [15:0] wdog2p = wdog_reqv2 ? 16'hFFFF : |
| 138 | (WDOG2 == 16'h0000) ? 16'h0000 : |
| 139 | WDOG_IDLE2 ? WDOG2 : ((WDOG2 - 1'b1) & 16'hFFFF); |
| 140 | wire [15:0] wdog3p = wdog_reqv3 ? 16'hFFFF : |
| 141 | (WDOG3 == 16'h0000) ? 16'h0000 : |
| 142 | WDOG_IDLE3 ? WDOG3 : ((WDOG3 - 1'b1) & 16'hFFFF); |
| 143 | wire [15:0] wdog4p = wdog_reqv4 ? 16'hFFFF : |
| 144 | (WDOG4 == 16'h0000) ? 16'h0000 : |
| 145 | WDOG_IDLE4 ? WDOG4 : ((WDOG4 - 1'b1) & 16'hFFFF); |
| 146 | wire [15:0] wdog5p = wdog_reqv5 ? 16'hFFFF : |
| 147 | (WDOG5 == 16'h0000) ? 16'h0000 : |
| 148 | WDOG_IDLE5 ? WDOG5 : ((WDOG5 - 1'b1) & 16'hFFFF); |
| 149 | wire [15:0] wdog6p = wdog_reqv6 ? 16'hFFFF : |
| 150 | (WDOG6 == 16'h0000) ? 16'h0000 : |
| 151 | WDOG_IDLE6 ? WDOG6 : ((WDOG6 - 1'b1) & 16'hFFFF); |
| 152 | wire [15:0] wdog7p = wdog_reqv7 ? 16'hFFFF : |
| 153 | (WDOG7 == 16'h0000) ? 16'h0000 : |
| 154 | WDOG_IDLE7 ? WDOG7 : ((WDOG7 - 1'b1) & 16'hFFFF); |
| 155 | |
| 156 | wire wdog_idle0p = wdog_intv0 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE0; |
| 157 | wire wdog_idle1p = wdog_intv1 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE1; |
| 158 | wire wdog_idle2p = wdog_intv2 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE2; |
| 159 | wire wdog_idle3p = wdog_intv3 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE3; |
| 160 | wire wdog_idle4p = wdog_intv4 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE4; |
| 161 | wire wdog_idle5p = wdog_intv5 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE4; |
| 162 | wire wdog_idle6p = wdog_intv6 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE5; |
| 163 | wire wdog_idle7p = wdog_intv7 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE7; |
| 164 | |
| 165 | /******************************************************************************************************************* |
| 166 | * This logic checks that each core has at most two request outstanding to each bank at the same time. |
| 167 | *******************************************************************************************************************/ |
| 168 | wire req_cyP =( |
| 169 | (spc_pcx_req_pq[8] & ~((REQ_OUTSTANDING8 == 2'b10) & ~pcx_spc_grant_px[8])) | |
| 170 | (spc_pcx_req_pq[7] & ~((REQ_OUTSTANDING7 == 2'b10) & ~pcx_spc_grant_px[7])) | |
| 171 | (spc_pcx_req_pq[6] & ~((REQ_OUTSTANDING6 == 2'b10) & ~pcx_spc_grant_px[6])) | |
| 172 | (spc_pcx_req_pq[5] & ~((REQ_OUTSTANDING5 == 2'b10) & ~pcx_spc_grant_px[5])) | |
| 173 | (spc_pcx_req_pq[4] & ~((REQ_OUTSTANDING4 == 2'b10) & ~pcx_spc_grant_px[4])) | |
| 174 | (spc_pcx_req_pq[3] & ~((REQ_OUTSTANDING3 == 2'b10) & ~pcx_spc_grant_px[3])) | |
| 175 | (spc_pcx_req_pq[2] & ~((REQ_OUTSTANDING2 == 2'b10) & ~pcx_spc_grant_px[2])) | |
| 176 | (spc_pcx_req_pq[1] & ~((REQ_OUTSTANDING1 == 2'b10) & ~pcx_spc_grant_px[1])) | |
| 177 | (spc_pcx_req_pq[0] & ~((REQ_OUTSTANDING0 == 2'b10) & ~pcx_spc_grant_px[0]))); |
| 178 | |
| 179 | wire [1:0] req_outstanding0p = (spc_pcx_atom_pq[0] & spc_pcx_req_pq[0]) ? 2'b10 : |
| 180 | ~(pcx_spc_grant_px[0] ^ (spc_pcx_req_pq[0] & req_cyP)) ? REQ_OUTSTANDING0[1:0] : |
| 181 | pcx_spc_grant_px[0] ? (REQ_OUTSTANDING0[1:0] - 2'h1) : |
| 182 | (REQ_OUTSTANDING0[1:0] + 2'h1); |
| 183 | wire [1:0] req_outstanding1p = (spc_pcx_atom_pq[1] & spc_pcx_req_pq[1]) ? 2'b10 : |
| 184 | ~(pcx_spc_grant_px[1] ^ (spc_pcx_req_pq[1] & req_cyP)) ? REQ_OUTSTANDING1[1:0] : |
| 185 | pcx_spc_grant_px[1] ? (REQ_OUTSTANDING1[1:0] - 2'h1) : |
| 186 | (REQ_OUTSTANDING1[1:0] + 2'h1); |
| 187 | wire [1:0] req_outstanding2p = (spc_pcx_atom_pq[2] & spc_pcx_req_pq[2]) ? 2'b10 : |
| 188 | ~(pcx_spc_grant_px[2] ^ (spc_pcx_req_pq[2] & req_cyP)) ? REQ_OUTSTANDING2[1:0] : |
| 189 | pcx_spc_grant_px[2] ? (REQ_OUTSTANDING2[1:0] - 2'h1) : |
| 190 | (REQ_OUTSTANDING2[1:0] + 2'h1); |
| 191 | wire [1:0] req_outstanding3p = (spc_pcx_atom_pq[3] & spc_pcx_req_pq[3]) ? 2'b10 : |
| 192 | ~(pcx_spc_grant_px[3] ^ (spc_pcx_req_pq[3] & req_cyP)) ? REQ_OUTSTANDING3[1:0] : |
| 193 | pcx_spc_grant_px[3] ? (REQ_OUTSTANDING3[1:0] - 2'h1) : |
| 194 | (REQ_OUTSTANDING3[1:0] + 2'h1); |
| 195 | /*{{{ */ |
| 196 | wire [1:0] req_outstanding4p = (spc_pcx_atom_pq[4] & spc_pcx_req_pq[4]) ? 2'b10 : |
| 197 | ~(pcx_spc_grant_px[4] ^ (spc_pcx_req_pq[4] & req_cyP)) ? REQ_OUTSTANDING4[1:0] : |
| 198 | pcx_spc_grant_px[4] ? (REQ_OUTSTANDING4[1:0] - 2'h1) : |
| 199 | (REQ_OUTSTANDING4[1:0] + 2'h1); |
| 200 | /*}}} */ |
| 201 | /*{{{ */ |
| 202 | wire [1:0] req_outstanding5p = (spc_pcx_atom_pq[5] & spc_pcx_req_pq[5]) ? 2'b10 : |
| 203 | ~(pcx_spc_grant_px[5] ^ (spc_pcx_req_pq[5] & req_cyP)) ? REQ_OUTSTANDING5[1:0] : |
| 204 | pcx_spc_grant_px[5] ? (REQ_OUTSTANDING5[1:0] - 2'h1) : |
| 205 | (REQ_OUTSTANDING5[1:0] + 2'h1); |
| 206 | /*}}} */ |
| 207 | /*{{{ */ |
| 208 | wire [1:0] req_outstanding6p = (spc_pcx_atom_pq[6] & spc_pcx_req_pq[6]) ? 2'b10 : |
| 209 | ~(pcx_spc_grant_px[6] ^ (spc_pcx_req_pq[6] & req_cyP)) ? REQ_OUTSTANDING6[1:0] : |
| 210 | pcx_spc_grant_px[6] ? (REQ_OUTSTANDING6[1:0] - 2'h1) : |
| 211 | (REQ_OUTSTANDING6[1:0] + 2'h1); |
| 212 | /*}}} */ |
| 213 | /*{{{ */ |
| 214 | wire [1:0] req_outstanding7p = (spc_pcx_atom_pq[7] & spc_pcx_req_pq[7]) ? 2'b10 : |
| 215 | ~(pcx_spc_grant_px[7] ^ (spc_pcx_req_pq[7] & req_cyP)) ? REQ_OUTSTANDING7[1:0] : |
| 216 | pcx_spc_grant_px[7] ? (REQ_OUTSTANDING7[1:0] - 2'h1) : |
| 217 | (REQ_OUTSTANDING7[1:0] + 2'h1); |
| 218 | /*}}} */ |
| 219 | /*{{{ */ |
| 220 | wire [1:0] req_outstanding8p = (spc_pcx_atom_pq[8] & spc_pcx_req_pq[8]) ? 2'b10 : |
| 221 | ~(pcx_spc_grant_px[8] ^ (spc_pcx_req_pq[8] & req_cyP)) ? REQ_OUTSTANDING8[1:0] : |
| 222 | pcx_spc_grant_px[8] ? (REQ_OUTSTANDING8[1:0] - 2'h1) : |
| 223 | (REQ_OUTSTANDING8[1:0] + 2'h1); |
| 224 | /*}}} */ |
| 225 | |
| 226 | wire error_bankP = ((&REQ_OUTSTANDING0)|(&REQ_OUTSTANDING1)| |
| 227 | (&REQ_OUTSTANDING2)|(&REQ_OUTSTANDING3)| |
| 228 | (&REQ_OUTSTANDING4)|(&REQ_OUTSTANDING5)| |
| 229 | (&REQ_OUTSTANDING6)|(&REQ_OUTSTANDING7)| |
| 230 | (&REQ_OUTSTANDING8)); // 0in val -val 0 |
| 231 | |
| 232 | |
| 233 | /******************************************************************************************************************* |
| 234 | * This is the bus display logic |
| 235 | *******************************************************************************************************************/ |
| 236 | wire istor_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100001); |
| 237 | wire ifill_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b110000); |
| 238 | wire ifprl_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b101010); |
| 239 | wire iload_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100000) & ~spc_pcx_data_pa[115]; |
| 240 | wire ilstm_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100000) & spc_pcx_data_pa[115]; |
| 241 | wire icasa1_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100010); |
| 242 | wire icasa2_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100011); |
| 243 | wire iswap_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100111); |
| 244 | |
| 245 | wire error_ack = (cpx_spc_data_cx2[145:141] == 5'b11100); |
| 246 | wire load_ack = (cpx_spc_data_cx2[145:141] == 5'b10000); |
| 247 | wire fill_ack = (cpx_spc_data_cx2[145:141] == 5'b10001); |
| 248 | wire stor_ack = (cpx_spc_data_cx2[145:141] == 5'b10100); |
| 249 | wire evict = (cpx_spc_data_cx2[145:141] == 5'b10011); |
| 250 | |
| 251 | wire hyperv_console = ((istor_req) & ((spc_pcx_data_pa[103:64] == 40'h1f00000000) | |
| 252 | (spc_pcx_data_pa[103:64] == 40'hfff0c2c000))); |
| 253 | |
| 254 | wire guest0_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10002000)); |
| 255 | wire guest1_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10004000)); |
| 256 | wire guest2_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10006000)); |
| 257 | wire guest3_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10008000)); |
| 258 | |
| 259 | wire [3:0] hyp_watch_cntP = ~hyperv_console ? HYP_WATCH_CNT : |
| 260 | (HYP_WATCH_CNT == 0) ? ((spc_pcx_data_pa[7:0] == 8'h57) ? 8'h01 : 8'h0) : |
| 261 | (HYP_WATCH_CNT == 1) ? ((spc_pcx_data_pa[7:0] == 8'h41) ? 8'h02 : 8'h0) : |
| 262 | (HYP_WATCH_CNT == 2) ? ((spc_pcx_data_pa[7:0] == 8'h54) ? 8'h03 : 8'h0) : |
| 263 | (HYP_WATCH_CNT == 3) ? ((spc_pcx_data_pa[7:0] == 8'h43) ? 8'h04 : 8'h0) : |
| 264 | (HYP_WATCH_CNT == 4) ? ((spc_pcx_data_pa[7:0] == 8'h48) ? 8'h05 : 8'h0) : |
| 265 | (HYP_WATCH_CNT == 5) ? ((spc_pcx_data_pa[7:0] == 8'h44) ? 8'h06 : 8'h0) : |
| 266 | (HYP_WATCH_CNT == 6) ? ((spc_pcx_data_pa[7:0] == 8'h4F) ? 8'h07 : 8'h0) : |
| 267 | (HYP_WATCH_CNT == 7) ? ((spc_pcx_data_pa[7:0] == 8'h47) ? 8'hff : 8'h0) : 8'h00; |
| 268 | |
| 269 | wire [1:0] hyp_watch_iterP = (hyperv_console & (HYP_WATCH_CNT == 8'hff)) ? (HYP_WATCH_ITER + 1) : HYP_WATCH_ITER; |
| 270 | |
| 271 | assign watch_dog_finish = (HYP_WATCH_ITER == 2'b11); |
| 272 | |
| 273 | always @(posedge clk) begin |
| 274 | |
| 275 | WDOG0 <= (reset96) ? 16'h0 : wdog0p; |
| 276 | WDOG1 <= (reset96) ? 16'h0 : wdog1p; |
| 277 | WDOG2 <= (reset96) ? 16'h0 : wdog2p; |
| 278 | WDOG3 <= (reset96) ? 16'h0 : wdog3p; |
| 279 | WDOG4 <= (reset96) ? 16'h0 : wdog3p; |
| 280 | WDOG5 <= (reset96) ? 16'h0 : wdog3p; |
| 281 | WDOG6 <= (reset96) ? 16'h0 : wdog3p; |
| 282 | WDOG7 <= (reset96) ? 16'h0 : wdog3p; |
| 283 | |
| 284 | WDOG_IDLE0 <= (reset96) ? 1'b0 : wdog_idle0p; |
| 285 | WDOG_IDLE1 <= (reset96) ? 1'b0 : wdog_idle1p; |
| 286 | WDOG_IDLE2 <= (reset96) ? 1'b0 : wdog_idle2p; |
| 287 | WDOG_IDLE3 <= (reset96) ? 1'b0 : wdog_idle3p; |
| 288 | WDOG_IDLE4 <= (reset96) ? 1'b0 : wdog_idle4p; |
| 289 | WDOG_IDLE5 <= (reset96) ? 1'b0 : wdog_idle5p; |
| 290 | WDOG_IDLE6 <= (reset96) ? 1'b0 : wdog_idle6p; |
| 291 | WDOG_IDLE7 <= (reset96) ? 1'b0 : wdog_idle7p; |
| 292 | |
| 293 | HYP_WATCH_CNT <= (reset96) ? 4'h0 : hyp_watch_cntP; |
| 294 | HYP_WATCH_ITER <= (reset96) ? 2'b0 : hyp_watch_iterP; |
| 295 | |
| 296 | `ifdef AXIS |
| 297 | begin |
| 298 | if ((WDOG0 == 16'b1)) begin // axis tbcall_region |
| 299 | $display(" WATCH_DOG%h_0 %d",core_id_r, $time); |
| 300 | end |
| 301 | if ((WDOG1 == 16'b1)) begin // axis tbcall_region |
| 302 | $display(" WATCH_DOG%h_1 %d",core_id_r, $time); |
| 303 | end |
| 304 | if ((WDOG2 == 16'b1)) begin // axis tbcall_region |
| 305 | $display(" WATCH_DOG%h_2 %d",core_id_r, $time); |
| 306 | end |
| 307 | if ((WDOG3 == 16'b1)) begin // axis tbcall_region |
| 308 | $display(" WATCH_DOG%h_3 %d",core_id_r, $time); |
| 309 | end |
| 310 | if ((WDOG4 == 16'b1)) begin // axis tbcall_region |
| 311 | $display(" WATCH_DOG%h_4 %d",core_id_r, $time); |
| 312 | end |
| 313 | if ((WDOG5 == 16'b1)) begin // axis tbcall_region |
| 314 | $display(" WATCH_DOG%h_5 %d",core_id_r, $time); |
| 315 | end |
| 316 | if ((WDOG6 == 16'b1)) begin // axis tbcall_region |
| 317 | $display(" WATCH_DOG%h_6 %d",core_id_r, $time); |
| 318 | end |
| 319 | if ((WDOG7 == 16'b1)) begin // axis tbcall_region |
| 320 | $display(" WATCH_DOG%h_7 %d",core_id_r, $time); |
| 321 | end |
| 322 | end |
| 323 | `else |
| 324 | begin |
| 325 | if ((wdog0p == 16'b1)) begin |
| 326 | $display(" WATCH_DOG%h_0 %d",core_id, CLK_CNT); |
| 327 | end |
| 328 | if ((wdog1p == 16'b1)) begin |
| 329 | $display(" WATCH_DOG%h_1 %d",core_id, CLK_CNT); |
| 330 | end |
| 331 | if ((wdog2p == 16'b1)) begin |
| 332 | $display(" WATCH_DOG%h_2 %d",core_id, CLK_CNT); |
| 333 | end |
| 334 | if ((wdog3p == 16'b1)) begin |
| 335 | $display(" WATCH_DOG%h_3 %d",core_id, CLK_CNT); |
| 336 | end |
| 337 | end |
| 338 | `endif |
| 339 | |
| 340 | begin |
| 341 | if (wdog_intv0) begin |
| 342 | $display(" RESUME%h_0 %h %d",core_id, cpx_spc_data_cx2[17:16], CLK_CNT); |
| 343 | end |
| 344 | if (wdog_intv1) begin |
| 345 | $display(" RESUME%h_1 %h %d",core_id, cpx_spc_data_cx2[17:16], CLK_CNT); |
| 346 | end |
| 347 | if (wdog_intv2) begin |
| 348 | $display(" RESUME%h_2 %h %d",core_id, cpx_spc_data_cx2[17:16], CLK_CNT); |
| 349 | end |
| 350 | if (wdog_intv3) begin |
| 351 | $display(" RESUME%h_3 %h %d",core_id, cpx_spc_data_cx2[17:16], CLK_CNT); |
| 352 | end |
| 353 | end |
| 354 | |
| 355 | REQ_CY <= (reset96) ? 1'b0 : req_cyP; |
| 356 | |
| 357 | REQ_OUTSTANDING0 <= (reset96) ? 2'b00 : req_outstanding0p[1:0]; |
| 358 | REQ_OUTSTANDING1 <= (reset96) ? 2'b00 : req_outstanding1p[1:0]; |
| 359 | REQ_OUTSTANDING2 <= (reset96) ? 2'b00 : req_outstanding2p[1:0]; |
| 360 | REQ_OUTSTANDING3 <= (reset96) ? 2'b00 : req_outstanding3p[1:0]; |
| 361 | REQ_OUTSTANDING4 <= (reset96) ? 2'b00 : req_outstanding4p[1:0]; |
| 362 | REQ_OUTSTANDING5 <= (reset96) ? 2'b00 : req_outstanding5p[1:0]; |
| 363 | REQ_OUTSTANDING6 <= (reset96) ? 2'b00 : req_outstanding6p[1:0]; |
| 364 | REQ_OUTSTANDING7 <= (reset96) ? 2'b00 : req_outstanding7p[1:0]; |
| 365 | REQ_OUTSTANDING8 <= (reset96) ? 2'b00 : req_outstanding8p[1:0]; |
| 366 | |
| 367 | ERROR_BANK <= (reset96) ? 1'b0 : error_bankP; |
| 368 | |
| 369 | core_id_r <= core_id; |
| 370 | spc_pcx_data_pa_r <= spc_pcx_data_pa; |
| 371 | cpx_spc_data_cx2_r <= cpx_spc_data_cx2; |
| 372 | |
| 373 | begin |
| 374 | if (ERROR_BANK) |
| 375 | begin // axis tbcall_region |
| 376 | $display(" ERROR%h: MORE THAN TWO REQUESTS FROM A CORE TO A BANK ON CYCLE %d",core_id_r, $time); |
| 377 | end |
| 378 | end |
| 379 | |
| 380 | `ifdef AXIS |
| 381 | if (istor_req & pcx_cpx_en) |
| 382 | begin // axis tbcall_region |
| 383 | $display(" STOR%h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 384 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 385 | end |
| 386 | if (ifill_req & pcx_cpx_en) |
| 387 | begin // axis tbcall_region |
| 388 | $display(" FILL%h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 389 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 390 | end |
| 391 | if (iload_req & pcx_cpx_en) |
| 392 | begin // axis tbcall_region |
| 393 | $display(" LOAD%h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 394 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 395 | end |
| 396 | if (ilstm_req & pcx_cpx_en) |
| 397 | begin // axis tbcall_region |
| 398 | $display(" LSTM%h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 399 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 400 | end |
| 401 | if (ifprl_req & pcx_cpx_en) |
| 402 | begin // axis tbcall_region |
| 403 | $display(" FP %h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 404 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 405 | end |
| 406 | if (icasa1_req & pcx_cpx_en) |
| 407 | begin // axis tbcall_region |
| 408 | $display(" CAS1 %h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 409 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 410 | end |
| 411 | if (icasa2_req & pcx_cpx_en) |
| 412 | begin // axis tbcall_region |
| 413 | $display(" CAS2 %h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], |
| 414 | $time, spc_pcx_data_pa_r[129:104], spc_pcx_data_pa_r[103:64], spc_pcx_data_pa_r[63:0]); |
| 415 | end |
| 416 | if (load_ack & pcx_cpx_en) |
| 417 | begin // axis tbcall_region |
| 418 | $display(" LACK%h_%h %d %h_%h_%h", core_id_r, cpx_spc_data_cx2_r[136:134], |
| 419 | $time, cpx_spc_data_cx2_r[145:128], cpx_spc_data_cx2_r[127:64],cpx_spc_data_cx2_r[63:0]); |
| 420 | end |
| 421 | if (fill_ack & pcx_cpx_en) |
| 422 | begin // axis tbcall_region |
| 423 | $display(" FACK%h_%h %d %h_%h_%h", core_id_r, cpx_spc_data_cx2_r[136:134], |
| 424 | $time, cpx_spc_data_cx2_r[145:128], cpx_spc_data_cx2_r[127:64],cpx_spc_data_cx2_r[63:0]); |
| 425 | end |
| 426 | if (stor_ack & pcx_cpx_en) |
| 427 | begin // axis tbcall_region |
| 428 | $display(" SACK%h_%h %d %h_%h_%h", core_id_r, cpx_spc_data_cx2_r[136:134], |
| 429 | $time, cpx_spc_data_cx2_r[145:128], cpx_spc_data_cx2_r[127:64],cpx_spc_data_cx2_r[63:0]); |
| 430 | end |
| 431 | if (evict & pcx_cpx_en) |
| 432 | begin // axis tbcall_region |
| 433 | $display(" EVICT%h_0 %h_1 %h_2 %h_3 %d %h_%h_%h", core_id_r, |
| 434 | core_id_r, |
| 435 | core_id_r, |
| 436 | core_id_r, |
| 437 | $time, cpx_spc_data_cx2_r[145:128], cpx_spc_data_cx2_r[127:64],cpx_spc_data_cx2_r[63:0]); |
| 438 | end |
| 439 | if (error_ack & pcx_cpx_en) |
| 440 | begin // axis tbcall_region |
| 441 | $display(" EACK%h %d", core_id_r, $time); |
| 442 | end |
| 443 | |
| 444 | `else |
| 445 | if (istor_req) $display(" STOR%h_%h %d %h", core_id, spc_pcx_data_pa[119:117], CLK_CNT, spc_pcx_data_pa[123:0]); |
| 446 | if (ifill_req) $display(" FILL%h_%h %d %h", core_id, spc_pcx_data_pa[119:117], CLK_CNT, spc_pcx_data_pa[123:0]); |
| 447 | if (iload_req) $display(" LOAD%h_%h %d %h", core_id, spc_pcx_data_pa[119:117], CLK_CNT, spc_pcx_data_pa[123:0]); |
| 448 | if (ilstm_req) $display(" LSTM%h_%h %d %h", core_id, spc_pcx_data_pa[119:117], CLK_CNT, spc_pcx_data_pa[123:0]); |
| 449 | if (ifprl_req) $display(" FP %h_%h %d %h", core_id, spc_pcx_data_pa[119:117], CLK_CNT, spc_pcx_data_pa[123:0]); |
| 450 | |
| 451 | if (load_ack) $display(" LACK%h_%h %d %h", core_id, cpx_spc_data_cx2[136:134], |
| 452 | CLK_CNT, cpx_spc_data_cx2[145:0]); |
| 453 | if (fill_ack) $display(" FACK%h_%h %d %h", core_id, cpx_spc_data_cx2[136:134], |
| 454 | CLK_CNT, cpx_spc_data_cx2[145:0]); |
| 455 | if (stor_ack) $display(" SACK%h_%h %d %h", core_id, cpx_spc_data_cx2[136:134], |
| 456 | CLK_CNT, cpx_spc_data_cx2[145:0]); |
| 457 | |
| 458 | if (evict ) $display(" EVICT%h_0 %h_1 %h_2 %h_3 %d %h", core_id, |
| 459 | core_id, |
| 460 | core_id, |
| 461 | core_id, |
| 462 | CLK_CNT, cpx_spc_data_cx2[145:0]); |
| 463 | |
| 464 | if (error_ack) $display(" EACK%h %d", core_id, CLK_CNT); |
| 465 | `endif |
| 466 | |
| 467 | `ifdef AXIS |
| 468 | // if (REQ_CY & pcx_cpx_short) |
| 469 | if (REQ_CY & pcx_cpx_short || (REQ_CY & spc_pcx_data_pa[103] & pcx_cpx_io)) |
| 470 | begin // axis tbcall_region |
| 471 | $display("PCX%h_%h %d %h_%h_%h", core_id_r, spc_pcx_data_pa_r[119:117], $time, spc_pcx_data_pa_r[129:104], |
| 472 | spc_pcx_data_pa_r[103:64],spc_pcx_data_pa_r[63:0]); |
| 473 | end |
| 474 | |
| 475 | if (cpx_spc_data_cx2[145] & pcx_cpx_short) |
| 476 | begin // axis tbcall_region |
| 477 | $display("CPX%h_%h %d %h_%h_%h", core_id_r, cpx_spc_data_cx2_r[136:134], $time, cpx_spc_data_cx2_r[145:128], |
| 478 | cpx_spc_data_cx2_r[127:64],cpx_spc_data_cx2_r[63:0]); |
| 479 | end |
| 480 | `else |
| 481 | if (REQ_CY & pcx_cpx_short) |
| 482 | begin // axis tbcall_region |
| 483 | $display("PCX%h_%h %d %h_%h_%h", core_id, spc_pcx_data_pa_r[119:117], CLK_CNT, spc_pcx_data_pa[129:104], |
| 484 | spc_pcx_data_pa[103:64],spc_pcx_data_pa[63:0]); |
| 485 | end |
| 486 | |
| 487 | if (cpx_spc_data_cx2[145] & pcx_cpx_short) |
| 488 | begin // axis tbcall_region |
| 489 | $display("CPX%h_%h %d %h_%h_%h", core_id, cpx_spc_data_cx2_r[136:134], CLK_CNT, cpx_spc_data_cx2[145:128], |
| 490 | cpx_spc_data_cx2[127:64],cpx_spc_data_cx2[63:0]); |
| 491 | end |
| 492 | `endif |
| 493 | |
| 494 | |
| 495 | `ifdef AXIS |
| 496 | begin |
| 497 | CONSOLE_DATA <= spc_pcx_data_pa[63:0]; |
| 498 | |
| 499 | if (hyperv_console) |
| 500 | begin // axis tbcall_region |
| 501 | $display("%h HYPERVISOR CONSOLE%h_%h %h",CLK_CNT, core_id_r, |
| 502 | spc_pcx_data_pa_r[119:117], CONSOLE_DATA[7:0]); |
| 503 | end |
| 504 | if (guest0_console) |
| 505 | begin // axis tbcall_region |
| 506 | $display("%h GUEST0 CONSOLE%h_%h %h",CLK_CNT,core_id_r, |
| 507 | spc_pcx_data_pa_r[119:117], CONSOLE_DATA[7:0]); |
| 508 | end |
| 509 | if (guest1_console) |
| 510 | begin // axis tbcall_region |
| 511 | $display("%h GUEST1 CONSOLE%h_%h %h",CLK_CNT,core_id_r, |
| 512 | spc_pcx_data_pa_r[119:117], CONSOLE_DATA[7:0]); |
| 513 | end |
| 514 | if (guest2_console) |
| 515 | begin // axis tbcall_region |
| 516 | $display("%h GUEST2 CONSOLE%h_%h %h",CLK_CNT,core_id_r, |
| 517 | spc_pcx_data_pa_r[119:117], CONSOLE_DATA[7:0]); |
| 518 | end |
| 519 | if (guest3_console) |
| 520 | begin // axis tbcall_region |
| 521 | $display("%h GUEST3 CONSOLE%h_%h %h",CLK_CNT,core_id_r, |
| 522 | spc_pcx_data_pa_r[119:117], CONSOLE_DATA[7:0]); |
| 523 | end |
| 524 | end |
| 525 | `else |
| 526 | begin |
| 527 | if (hyperv_console) |
| 528 | begin // axis tbcall_region |
| 529 | $display("%h HYPERVISOR CONSOLE%h_0 %h",CLK_CNT,core_id, spc_pcx_data_pa[7:0]); |
| 530 | end |
| 531 | end |
| 532 | `endif |
| 533 | |
| 534 | end |
| 535 | |
| 536 | |
| 537 | endmodule |
| 538 | |
| 539 | module axis_io_mon ( |
| 540 | clk, |
| 541 | reset96, |
| 542 | io_cpx_data_ca, |
| 543 | io_cpx_req_cq, |
| 544 | io_pcx_stall_pq, |
| 545 | cpx_io_grant_cx, |
| 546 | |
| 547 | CLK_CNT, |
| 548 | core_mask, |
| 549 | core_id, |
| 550 | en_status, |
| 551 | pcx_cpx_en, |
| 552 | pcx_cpx_short, |
| 553 | pcx_cpx_io, |
| 554 | watch_dog_finish |
| 555 | ); |
| 556 | |
| 557 | |
| 558 | input clk; |
| 559 | input reset96; |
| 560 | input [145:0] io_cpx_data_ca; |
| 561 | input [7:0] io_cpx_req_cq; |
| 562 | input io_pcx_stall_pq; |
| 563 | input [7:0] cpx_io_grant_cx; |
| 564 | input [ 39:0] CLK_CNT; |
| 565 | input [ 7:0] core_mask; |
| 566 | input [ 2:0] core_id; |
| 567 | input en_status; |
| 568 | input pcx_cpx_en; |
| 569 | input pcx_cpx_short; |
| 570 | input pcx_cpx_io; |
| 571 | |
| 572 | output watch_dog_finish; |
| 573 | |
| 574 | reg [7:0] io_cpx_req_cq_r; |
| 575 | reg [145:0] io_cpx_data_ca_r; |
| 576 | reg [7:0] io_cpx_req_cq_r1; |
| 577 | reg [145:0] io_cpx_data_ca_r1; |
| 578 | |
| 579 | always @(posedge clk) begin |
| 580 | io_cpx_req_cq_r <= io_cpx_req_cq; |
| 581 | io_cpx_data_ca_r <= io_cpx_data_ca; |
| 582 | |
| 583 | if (|io_cpx_req_cq_r1 & pcx_cpx_io) |
| 584 | begin // axis tbcall_region |
| 585 | $display("IOX%h_%h %d %h_%h_%h", io_cpx_req_cq_r,io_cpx_data_ca_r[136:134], $time, io_cpx_data_ca_r[145:128], |
| 586 | io_cpx_data_ca_r[127:64],io_cpx_data_ca_r[63:0]); |
| 587 | end |
| 588 | end |
| 589 | always @(negedge clk) begin |
| 590 | io_cpx_req_cq_r1 <= io_cpx_req_cq_r; |
| 591 | end |
| 592 | endmodule |
| 593 | |