[88] | 1 | #ifndef test_BTB |
---|
| 2 | #define test_BTB |
---|
| 3 | |
---|
| 4 | class entry_t |
---|
| 5 | { |
---|
| 6 | public : Tcontrol_t _val ; |
---|
| 7 | public : Tcontext_t _context ; |
---|
| 8 | public : Tcontrol_t _address_dest_val; |
---|
| 9 | public : Tgeneral_data_t _address_src ; |
---|
| 10 | public : Tgeneral_data_t _address_dest ; |
---|
| 11 | public : Tbranch_condition_t _condition ; |
---|
| 12 | public : Tcontrol_t _last_take ; |
---|
| 13 | public : Tcounter_t _accurate ; |
---|
| 14 | |
---|
| 15 | public : bool hit (morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_register::Parameters * _param, |
---|
| 16 | Tgeneral_data_t addr_test, |
---|
| 17 | Tcontext_t context) |
---|
| 18 | { |
---|
| 19 | Tgeneral_data_t addr_src_offset = (_address_src >> _param->_shift_offset)&_param->_mask_offset; |
---|
| 20 | Tgeneral_data_t addr_src_index = (_address_src >> _param->_shift_bank )&_param->_mask_bank ; |
---|
| 21 | Tgeneral_data_t addr_src_tag = (_address_src >> _param->_shift_tag ); |
---|
| 22 | |
---|
| 23 | Tgeneral_data_t addr_test_offset = (addr_test >> _param->_shift_offset)&_param->_mask_offset; |
---|
| 24 | Tgeneral_data_t addr_test_index = (addr_test >> _param->_shift_bank )&_param->_mask_bank ; |
---|
| 25 | Tgeneral_data_t addr_test_tag = (addr_test >> _param->_shift_tag ); |
---|
| 26 | |
---|
| 27 | bool is_hit = ( (_val == 1 ) and |
---|
| 28 | (_context == context ) and |
---|
| 29 | (addr_test_tag == addr_src_tag ) and |
---|
| 30 | (addr_test_index == addr_src_index ) and |
---|
| 31 | (addr_test_offset <= addr_src_offset )); |
---|
| 32 | |
---|
| 33 | LABEL("address_src (tag, index, offset) : %.8x %.8x %.8x",addr_src_tag, addr_src_index, addr_src_offset); |
---|
| 34 | LABEL("address_test (tag, index, offset) : %.8x %.8x %.8x - hit : %d",addr_test_tag, addr_test_index, addr_test_offset, is_hit); |
---|
| 35 | return is_hit; |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | public : void print (void) |
---|
| 39 | { |
---|
| 40 | LABEL("%d - %.2d %.8x %.1d %.8x %.3d %.1d %.4d", |
---|
| 41 | _val , |
---|
| 42 | _context , |
---|
| 43 | _address_src , |
---|
| 44 | _address_dest_val, |
---|
| 45 | _address_dest , |
---|
| 46 | _condition , |
---|
| 47 | _last_take , |
---|
| 48 | _accurate ); |
---|
| 49 | } |
---|
| 50 | |
---|
| 51 | }; |
---|
| 52 | |
---|
| 53 | Tgeneral_data_t gen_addr (morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_register::Parameters * _param, |
---|
| 54 | Tgeneral_data_t index) |
---|
| 55 | { |
---|
| 56 | Tgeneral_data_t addr_tag = (rand()%(_param->_associativity)) << _param->_shift_tag ; |
---|
| 57 | Tgeneral_data_t addr_index = (index &_param->_mask_bank ) << _param->_shift_bank ; |
---|
| 58 | Tgeneral_data_t addr_offset = (rand()&_param->_mask_offset ) << _param->_shift_offset; |
---|
| 59 | |
---|
| 60 | LABEL("gen_addr (tag, index, offset) : %.8x %.8x %.8x",addr_tag, addr_index, addr_offset); |
---|
| 61 | |
---|
| 62 | return (addr_tag | |
---|
| 63 | addr_index | |
---|
| 64 | addr_offset ); |
---|
| 65 | } |
---|
| 66 | |
---|
| 67 | #endif |
---|