Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / env / fc / axis_ccx_mon.v
CommitLineData
86530b38
AT
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
74reg [15:0] WDOG0, WDOG1, WDOG2, WDOG3, WDOG4,WDOG5,WDOG6,WDOG7;
75reg WDOG_IDLE0, WDOG_IDLE1, WDOG_IDLE2, WDOG_IDLE3 , WDOG_IDLE4, WDOG_IDLE5, WDOG_IDLE6, WDOG_IDLE7;
76
77reg REQ_CY;
78reg ERROR_BANK;
79reg [1:0] REQ_OUTSTANDING0;
80reg [1:0] REQ_OUTSTANDING1;
81reg [1:0] REQ_OUTSTANDING2;
82reg [1:0] REQ_OUTSTANDING3;
83reg [1:0] REQ_OUTSTANDING4;
84reg [1:0] REQ_OUTSTANDING5;
85reg [1:0] REQ_OUTSTANDING6;
86reg [1:0] REQ_OUTSTANDING7;
87reg [1:0] REQ_OUTSTANDING8;
88reg [63:0] CONSOLE_DATA;
89
90reg [3:0] HYP_WATCH_CNT;
91reg [1:0] HYP_WATCH_ITER;
92
93reg [2:0] core_id_r;
94reg [8:0] tlu_early_ttype_g_r;
95reg [1:0] true_trap_tid_g_r;
96reg [2:0] trp_lvl_r;
97reg [ 48:0] tlu_restore_pc_w1_r;
98reg [129:0] spc_pcx_data_pa_r;
99reg [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*******************************************************************************************************************/
105wire wdog_fwdv = (spc_pcx_data_pa[122:119] == 4'h6);
106
107`ifdef CMP_IOBDG
108wire wdog_clk = (CLK_CNT > 190000);
109`else
110wire wdog_clk = (CLK_CNT > 20000);
111`endif
112
113wire wdog_reqv0 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b000) & ~wdog_fwdv & wdog_clk & core_mask[0];
114wire wdog_reqv1 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b001) & ~wdog_fwdv & wdog_clk & core_mask[1];
115wire wdog_reqv2 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b010) & ~wdog_fwdv & wdog_clk & core_mask[2];
116wire wdog_reqv3 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b011) & ~wdog_fwdv & wdog_clk & core_mask[3];
117wire wdog_reqv4 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b100) & ~wdog_fwdv & wdog_clk & core_mask[4];
118wire wdog_reqv5 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b101) & ~wdog_fwdv & wdog_clk & core_mask[5];
119wire wdog_reqv6 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b110) & ~wdog_fwdv & wdog_clk & core_mask[6];
120wire wdog_reqv7 = spc_pcx_data_pa[129] & (spc_pcx_data_pa[119:117] == 3'b111) & ~wdog_fwdv & wdog_clk & core_mask[7];
121
122wire 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];
123wire 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];
124wire 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];
125wire 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];
126wire 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];
127wire 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];
128wire 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];
129wire 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
131wire [15:0] wdog0p = wdog_reqv0 ? 16'hFFFF :
132 (WDOG0 == 16'h0000) ? 16'h0000 :
133 WDOG_IDLE0 ? WDOG0 : ((WDOG0 - 1'b1) & 16'hFFFF);
134wire [15:0] wdog1p = wdog_reqv1 ? 16'hFFFF :
135 (WDOG1 == 16'h0000) ? 16'h0000 :
136 WDOG_IDLE1 ? WDOG1 : ((WDOG1 - 1'b1) & 16'hFFFF);
137wire [15:0] wdog2p = wdog_reqv2 ? 16'hFFFF :
138 (WDOG2 == 16'h0000) ? 16'h0000 :
139 WDOG_IDLE2 ? WDOG2 : ((WDOG2 - 1'b1) & 16'hFFFF);
140wire [15:0] wdog3p = wdog_reqv3 ? 16'hFFFF :
141 (WDOG3 == 16'h0000) ? 16'h0000 :
142 WDOG_IDLE3 ? WDOG3 : ((WDOG3 - 1'b1) & 16'hFFFF);
143wire [15:0] wdog4p = wdog_reqv4 ? 16'hFFFF :
144 (WDOG4 == 16'h0000) ? 16'h0000 :
145 WDOG_IDLE4 ? WDOG4 : ((WDOG4 - 1'b1) & 16'hFFFF);
146wire [15:0] wdog5p = wdog_reqv5 ? 16'hFFFF :
147 (WDOG5 == 16'h0000) ? 16'h0000 :
148 WDOG_IDLE5 ? WDOG5 : ((WDOG5 - 1'b1) & 16'hFFFF);
149wire [15:0] wdog6p = wdog_reqv6 ? 16'hFFFF :
150 (WDOG6 == 16'h0000) ? 16'h0000 :
151 WDOG_IDLE6 ? WDOG6 : ((WDOG6 - 1'b1) & 16'hFFFF);
152wire [15:0] wdog7p = wdog_reqv7 ? 16'hFFFF :
153 (WDOG7 == 16'h0000) ? 16'h0000 :
154 WDOG_IDLE7 ? WDOG7 : ((WDOG7 - 1'b1) & 16'hFFFF);
155
156wire wdog_idle0p = wdog_intv0 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE0;
157wire wdog_idle1p = wdog_intv1 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE1;
158wire wdog_idle2p = wdog_intv2 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE2;
159wire wdog_idle3p = wdog_intv3 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE3;
160wire wdog_idle4p = wdog_intv4 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE4;
161wire wdog_idle5p = wdog_intv5 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE4;
162wire wdog_idle6p = wdog_intv6 ? (cpx_spc_data_cx2[17:16] == 2'b10) : WDOG_IDLE5;
163wire 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*******************************************************************************************************************/
168wire 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
179wire [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);
183wire [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);
187wire [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);
191wire [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/*{{{ */
196wire [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/*{{{ */
202wire [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/*{{{ */
208wire [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/*{{{ */
214wire [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/*{{{ */
220wire [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
226wire 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*******************************************************************************************************************/
236wire istor_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100001);
237wire ifill_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b110000);
238wire ifprl_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b101010);
239wire iload_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100000) & ~spc_pcx_data_pa[115];
240wire ilstm_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100000) & spc_pcx_data_pa[115];
241wire icasa1_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100010);
242wire icasa2_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100011);
243wire iswap_req = REQ_CY & (spc_pcx_data_pa[129:124] == 6'b100111);
244
245wire error_ack = (cpx_spc_data_cx2[145:141] == 5'b11100);
246wire load_ack = (cpx_spc_data_cx2[145:141] == 5'b10000);
247wire fill_ack = (cpx_spc_data_cx2[145:141] == 5'b10001);
248wire stor_ack = (cpx_spc_data_cx2[145:141] == 5'b10100);
249wire evict = (cpx_spc_data_cx2[145:141] == 5'b10011);
250
251wire hyperv_console = ((istor_req) & ((spc_pcx_data_pa[103:64] == 40'h1f00000000) |
252 (spc_pcx_data_pa[103:64] == 40'hfff0c2c000)));
253
254wire guest0_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10002000));
255wire guest1_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10004000));
256wire guest2_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10006000));
257wire guest3_console = ((istor_req) & (spc_pcx_data_pa[103:64] == 40'h1f10008000));
258
259wire [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
269wire [1:0] hyp_watch_iterP = (hyperv_console & (HYP_WATCH_CNT == 8'hff)) ? (HYP_WATCH_ITER + 1) : HYP_WATCH_ITER;
270
271assign watch_dog_finish = (HYP_WATCH_ITER == 2'b11);
272
273always @(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
534end
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
574reg [7:0] io_cpx_req_cq_r;
575reg [145:0] io_cpx_data_ca_r;
576reg [7:0] io_cpx_req_cq_r1;
577reg [145:0] io_cpx_data_ca_r1;
578
579always @(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
588end
589always @(negedge clk) begin
590 io_cpx_req_cq_r1 <= io_cpx_req_cq_r;
591end
592endmodule
593