Changeset 105 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_transition.cpp
- Timestamp:
- Feb 5, 2009, 12:18:31 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_transition.cpp
r101 r105 65 65 break; 66 66 } 67 case CONTEXT_STATE_KO_MISS_ WAITEND :67 case CONTEXT_STATE_KO_MISS_BRANCH_WAITEND : 68 68 { 69 69 // Wait end of all instruction … … 71 71 72 72 // state = CONTEXT_STATE_OK; // @@@ TODO : make MISS fast (miss decod) 73 state = CONTEXT_STATE_KO_MISS_ADDR; 73 state = CONTEXT_STATE_KO_MISS_BRANCH_ADDR; 74 break; 75 } 76 case CONTEXT_STATE_KO_MISS_LOAD_WAITEND : 77 { 78 // Wait end of all instruction 79 if (inst_all == 0) 80 state = CONTEXT_STATE_KO_MISS_LOAD_ADDR; 81 74 82 break; 75 83 } … … 79 87 break; 80 88 } 81 case CONTEXT_STATE_KO_MISS_ADDR : 89 case CONTEXT_STATE_KO_MISS_BRANCH_ADDR : 90 { 91 // nothing, wait the update of internal register (pc) 92 break; 93 } 94 case CONTEXT_STATE_KO_MISS_LOAD_ADDR : 82 95 { 83 96 // nothing, wait the update of internal register (pc) … … 198 211 199 212 // priority : miss > excep > spr/sync 200 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_ ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == EVENT_TYPE_EXCEPTION)?1:0);213 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == EVENT_TYPE_EXCEPTION)?1:0); 201 214 uint8_t priority1 = 2; // miss 202 215 … … 212 225 { 213 226 Tcontrol_t dest_val = PORT_READ(in_BRANCH_EVENT_ADDRESS_DEST_VAL[i]); 214 // reg_STATE [i] = CONTEXT_STATE_KO_MISS_ ADDR;215 reg_STATE [i] = CONTEXT_STATE_KO_MISS_ WAITEND; //@@@ TODO : make MISS fast (miss decod)227 // reg_STATE [i] = CONTEXT_STATE_KO_MISS_BRANCH_ADDR; 228 reg_STATE [i] = CONTEXT_STATE_KO_MISS_BRANCH_WAITEND; //@@@ TODO : make MISS fast (miss decod) 216 229 reg_EVENT_ADDRESS [i] = PORT_READ(in_BRANCH_EVENT_ADDRESS_SRC [i])+1; // address delay slot 217 230 reg_EVENT_ADDRESS_EPCR [i] = PORT_READ(in_BRANCH_EVENT_ADDRESS_DEST [i]); // address_next … … 249 262 250 263 // miss > excep > spr/sync 251 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_ ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);264 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0); 252 265 uint8_t priority1 = (state == EVENT_TYPE_EXCEPTION)?1:0; 253 266 … … 258 271 bool is_valid = ((state == CONTEXT_STATE_OK) or 259 272 (depth1< depth0) or 260 ((depth1==depth0) and (priority1> priority0)));273 ((depth1==depth0) and (priority1>=priority0))); 261 274 262 275 if (is_valid) … … 325 338 } 326 339 case EVENT_TYPE_NONE : 327 case EVENT_TYPE_MISS_SPECULATION : 328 case EVENT_TYPE_BRANCH_NO_ACCURATE : 340 case EVENT_TYPE_BRANCH_MISS_SPECULATION : 341 case EVENT_TYPE_LOAD_MISS_SPECULATION : 342 // case EVENT_TYPE_BRANCH_NO_ACCURATE : 329 343 default : 330 344 { … … 359 373 Tdepth_t depth_max = _param->_array_size_depth [context]; 360 374 361 // 362 // 375 // Tdepth_t depth0 = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min)); 376 // Tdepth_t depth1 = (depth >=depth_min)?(depth -depth_min):((depth +depth_max-depth_min)); 363 377 Tdepth_t depth0 = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max)); 364 378 Tdepth_t depth1 = (depth >=depth_min)?(depth ):((depth +depth_max)); … … 368 382 369 383 // miss > excep > spr/sync 370 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_ ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);371 uint8_t priority1 = 1; // exception384 uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0); 385 uint8_t priority1 = (state == EVENT_TYPE_EXCEPTION)?1:2; // else load_miss_speculation (EVENT_TYPE_MISS_SPECULATION) 372 386 373 387 // is_valid = can modify local information … … 377 391 bool is_valid = ((state == CONTEXT_STATE_OK) or 378 392 (depth1< depth0) or 379 ((depth1==depth0) and (priority1> priority0)));393 ((depth1==depth0) and (priority1>=priority0))); 380 394 381 395 if (is_valid) … … 386 400 switch (type) 387 401 { 388 case EVENT_TYPE_EXCEPTION : {state_next = CONTEXT_STATE_KO_EXCEP; break;} 389 case EVENT_TYPE_SPR_ACCESS : 390 case EVENT_TYPE_MSYNC : 391 case EVENT_TYPE_PSYNC : 392 case EVENT_TYPE_CSYNC : 393 case EVENT_TYPE_NONE : 394 case EVENT_TYPE_MISS_SPECULATION : 395 case EVENT_TYPE_BRANCH_NO_ACCURATE : 402 case EVENT_TYPE_EXCEPTION : {state_next = CONTEXT_STATE_KO_EXCEP; break;} 403 case EVENT_TYPE_LOAD_MISS_SPECULATION : {state_next = CONTEXT_STATE_KO_MISS_LOAD_WAITEND; break;} 404 case EVENT_TYPE_BRANCH_MISS_SPECULATION : 405 case EVENT_TYPE_SPR_ACCESS : 406 case EVENT_TYPE_MSYNC : 407 case EVENT_TYPE_PSYNC : 408 case EVENT_TYPE_CSYNC : 409 case EVENT_TYPE_NONE : 410 // case EVENT_TYPE_BRANCH_NO_ACCURATE : 396 411 default : 397 412 { … … 402 417 reg_EVENT_ADDRESS [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS ); 403 418 reg_EVENT_ADDRESS_EPCR [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR ); 404 reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;419 reg_EVENT_ADDRESS_EPCR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR_VAL ); 405 420 reg_EVENT_ADDRESS_EEAR [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR ); 406 421 reg_EVENT_ADDRESS_EEAR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR_VAL ); 407 422 reg_EVENT_IS_DELAY_SLOT [context] = PORT_READ(in_COMMIT_EVENT_IS_DELAY_SLOT ); 408 //reg_EVENT_IS_DS_TAKE [context] = 0;423 reg_EVENT_IS_DS_TAKE [context] = 0; 409 424 reg_EVENT_DEPTH [context] = depth; 410 425 } … … 435 450 436 451 // // miss > excep > spr/sync 437 // uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_ ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);452 // uint8_t priority0 = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0); 438 453 // uint8_t priority1 = 2; // miss 439 454 … … 444 459 // bool is_valid = ((state == CONTEXT_STATE_OK) or 445 460 // (depth1< depth0) or 446 // ((depth1==depth0) and (priority1> priority0)));461 // ((depth1==depth0) and (priority1>=priority0))); 447 462 448 463 // if (is_valid) … … 480 495 break; 481 496 } 482 case CONTEXT_STATE_KO_MISS_ ADDR:497 case CONTEXT_STATE_KO_MISS_BRANCH_ADDR: 483 498 // { 484 499 // reg_STATE [i] = CONTEXT_STATE_KO_MISS_WAITEND; //@@@ TODO : make MISS fast (miss decod) 485 500 // break; 486 501 // } 502 case CONTEXT_STATE_KO_MISS_LOAD_ADDR : 487 503 case CONTEXT_STATE_KO_PSYNC_ADDR : 488 504 case CONTEXT_STATE_KO_CSYNC_ADDR :
Note: See TracChangeset
for help on using the changeset viewer.