Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: FcMcuMon.vr | |
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 <vera_defines.vrh> | |
36 | #include <ListMacros.vrh> | |
37 | #include "FcMcuMonPort.if.vrh" | |
38 | #define STD_DISP gDbg | |
39 | #include <std_display_defines.vri> | |
40 | #include <std_display_class.vrh> | |
41 | ||
42 | extern bit [63:0] FCMemoryAddress_A[4]; | |
43 | extern bit [63:0] FCMemoryAddress_B[4]; | |
44 | extern bit [63:0] FCMemoryAddress_C[4]; | |
45 | extern event FCMemorySync_A[4]; | |
46 | extern event FCMemorySync_B[4]; | |
47 | extern event FCMemorySync_C[4]; | |
48 | extern StandardDisplay gDbg; | |
49 | ||
50 | ||
51 | class FcMcuMon { | |
52 | ||
53 | dram_write_MCU write_mcu; | |
54 | //local StandardDisplay dbg; | |
55 | bit [1:0] mcu_port_no; | |
56 | ||
57 | task new(dram_write_MCU write_mcu, bit [1:0] mcu_port_no); | |
58 | task DramWrite (dram_write_MCU write_mcu, bit [1:0] mcu_port_no); | |
59 | ||
60 | } | |
61 | ||
62 | ||
63 | task FcMcuMon:: new (dram_write_MCU write_mcu, bit [1:0] mcu_port_no) { | |
64 | ||
65 | fork | |
66 | { | |
67 | DramWrite (write_mcu, mcu_port_no); | |
68 | } | |
69 | join none | |
70 | ||
71 | } | |
72 | ||
73 | ||
74 | task FcMcuMon:: DramWrite (dram_write_MCU write_mcu, bit [1:0] mcu_port_no) { | |
75 | ||
76 | ||
77 | bit CLK; | |
78 | bit [2:0] CMD_A, CMD_B, CMD_C; | |
79 | bit [15:0] ADDR_A, ADDR_B, ADDR_C; | |
80 | bit [2:0] BANK_A, BANK_B, BANK_C; | |
81 | bit RANK_A, RANK_B, RANK_C; | |
82 | bit [2:0] DIMM_A, DIMM_B, DIMM_C; | |
83 | ||
84 | bit [2:0] State_A, State_B, State_C; | |
85 | bit [2:0] Idle_State_A, Idle_State_B, Idle_State_C; | |
86 | bit [2:0] Active_State_A, Active_State_B, Active_State_C; | |
87 | bit [2:0] Write_State_A, Write_State_B, Write_State_C; | |
88 | bit Idle_A, Idle_B, Idle_C; | |
89 | bit Active_A, Active_B, Active_C; | |
90 | bit Write_A, Write_B, Write_C; | |
91 | bit [15:0] RAS_A, RAS_B, RAS_C; | |
92 | bit [15:0] CAS_A, CAS_B, CAS_C; | |
93 | ||
94 | bit [39:0] physical_addr_A, physical_addr_B, physical_addr_C; | |
95 | ||
96 | bit BA01, BA23, BA45, BA67; | |
97 | ||
98 | integer i; | |
99 | ||
100 | State_A = 3'b001; | |
101 | Idle_State_A = 3'b001; | |
102 | Active_State_A = 3'b010; | |
103 | Write_State_A = 3'b100; | |
104 | ||
105 | State_B = 3'b001; | |
106 | Idle_State_B = 3'b001; | |
107 | Active_State_B = 3'b010; | |
108 | Write_State_B = 3'b100; | |
109 | ||
110 | State_C = 3'b001; | |
111 | Idle_State_C = 3'b001; | |
112 | Active_State_C = 3'b010; | |
113 | Write_State_C = 3'b100; | |
114 | ||
115 | CLK = write_mcu.$drl2clk; | |
116 | ||
117 | ||
118 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf("MCU[%0d] Inside DramWrite Task\n", mcu_port_no)); | |
119 | while(1) { | |
120 | @(posedge write_mcu.$drl2clk); | |
121 | ||
122 | CMD_A = write_mcu.$drif_dram_cmd_a; | |
123 | ADDR_A = write_mcu.$drif_dram_addr_a; | |
124 | BANK_A = write_mcu.$drif_dram_bank_a; | |
125 | RANK_A = write_mcu.$drif_dram_rank_a; | |
126 | DIMM_A = write_mcu.$drif_dram_dimm_a; | |
127 | ||
128 | CMD_B = write_mcu.$drif_dram_cmd_b; | |
129 | ADDR_B = write_mcu.$drif_dram_addr_b; | |
130 | BANK_B = write_mcu.$drif_dram_bank_b; | |
131 | RANK_B = write_mcu.$drif_dram_rank_b; | |
132 | DIMM_B = write_mcu.$drif_dram_dimm_b; | |
133 | ||
134 | CMD_C = write_mcu.$drif_dram_cmd_c; | |
135 | ADDR_C = write_mcu.$drif_dram_addr_c; | |
136 | BANK_C = write_mcu.$drif_dram_bank_c; | |
137 | RANK_C = write_mcu.$drif_dram_rank_c; | |
138 | DIMM_C = write_mcu.$drif_dram_dimm_c; | |
139 | ||
140 | BA01 = write_mcu.$ncu_mcu_ba01; | |
141 | BA23 = write_mcu.$ncu_mcu_ba23; | |
142 | BA45 = write_mcu.$ncu_mcu_ba45; | |
143 | BA67 = write_mcu.$ncu_mcu_ba67; | |
144 | ||
145 | ||
146 | Idle_A = State_A[0]; | |
147 | Active_A = State_A[1]; | |
148 | Write_A = State_A[2]; | |
149 | ||
150 | Idle_B = State_B[0]; | |
151 | Active_B = State_B[1]; | |
152 | Write_B = State_B[2]; | |
153 | ||
154 | Idle_C = State_C[0]; | |
155 | Active_C = State_C[1]; | |
156 | Write_C = State_C[2]; | |
157 | ||
158 | case(1'b1) | |
159 | { | |
160 | Idle_A : { | |
161 | if (CMD_A == 3'b100) | |
162 | { | |
163 | // printf ("%0d : MAQ-Debug[%0d] : Active_A RAS = %h \n",{get_time(HI), get_time(LO)}, mcu_port_no, ADDR_A); | |
164 | State_A = Active_State_A; | |
165 | RAS_A = ADDR_A; | |
166 | } | |
167 | } | |
168 | Active_A : { | |
169 | if (CMD_A == 3'b011) | |
170 | { | |
171 | State_A = Write_State_A; | |
172 | CAS_A = ADDR_A; | |
173 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf("%0d MCU[%0d] Write_A DIMM = %h, RANK = %h, BANK = %h, RAS = %h, CAS = %h\n", | |
174 | {get_time(HI), get_time(LO)}, mcu_port_no, DIMM_A, RANK_A, BANK_A, RAS_A, CAS_A)); | |
175 | physical_addr_A = {2'b00, DIMM_A, CAS_A[2], RAS_A[14:0], CAS_A[11], CAS_A[9:3], BANK_A[2:1], mcu_port_no, BANK_A[0], CAS_A[1], 5'b00000}; | |
176 | // printf("JAMES1 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_A, BA01, BA23, BA45, BA67); | |
177 | physical_addr_A = saddr(physical_addr_A, BA01, BA23, BA45, BA67); | |
178 | if (write_mcu.$index_hashing) | |
179 | physical_addr_A = { physical_addr_A[39:18], physical_addr_A[32:28] ^ physical_addr_A[17:13], physical_addr_A[19:18] ^ physical_addr_A[12:11], physical_addr_A[10:0] }; | |
180 | // printf("JAMES2 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_A, BA01, BA23, BA45, BA67); | |
181 | for(i=0;i<8; i++) | |
182 | { | |
183 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf (" %0d MCU[%0d] : physical :Addr = %h \n", {get_time(HI), get_time(LO)}, mcu_port_no, (physical_addr_A + 8*i))); | |
184 | FCMemoryAddress_A[mcu_port_no] = (physical_addr_A + 8*i); | |
185 | trigger(FCMemorySync_A[mcu_port_no]); | |
186 | sync(ALL,FCMemorySync_A[mcu_port_no]); | |
187 | } | |
188 | ||
189 | } | |
190 | else | |
191 | { | |
192 | // printf ("%0d : MAQ-Debug[%0d] : Active CMD was not for Write \n", {get_time(HI), get_time(LO)}, mcu_port_no); | |
193 | if (CMD_A == 3'b100) | |
194 | State_A = Active_State_A; //Idle_State_A; | |
195 | else | |
196 | State_A = Idle_State_A; | |
197 | } | |
198 | } | |
199 | Write_A : { | |
200 | // printf ("%0d : MAQ-Debug[%0d] : Idle_A \n",{get_time(HI), get_time(LO)}, mcu_port_no); | |
201 | State_A = Idle_State_A; | |
202 | } | |
203 | default : State_A = Idle_State_A; | |
204 | } // case | |
205 | // **************************************************************************************************************************** | |
206 | case(1'b1) | |
207 | { | |
208 | Idle_B : { | |
209 | if (CMD_B == 3'b100) | |
210 | { | |
211 | // printf ("%0d : MAQ-Debug[%0d] : Active_B RAS = %h \n",{get_time(HI), get_time(LO)}, mcu_port_no, ADDR_B); | |
212 | State_B = Active_State_B; | |
213 | RAS_B = ADDR_B; | |
214 | } | |
215 | } | |
216 | Active_B : { | |
217 | if (CMD_B == 3'b011) | |
218 | { | |
219 | State_B = Write_State_B; | |
220 | CAS_B = ADDR_B; | |
221 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf ("%0d : MAQ-Debug[%0d] : Write_B DIMM = %h, RANK = %h, BANK = %h, RAS = %h, CAS = %h \n", | |
222 | {get_time(HI), get_time(LO)}, mcu_port_no, DIMM_B, RANK_B, BANK_B, RAS_B, CAS_B)); | |
223 | physical_addr_B = {2'b00, DIMM_B, CAS_B[2], RAS_B[14:0], CAS_B[11], CAS_B[9:3], BANK_B[2:1], mcu_port_no, BANK_B[0], CAS_B[1], 5'b00000}; | |
224 | //printf("JAMES3 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_B, BA01, BA23, BA45, BA67); | |
225 | physical_addr_B = saddr(physical_addr_B, BA01, BA23, BA45, BA67); | |
226 | if (write_mcu.$index_hashing) | |
227 | physical_addr_B = { physical_addr_B[39:18], physical_addr_B[32:28] ^ physical_addr_B[17:13], physical_addr_B[19:18] ^ physical_addr_B[12:11], physical_addr_B[10:0] }; | |
228 | // printf("JAMES4 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_B, BA01, BA23, BA45, BA67); | |
229 | for(i=0;i<8; i++) | |
230 | { | |
231 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf ("%0d : MAQ-Debug[%0d] : physical :Addr = %h \n",{get_time(HI), get_time(LO)}, mcu_port_no, (physical_addr_B + 8*i))); | |
232 | FCMemoryAddress_B[mcu_port_no] = (physical_addr_B + 8*i); | |
233 | trigger(FCMemorySync_B[mcu_port_no]); | |
234 | sync(ALL,FCMemorySync_B[mcu_port_no]); | |
235 | } | |
236 | } | |
237 | else | |
238 | { | |
239 | // printf (" %0d : MAQ-Debug[%0d] : Active CMD was not for Write \n", {get_time(HI), get_time(LO)}, mcu_port_no); | |
240 | if (CMD_B == 3'b100) | |
241 | State_B = Active_State_B; | |
242 | else | |
243 | State_B = Idle_State_B; | |
244 | } | |
245 | } | |
246 | Write_B : { | |
247 | // printf ("%0d : MAQ-Debug[%0d] : Idle_B \n",{get_time(HI), get_time(LO)}, mcu_port_no); | |
248 | State_B = Idle_State_B; | |
249 | } | |
250 | default : State_B = Idle_State_B; | |
251 | } // case | |
252 | ||
253 | // **************************************************************************************************************************** | |
254 | case(1'b1) | |
255 | { | |
256 | Idle_C : { | |
257 | if (CMD_C == 3'b100) | |
258 | { | |
259 | // printf ("%0d : MAQ-Debug[%0d] : Active_C RAS = %h \n",{get_time(HI), get_time(LO)}, mcu_port_no, ADDR_C); | |
260 | State_C = Active_State_C; | |
261 | RAS_C = ADDR_C; | |
262 | } | |
263 | } | |
264 | Active_C : { | |
265 | if (CMD_C == 3'b011) | |
266 | { | |
267 | State_C = Write_State_C; | |
268 | CAS_C = ADDR_C; | |
269 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf ("%0d : MAQ-Debug[%0d] : Write_C DIMM = %h, RANK = %h, BANK = %h, RAS = %h, CAS = %h \n", | |
270 | {get_time(HI), get_time(LO)}, mcu_port_no, DIMM_C, RANK_C, BANK_C, RAS_C, CAS_C)); | |
271 | physical_addr_C = {2'b00, DIMM_C, CAS_C[2], RAS_C[14:0], CAS_C[11], CAS_C[9:3], BANK_C[2:1], mcu_port_no, BANK_C[0], CAS_C[1], 5'b00000}; | |
272 | //printf("JAMES5 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_A, BA01, BA23, BA45, BA67); | |
273 | physical_addr_C = saddr(physical_addr_C, BA01, BA23, BA45, BA67); | |
274 | if (write_mcu.$index_hashing) | |
275 | physical_addr_C = { physical_addr_C[39:18], physical_addr_C[32:28] ^ physical_addr_C[17:13], physical_addr_C[19:18] ^ physical_addr_C[12:11], physical_addr_C[10:0] }; | |
276 | // printf("JAMES6 addr = %h ba01=%0d ba23=%0d, ba45=%0d, ba67=%0d\n", physical_addr_C, BA01, BA23, BA45, BA67); | |
277 | for(i=0;i<8; i++) | |
278 | { | |
279 | PR_DEBUG("FcMcuMon", MON_DEBUG, psprintf ("%0d : MAQ-Debug[%0d] : physical :Addr = %h \n",{get_time(HI), get_time(LO)}, mcu_port_no, (physical_addr_C + 8*i))); | |
280 | FCMemoryAddress_C[mcu_port_no] = (physical_addr_C + 8*i); | |
281 | trigger(FCMemorySync_C[mcu_port_no]); | |
282 | sync(ALL,FCMemorySync_C[mcu_port_no]); | |
283 | } | |
284 | ||
285 | } | |
286 | else | |
287 | { | |
288 | // printf (" %0d : MAQ-Debug[%0d] : Active CMD was not for Write \n", {get_time(HI), get_time(LO)}, mcu_port_no); | |
289 | if (CMD_C == 3'b100) | |
290 | State_C = Active_State_C; | |
291 | else | |
292 | State_C = Idle_State_C; | |
293 | } | |
294 | } | |
295 | Write_C : { | |
296 | // printf ("%0d : MAQ-Debug[%0d] : Idle_C \n",{get_time(HI), get_time(LO)}, mcu_port_no); | |
297 | State_C = Idle_State_C; | |
298 | } | |
299 | default : State_C = Idle_State_C; | |
300 | } // case | |
301 | ||
302 | // **************************************************************************************************************************** | |
303 | } // while | |
304 | } | |
305 | ||
306 | ||
307 | // PM Shifting function | |
308 | function bit [39:0] saddr (bit[39:0] addr, bit ba01, bit ba23, bit ba45, bit ba67) | |
309 | { | |
310 | integer shift; | |
311 | integer pa6, pa7, pa8; | |
312 | ||
313 | case({ba67, ba45, ba23, ba01}) { | |
314 | 4'b0000: shift = 0; | |
315 | 4'b0001: shift = 2; | |
316 | 4'b0010: shift = 2; | |
317 | 4'b0011: shift = 1; | |
318 | 4'b0100: shift = 2; | |
319 | 4'b0101: shift = 1; | |
320 | 4'b0110: shift = 1; | |
321 | 4'b1000: shift = 2; | |
322 | 4'b1001: shift = 1; | |
323 | 4'b1010: shift = 1; | |
324 | 4'b1100: shift = 1; | |
325 | 4'b1111: shift = 0; | |
326 | } | |
327 | ||
328 | if(shift > 0){ | |
329 | saddr = addr >> 9; | |
330 | if(shift == 1){ | |
331 | saddr = saddr << 8; | |
332 | saddr = saddr | (addr & 8'b11111111); | |
333 | } | |
334 | if(shift == 2){ | |
335 | saddr = saddr << 7; | |
336 | saddr = saddr | (addr & 7'b1111111); | |
337 | } | |
338 | } | |
339 | else | |
340 | saddr = addr; | |
341 | } |