Ignore:
Timestamp:
Feb 27, 2009, 7:37:40 PM (15 years ago)
Author:
rosiere
Message:

1) Decod_queue : multi implementation (one_fifo, multi_fifo)
2) Issue_queue : multi implementation (in_order, out_of_order)
3) Direction : Add Meta predictor
4) Context_State : re add Branch_complete, More priority to Load miss (is not speculative)
5) Return_Address_Stack : update reg_PREDICT pointer on decod miss prediction
6) UPT : Fix bug in multi event
7) Prediction_glue : in read_stack case, insert in UPT pc_next
8) Rename select : when rob have an event (need flush), read_r{a,b,c} and write_r{d,e} is set at 0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.cpp

    r107 r111  
    5353        if (PORT_READ(in_PREDICT_ACK) and internal_PREDICT_VAL)
    5454          {
     55            log_printf(TRACE,Address_management,FUNCTION,"  * PREDICT");
     56
    5557            bool branch_is_current = reg_PC_NEXT_IS_DS_TAKE;
    5658            if (branch_is_current)
     
    9092        if (internal_ADDRESS_VAL and PORT_READ(in_ADDRESS_ACK))
    9193          {
     94
    9295            reg_PC_ACCESS_VAL = 0;
    9396#ifdef STATISTICS
     
    102105#endif
    103106          }
     107
     108        // =========================================
     109        // ===== Shift Register ====================
     110        // =========================================
    104111       
    105112        // Shift register
    106 
    107         if (not reg_PC_ACCESS_VAL and reg_PC_CURRENT_VAL and reg_PC_NEXT_VAL and reg_PC_NEXT_NEXT_VAL)
    108           {
     113        if (reg_PC_NEXT_NEXT_VAL and reg_PC_NEXT_VAL and reg_PC_CURRENT_VAL and not reg_PC_ACCESS_VAL)
     114          {
     115            log_printf(TRACE,Address_management,FUNCTION,"  * New PC_ACCESS");
     116
    109117            reg_PC_ACCESS_VAL  = 1; // new request
    110118            reg_PC_CURRENT_VAL = 0; // invalid current
     
    120128          }
    121129       
    122         if (not reg_PC_CURRENT_VAL)
    123           {
    124             bool val = reg_PC_NEXT_VAL;
    125             reg_PC_CURRENT_VAL = val; // new PC_CURRENT if PC_NEXT is valid
    126             reg_PC_NEXT_VAL    = 0;   // invalid next
    127 
    128             if (val)
    129               {
    130                 reg_PC_CURRENT                             = reg_PC_NEXT                            ;
    131                 reg_PC_CURRENT_IS_DS_TAKE                  = reg_PC_NEXT_IS_DS_TAKE                 ;
    132                 reg_PC_CURRENT_INST_IFETCH_PTR             = reg_PC_NEXT_INST_IFETCH_PTR            ;
    133                 reg_PC_CURRENT_BRANCH_STATE                = reg_PC_NEXT_BRANCH_STATE               ;
    134                 reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID;
    135                
    136                 for (uint32_t i=0; i<_param->_nb_instruction; i++)
    137                   reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i];
    138               }
    139           }
    140 
    141         if (not reg_PC_NEXT_VAL)
    142           {
    143             bool val = reg_PC_NEXT_NEXT_VAL;
    144             reg_PC_NEXT_VAL      = val; // new PC_NEXT if PC_NEXT_NEXT is valid
    145             reg_PC_NEXT_NEXT_VAL = 0;   // invalid next_next
    146            
    147             if (val)
    148               {
    149                 reg_PC_NEXT                             = reg_PC_NEXT_NEXT                            ;
    150                 reg_PC_NEXT_IS_DS_TAKE                  = reg_PC_NEXT_NEXT_IS_DS_TAKE                 ;
    151 //              reg_PC_NEXT_INST_IFETCH_PTR             = reg_PC_NEXT_NEXT_INST_IFETCH_PTR            ;
    152 //              reg_PC_NEXT_BRANCH_STATE                = reg_PC_NEXT_NEXT_BRANCH_STATE               ;
    153 //              reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_NEXT_BRANCH_UPDATE_PREDICTION_ID;
    154              
    155 //              for (uint32_t i=0; i<_param->_nb_instruction; i++)
    156 //                reg_PC_NEXT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_NEXT_INSTRUCTION_ENABLE [i];
    157               }
     130//      if (not reg_PC_CURRENT_VAL and reg_PC_NEXT_VAL)
     131        if (reg_PC_NEXT_NEXT_VAL and reg_PC_NEXT_VAL and not reg_PC_CURRENT_VAL)
     132          {
     133            log_printf(TRACE,Address_management,FUNCTION,"  * New PC_CURRENT");
     134
     135            reg_PC_CURRENT_VAL = 1; // new PC_CURRENT if PC_NEXT is valid
     136            reg_PC_NEXT_VAL    = 0; // invalid next
     137
     138            reg_PC_CURRENT                             = reg_PC_NEXT                            ;
     139            reg_PC_CURRENT_IS_DS_TAKE                  = reg_PC_NEXT_IS_DS_TAKE                 ;
     140            reg_PC_CURRENT_INST_IFETCH_PTR             = reg_PC_NEXT_INST_IFETCH_PTR            ;
     141            reg_PC_CURRENT_BRANCH_STATE                = reg_PC_NEXT_BRANCH_STATE               ;
     142            reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID;
     143           
     144            for (uint32_t i=0; i<_param->_nb_instruction; i++)
     145              reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i];
     146          }
     147
     148//      if (not reg_PC_NEXT_VAL and reg_PC_NEXT_NEXT_VAL)
     149        if (reg_PC_NEXT_NEXT_VAL and not reg_PC_NEXT_VAL)
     150          {
     151            log_printf(TRACE,Address_management,FUNCTION,"  * New PC_NEXT");
     152
     153            reg_PC_NEXT_VAL      = 1; // new PC_NEXT if PC_NEXT_NEXT is valid
     154            reg_PC_NEXT_NEXT_VAL = 0; // invalid next_next
     155           
     156            reg_PC_NEXT                             = reg_PC_NEXT_NEXT                            ;
     157            reg_PC_NEXT_IS_DS_TAKE                  = reg_PC_NEXT_NEXT_IS_DS_TAKE                 ;
     158//          reg_PC_NEXT_INST_IFETCH_PTR             = reg_PC_NEXT_NEXT_INST_IFETCH_PTR            ;
     159//          reg_PC_NEXT_BRANCH_STATE                = reg_PC_NEXT_NEXT_BRANCH_STATE               ;
     160//          reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_NEXT_BRANCH_UPDATE_PREDICTION_ID;
     161           
     162//          for (uint32_t i=0; i<_param->_nb_instruction; i++)
     163//            reg_PC_NEXT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_NEXT_INSTRUCTION_ENABLE [i];
    158164          }
    159165
     
    161167        // ===== EVENT =============================
    162168        // =========================================
     169
     170        // Event is after shift register : because, it's to write in pc_next and in not pc_current
     171
    163172        if (PORT_READ(in_EVENT_VAL) and internal_EVENT_ACK)
    164173          {
Note: See TracChangeset for help on using the changeset viewer.