Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: fc_l2_csr_probe.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 | `include "fc.vh" | |
36 | `include "defines.vh" | |
37 | `include "ccx.vri" | |
38 | `include "cmp.vri" | |
39 | ||
40 | ||
41 | ||
42 | `define NIU_UCB `CPU.rdp.niu_pio_ucb | |
43 | `define NIU_PIO `CPU.rdp.niu_pio | |
44 | ||
45 | `timescale 1 ps/ 1 ps | |
46 | ||
47 | module fc_l2_csr_probe; | |
48 | //connect wires | |
49 | wire l20_arbdp_inst_diag_c2; | |
50 | wire l20_arbdp_inst_load_c2; | |
51 | wire [39:0] l20_arbdp_addr_c2; | |
52 | wire [63:0] l20_csr_rd_data_c8; | |
53 | wire [63:0] l20_tmp_inval_data_c7; | |
54 | ||
55 | wire l21_arbdp_inst_diag_c2; | |
56 | wire l21_arbdp_inst_load_c2; | |
57 | wire [39:0] l21_arbdp_addr_c2; | |
58 | wire [63:0] l21_csr_rd_data_c8; | |
59 | wire [63:0] l21_tmp_inval_data_c7; | |
60 | ||
61 | ||
62 | wire l22_arbdp_inst_diag_c2; | |
63 | wire l22_arbdp_inst_load_c2; | |
64 | wire [39:0] l22_arbdp_addr_c2; | |
65 | wire [63:0] l22_csr_rd_data_c8; | |
66 | wire [63:0] l22_tmp_inval_data_c7; | |
67 | ||
68 | ||
69 | wire l23_arbdp_inst_diag_c2; | |
70 | wire l23_arbdp_inst_load_c2; | |
71 | wire [39:0] l23_arbdp_addr_c2; | |
72 | wire [63:0] l23_csr_rd_data_c8; | |
73 | wire [63:0] l23_tmp_inval_data_c7; | |
74 | ||
75 | ||
76 | wire l24_arbdp_inst_diag_c2; | |
77 | wire l24_arbdp_inst_load_c2; | |
78 | wire [39:0] l24_arbdp_addr_c2; | |
79 | wire [63:0] l24_csr_rd_data_c8; | |
80 | wire [63:0] l24_tmp_inval_data_c7; | |
81 | ||
82 | ||
83 | wire l25_arbdp_inst_diag_c2; | |
84 | wire l25_arbdp_inst_load_c2; | |
85 | wire [39:0] l25_arbdp_addr_c2; | |
86 | wire [63:0] l25_csr_rd_data_c8; | |
87 | wire [63:0] l25_tmp_inval_data_c7; | |
88 | ||
89 | ||
90 | wire l26_arbdp_inst_diag_c2; | |
91 | wire l26_arbdp_inst_load_c2; | |
92 | wire [39:0] l26_arbdp_addr_c2; | |
93 | wire [63:0] l26_csr_rd_data_c8; | |
94 | wire [63:0] l26_tmp_inval_data_c7; | |
95 | ||
96 | ||
97 | wire l27_arbdp_inst_diag_c2; | |
98 | wire l27_arbdp_inst_load_c2; | |
99 | wire [39:0] l27_arbdp_addr_c2; | |
100 | wire [63:0] l27_csr_rd_data_c8; | |
101 | wire [63:0] l27_tmp_inval_data_c7; | |
102 | ||
103 | wire l20_ld_c2, l21_ld_c2, l22_ld_c2, l23_ld_c2; | |
104 | wire l24_ld_c2, l25_ld_c2, l26_ld_c2, l27_ld_c2; | |
105 | ||
106 | assign l20_arbdp_addr_c2 = `CPU.l2t0.arbadr.arbdp_addr_c2; | |
107 | assign l20_arb_decdp_ld_inst_c2 = `CPU.l2t0.arb.arb_csr_rd_en_c2; | |
108 | assign l20_csr_rd_data_c8 = `CPU.l2t0.csr_rd_data_c8; | |
109 | assign l20_arbdp_inst_diag_c2 = `CPU.l2t0.arb.arb_inst_diag_c2; | |
110 | assign l20_tmp_inval_data_c7 = `CPU.l2t0.oque.tmp_inval_data_c7; | |
111 | assign l20_ld_c2 = `CPU.l2t0.arb.arb_decdp_ld_inst_c2; | |
112 | assign #1 l20_clk = `CPU.l2t0.gclk; | |
113 | ||
114 | assign l21_arbdp_addr_c2 = `CPU.l2t1.arbadr.arbdp_addr_c2; | |
115 | assign l21_arb_decdp_ld_inst_c2 = `CPU.l2t1.arb.arb_csr_rd_en_c2; | |
116 | assign l21_csr_rd_data_c8 = `CPU.l2t1.csr_rd_data_c8; | |
117 | assign l21_arbdp_inst_diag_c2 = `CPU.l2t1.arb.arb_inst_diag_c2; | |
118 | assign l21_tmp_inval_data_c7 = `CPU.l2t1.oque.tmp_inval_data_c7; | |
119 | assign l21_ld_c2 = `CPU.l2t1.arb.arb_decdp_ld_inst_c2; | |
120 | assign #1 l21_clk = `CPU.l2t1.gclk; | |
121 | ||
122 | ||
123 | assign l22_arbdp_addr_c2 = `CPU.l2t2.arbadr.arbdp_addr_c2; | |
124 | assign l22_arb_decdp_ld_inst_c2 = `CPU.l2t2.arb.arb_csr_rd_en_c2; | |
125 | assign l22_csr_rd_data_c8 = `CPU.l2t2.csr_rd_data_c8; | |
126 | assign l22_arbdp_inst_diag_c2 = `CPU.l2t2.arb.arb_inst_diag_c2; | |
127 | assign l22_tmp_inval_data_c7 = `CPU.l2t2.oque.tmp_inval_data_c7; | |
128 | assign l22_ld_c2 = `CPU.l2t2.arb.arb_decdp_ld_inst_c2; | |
129 | assign #1 l22_clk = `CPU.l2t2.gclk; | |
130 | ||
131 | assign l23_arbdp_addr_c2 = `CPU.l2t3.arbadr.arbdp_addr_c2; | |
132 | assign l23_arb_decdp_ld_inst_c2 = `CPU.l2t3.arb.arb_csr_rd_en_c2; | |
133 | assign l23_csr_rd_data_c8 = `CPU.l2t3.csr_rd_data_c8; | |
134 | assign l23_arbdp_inst_diag_c2 = `CPU.l2t3.arb.arb_inst_diag_c2; | |
135 | assign l23_tmp_inval_data_c7 = `CPU.l2t3.oque.tmp_inval_data_c7; | |
136 | assign l23_ld_c2 = `CPU.l2t3.arb.arb_decdp_ld_inst_c2; | |
137 | assign #1 l23_clk = `CPU.l2t3.gclk; | |
138 | ||
139 | assign l24_arbdp_addr_c2 = `CPU.l2t4.arbadr.arbdp_addr_c2; | |
140 | assign l24_arb_decdp_ld_inst_c2 = `CPU.l2t4.arb.arb_csr_rd_en_c2; | |
141 | assign l24_csr_rd_data_c8 = `CPU.l2t4.csr_rd_data_c8; | |
142 | assign l24_arbdp_inst_diag_c2 = `CPU.l2t4.arb.arb_inst_diag_c2; | |
143 | assign l24_tmp_inval_data_c7 = `CPU.l2t4.oque.tmp_inval_data_c7; | |
144 | assign l24_ld_c2 = `CPU.l2t4.arb.arb_decdp_ld_inst_c2; | |
145 | assign #1 l24_clk = `CPU.l2t4.gclk; | |
146 | ||
147 | ||
148 | assign l25_arbdp_addr_c2 = `CPU.l2t5.arbadr.arbdp_addr_c2; | |
149 | assign l25_arb_decdp_ld_inst_c2 = `CPU.l2t5.arb.arb_csr_rd_en_c2; | |
150 | assign l25_csr_rd_data_c8 = `CPU.l2t5.csr_rd_data_c8; | |
151 | assign l25_arbdp_inst_diag_c2 = `CPU.l2t5.arb.arb_inst_diag_c2; | |
152 | assign l25_tmp_inval_data_c7 = `CPU.l2t5.oque.tmp_inval_data_c7; | |
153 | assign l25_ld_c2 = `CPU.l2t5.arb.arb_decdp_ld_inst_c2; | |
154 | assign #1 l25_clk = `CPU.l2t5.gclk; | |
155 | ||
156 | ||
157 | assign l26_arbdp_addr_c2 = `CPU.l2t6.arbadr.arbdp_addr_c2; | |
158 | assign l26_arb_decdp_ld_inst_c2 = `CPU.l2t6.arb.arb_csr_rd_en_c2; | |
159 | assign l26_csr_rd_data_c8 = `CPU.l2t6.csr_rd_data_c8; | |
160 | assign l26_arbdp_inst_diag_c2 = `CPU.l2t6.arb.arb_inst_diag_c2; | |
161 | assign l26_tmp_inval_data_c7 = `CPU.l2t6.oque.tmp_inval_data_c7; | |
162 | assign l26_ld_c2 = `CPU.l2t6.arb.arb_decdp_ld_inst_c2; | |
163 | assign #1 l26_clk = `CPU.l2t6.gclk; | |
164 | ||
165 | ||
166 | assign l27_arbdp_addr_c2 = `CPU.l2t7.arbadr.arbdp_addr_c2; | |
167 | assign l27_arb_decdp_ld_inst_c2 = `CPU.l2t7.arb.arb_csr_rd_en_c2; | |
168 | assign l27_csr_rd_data_c8 = `CPU.l2t7.csr_rd_data_c8; | |
169 | assign l27_arbdp_inst_diag_c2 = `CPU.l2t7.arb.arb_inst_diag_c2; | |
170 | assign l27_tmp_inval_data_c7 = `CPU.l2t7.oque.tmp_inval_data_c7; | |
171 | assign l27_ld_c2 = `CPU.l2t7.arb.arb_decdp_ld_inst_c2; | |
172 | assign #1 l27_clk = `CPU.l2t7.gclk; | |
173 | ||
174 | ||
175 | l2_csr_probe l20_csr_probe( .bank_id(3'b000), .l2_clk(l20_clk), .ld_inst_c2(l20_arb_decdp_ld_inst_c2), .addr_c2(l20_arbdp_addr_c2), .rd_data_c8(l20_csr_rd_data_c8), .diag_inst(l20_arbdp_inst_diag_c2), .mux_data(l20_tmp_inval_data_c7), .diag_ld_inst_c2(l20_ld_c2)); | |
176 | ||
177 | l2_csr_probe l21_csr_probe( .bank_id(3'b001), .l2_clk(l21_clk), .ld_inst_c2(l21_arb_decdp_ld_inst_c2), .addr_c2(l21_arbdp_addr_c2), .rd_data_c8(l21_csr_rd_data_c8), .diag_inst(l21_arbdp_inst_diag_c2), .mux_data(l21_tmp_inval_data_c7), .diag_ld_inst_c2(l21_ld_c2)); | |
178 | ||
179 | l2_csr_probe l22_csr_probe( .bank_id(3'b010), .l2_clk(l22_clk), .ld_inst_c2(l22_arb_decdp_ld_inst_c2), .addr_c2(l22_arbdp_addr_c2), .rd_data_c8(l22_csr_rd_data_c8), .diag_inst(l22_arbdp_inst_diag_c2), .mux_data(l22_tmp_inval_data_c7), .diag_ld_inst_c2(l22_ld_c2)); | |
180 | ||
181 | l2_csr_probe l23_csr_probe( .bank_id(3'b011), .l2_clk(l23_clk), .ld_inst_c2(l23_arb_decdp_ld_inst_c2), .addr_c2(l23_arbdp_addr_c2), .rd_data_c8(l23_csr_rd_data_c8), .diag_inst(l23_arbdp_inst_diag_c2), .mux_data(l23_tmp_inval_data_c7), .diag_ld_inst_c2(l23_ld_c2)); | |
182 | ||
183 | ||
184 | l2_csr_probe l24_csr_probe( .bank_id(3'b100), .l2_clk(l24_clk), .ld_inst_c2(l24_arb_decdp_ld_inst_c2), .addr_c2(l24_arbdp_addr_c2), .rd_data_c8(l24_csr_rd_data_c8), .diag_inst(l24_arbdp_inst_diag_c2), .mux_data(l24_tmp_inval_data_c7), .diag_ld_inst_c2(l24_ld_c2)); | |
185 | ||
186 | ||
187 | l2_csr_probe l25_csr_probe( .bank_id(3'b101), .l2_clk(l25_clk), .ld_inst_c2(l25_arb_decdp_ld_inst_c2), .addr_c2(l25_arbdp_addr_c2), .rd_data_c8(l25_csr_rd_data_c8), .diag_inst(l25_arbdp_inst_diag_c2), .mux_data(l25_tmp_inval_data_c7), .diag_ld_inst_c2(l25_ld_c2)); | |
188 | ||
189 | l2_csr_probe l26_csr_probe( .bank_id(3'b110), .l2_clk(l26_clk), .ld_inst_c2(l26_arb_decdp_ld_inst_c2), .addr_c2(l26_arbdp_addr_c2), .rd_data_c8(l26_csr_rd_data_c8), .diag_inst(l26_arbdp_inst_diag_c2), .mux_data(l26_tmp_inval_data_c7), .diag_ld_inst_c2(l26_ld_c2)); | |
190 | ||
191 | l2_csr_probe l27_csr_probe( .bank_id(3'b111), .l2_clk(l27_clk), .ld_inst_c2(l27_arb_decdp_ld_inst_c2), .addr_c2(l27_arbdp_addr_c2), .rd_data_c8(l27_csr_rd_data_c8), .diag_inst(l27_arbdp_inst_diag_c2), .mux_data(l27_tmp_inval_data_c7), .diag_ld_inst_c2(l27_ld_c2)); | |
192 | ||
193 | ||
194 | ||
195 | ||
196 | ||
197 | endmodule | |
198 | ||
199 | module l2_csr_probe ( bank_id, l2_clk, ld_inst_c2, addr_c2, rd_data_c8, diag_inst, mux_data, diag_ld_inst_c2); | |
200 | ||
201 | input [2:0] bank_id; | |
202 | input ld_inst_c2, diag_inst; | |
203 | input [39:0] addr_c2; | |
204 | input [63:0] rd_data_c8, mux_data; | |
205 | input l2_clk; | |
206 | input diag_ld_inst_c2; | |
207 | ||
208 | integer l2_probe; | |
209 | ||
210 | reg [2:0] state; | |
211 | wire [39:0] addr_c2; | |
212 | wire [63:0] rd_data_c8; | |
213 | ||
214 | reg csr_rd_c3, diag_ld_c3; | |
215 | reg csr_rd_c4, diag_ld_c4; | |
216 | reg csr_rd_c5, diag_ld_c5; | |
217 | reg csr_rd_c6, diag_ld_c6; | |
218 | reg csr_rd_c7, diag_ld_c7; | |
219 | reg csr_rd_c8, diag_ld_c8; | |
220 | reg csr_rd_c9, diag_ld_c9; | |
221 | ||
222 | reg [39:0] csr_addr_c3; | |
223 | reg [39:0] csr_addr_c4; | |
224 | reg [39:0] csr_addr_c5; | |
225 | reg [39:0] csr_addr_c6; | |
226 | reg [39:0] csr_addr_c7; | |
227 | reg [39:0] csr_addr_c8; | |
228 | reg [39:0] csr_addr_c9; | |
229 | wire eer; | |
230 | assign eer = ( addr_c2[39:32] == 8'hBA) | ( addr_c2[39:32] == 8'hAA); | |
231 | wire esr; | |
232 | assign esr = ( addr_c2[39:32] == 8'hBB) | ( addr_c2[39:32] == 8'hAB); | |
233 | wire ear; | |
234 | assign ear = ( addr_c2[39:32] == 8'hBC) | ( addr_c2[39:32] == 8'hAC); | |
235 | wire notData; | |
236 | assign notData = ( addr_c2[39:32] == 8'hBE) | ( addr_c2[39:32] == 8'hAE); | |
237 | wire eir; | |
238 | assign eir = ( addr_c2[39:32] == 8'hBD) | ( addr_c2[39:32] == 8'hAD); | |
239 | wire l2_csr; | |
240 | assign l2_csr = (eer | esr | ear | notData | eir); | |
241 | wire csr_rd_c2; | |
242 | assign csr_rd_c2 = ( ld_inst_c2 & l2_csr ); | |
243 | wire diag_ld_c2; | |
244 | assign diag_ld_c2 = (diag_ld_inst_c2 & diag_inst ); | |
245 | ||
246 | //follow the pipeline | |
247 | ||
248 | always @(posedge l2_clk) | |
249 | begin | |
250 | csr_rd_c3 <= csr_rd_c2; | |
251 | csr_rd_c4 <= csr_rd_c3; | |
252 | csr_rd_c5 <= csr_rd_c4; | |
253 | csr_rd_c6 <= csr_rd_c5; | |
254 | csr_rd_c7 <= csr_rd_c6; | |
255 | csr_rd_c8 <= csr_rd_c7; | |
256 | csr_rd_c9 <= csr_rd_c8; | |
257 | ||
258 | csr_addr_c3 <= addr_c2; | |
259 | csr_addr_c4 <= csr_addr_c3; | |
260 | csr_addr_c5 <= csr_addr_c4; | |
261 | csr_addr_c6 <= csr_addr_c5; | |
262 | csr_addr_c7 <= csr_addr_c6; | |
263 | csr_addr_c8 <= csr_addr_c7; | |
264 | csr_addr_c9 <= csr_addr_c8; | |
265 | end | |
266 | ||
267 | always @(posedge l2_clk) begin | |
268 | diag_ld_c3 <= diag_ld_c2 & ~csr_rd_c2; | |
269 | diag_ld_c4 <= diag_ld_c3; | |
270 | diag_ld_c5 <= diag_ld_c4; | |
271 | diag_ld_c6 <= diag_ld_c5; | |
272 | diag_ld_c7 <= diag_ld_c6; | |
273 | diag_ld_c8 <= diag_ld_c7; | |
274 | diag_ld_c9 <= diag_ld_c8; | |
275 | end | |
276 | ||
277 | ||
278 | //csr data should be ready at c8 | |
279 | always @(negedge l2_clk) | |
280 | begin | |
281 | if( csr_rd_c9 ) begin | |
282 | $display("l2csr access addr=%x, data=%x\n", csr_addr_c8, rd_data_c8); | |
283 | if (`PARGS.nas_check_on ) | |
284 | l2_probe = $sim_send(`PLI_CSR_READ, {24'b0, csr_addr_c9}, rd_data_c8, 8'h0); | |
285 | end | |
286 | end | |
287 | ||
288 | //diagnostic load data should be ready at c8 | |
289 | always @(negedge l2_clk) | |
290 | begin | |
291 | if( diag_ld_c9 ) begin | |
292 | $display("l2 diagnostic access addr=%x, data=%x\n", csr_addr_c9, mux_data); | |
293 | if (`PARGS.nas_check_on ) | |
294 | // l2_probe = $sim_send(`PLI_CSR_READ, {24'b0, csr_addr_c9}, mux_data, 8'h0); | |
295 | $display("l2 diagnostic access addr=%x, data=%x\n", csr_addr_c9, mux_data); | |
296 | end | |
297 | end | |
298 | ||
299 | endmodule | |
300 | ||
301 | ||
302 |