Changeset 94 for trunk/IPs/systemC/processor/Morpheo/Behavioural
- Timestamp:
- Dec 15, 2008, 12:04:03 PM (16 years ago)
- Location:
- trunk/IPs/systemC/processor/Morpheo/Behavioural
- Files:
-
- 3 added
- 1 deleted
- 39 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Dcache_Access/src/Dcache_Access_genMealy_rsp.cpp
r88 r94 56 56 throw ERRORMORPHEO(FUNCTION,_("invalid load_store_unit_id.\n")); 57 57 58 if (context_id > _param->_nb_context[execute_loop_id] [load_store_unit_id])58 if (context_id > _param->_nb_context[execute_loop_id]) 59 59 throw ERRORMORPHEO(FUNCTION,_("invalid context_id.\n")); 60 60 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/config_mono_context.cfg
r88 r94 2 2 1 1 +1 # nb_context 3 3 4 8 *2 # size_upt_queue [0] [nb_context] 4 1 4 *2# size_ufpt_queue [0] [nb_context]4 1 4 +1 # size_ufpt_queue [0] [nb_context] 5 5 32 32 *2 # size_address 6 6 4 4 *4 # nb_inst_predict -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/src/test.cpp
r88 r94 116 116 // ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_MISS_PREDICTION,"out_BRANCH_EVENT_MISS_PREDICTION",Tcontrol_t ,_param->_nb_context); 117 117 ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_SRC ,"out_BRANCH_EVENT_ADDRESS_SRC ",Taddress_t ,_param->_nb_context); 118 ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST_VAL,"out_BRANCH_EVENT_ADDRESS_DEST_VAL",Tcontrol_t ,_param->_nb_context); 118 119 ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST ,"out_BRANCH_EVENT_ADDRESS_DEST ",Taddress_t ,_param->_nb_context); 119 120 … … 130 131 ALLOC1_SC_SIGNAL(out_UPDATE_DIR_HISTORY ,"out_UPDATE_DIR_HISTORY ",Thistory_t ,_param->_nb_inst_update); 131 132 ALLOC1_SC_SIGNAL(out_UPDATE_RAS_VAL ,"out_UPDATE_RAS_VAL ",Tcontrol_t ,_param->_nb_inst_update); 133 ALLOC1_SC_SIGNAL(out_UPDATE_RAS_FLUSH ,"out_UPDATE_RAS_FLUSH ",Tcontrol_t ,_param->_nb_inst_update); 132 134 ALLOC1_SC_SIGNAL(out_UPDATE_RAS_PUSH ,"out_UPDATE_RAS_PUSH ",Tcontrol_t ,_param->_nb_inst_update); 133 135 ALLOC1_SC_SIGNAL(out_UPDATE_RAS_ADDRESS ,"out_UPDATE_RAS_ADDRESS ",Taddress_t ,_param->_nb_inst_update); … … 201 203 // INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_MISS_PREDICTION,_param->_nb_context); 202 204 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_SRC ,_param->_nb_context); 205 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_DEST_VAL,_param->_nb_context); 203 206 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_DEST ,_param->_nb_context); 204 207 … … 217 220 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_DIR_HISTORY ,_param->_nb_inst_update); 218 221 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_VAL ,_param->_nb_inst_update); 222 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_FLUSH ,_param->_nb_inst_update); 219 223 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_PUSH ,_param->_nb_inst_update); 220 224 INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_ADDRESS ,_param->_nb_inst_update); … … 247 251 const int32_t percent_transaction_branch_complete = 75; 248 252 const int32_t percent_transaction_update = 75; 249 250 253 const int32_t percent_transaction_branch_event = 75; 254 255 const bool test1 = false; 256 const bool test2 = false; 257 const bool test3 = false; 258 const bool test4 = true; 251 259 252 260 std::list<request_t> ufpt; 253 261 std::list<request_t> upt; 262 request_t event; 254 263 255 264 SC_START(0); … … 302 311 //--------------------------------------------------------------------- 303 312 //--------------------------------------------------------------------- 304 if ( 1)305 {313 if (test1) 314 { 306 315 uint32_t context = rand() % _param->_nb_context; 307 316 … … 508 517 for (uint32_t i=0; i<upt.size(); i++) 509 518 { 510 LABEL("Address_src (-1): %.8x (%d)",out_UPDATE_BTB_ADDRESS_SRC [i]->read(),upt.size());511 512 519 bool have_transaction = false; 513 520 514 521 do 515 522 { 516 LABEL("Address_src (0) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());517 518 523 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 519 524 … … 522 527 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 523 528 524 LABEL("Address_src (1) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());525 529 SC_START(0); 526 LABEL("Address_src (2) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read()); 527 530 528 531 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 529 532 … … 534 537 535 538 if (_param->_have_port_context_id) 536 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [ i]->read(),it_upt->context);537 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [ i]->read(),it_upt->miss_commit);538 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [ i]->read(),it_upt->flag);539 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [ i]->read(),update_btb(it_upt->condition));539 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_upt->context); 540 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),it_upt->miss_commit); 541 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_upt->take_good); 542 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),update_btb(it_upt->condition)); 540 543 if (update_btb(it_upt->condition)) 541 544 { 542 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [ i]->read(),it_upt->address_src);543 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [ i]->read(),it_upt->address_dest);544 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [ i]->read(),it_upt->condition);545 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_upt->address_src); 546 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_upt->address_dest); 547 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_upt->condition); 545 548 } 546 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [ i]->read(),update_dir(it_upt->condition));549 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod)); 547 550 if (update_dir(it_upt->condition)) 548 551 if (_param->_have_port_history) 549 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [ i]->read(),it_upt->history);550 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [ i]->read(),update_ras(it_upt->condition));552 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_upt->history); 553 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_upt->condition)); 551 554 if (update_ras(it_upt->condition)) 552 555 { 553 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [i]->read(),push_ras (it_upt->condition)); 554 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [i]->read(),it_upt->ras_address); 555 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [i]->read(),it_upt->ras_index); 556 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [i]->read(),not it_upt->miss_ifetch); 556 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 557 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_upt->condition)); 558 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_upt->ras_address); 559 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_upt->ras_index); 560 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch); 557 561 } 558 562 ++ it_upt; … … 560 564 561 565 SC_START(1); 562 LABEL("Address_src (3) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());563 564 566 } while (not have_transaction); 565 567 566 LABEL("Address_src (4) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());567 568 in_UPDATE_ACK [port]->write(0); 568 LABEL("Address_src (5) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());569 569 // if (_param->_have_port_depth) 570 570 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); … … 586 586 } 587 587 588 //--------------------------------------------------------------------- 589 //--------------------------------------------------------------------- 590 // DECOD MISS : no RAS in ifetch 591 //--------------------------------------------------------------------- 592 //--------------------------------------------------------------------- 593 if (test2) 594 { 595 uint32_t context = rand() % _param->_nb_context; 596 597 { 598 LABEL("PREDICT - fill the queue"); 599 uint32_t port = rand() % _param->_nb_inst_predict; 600 601 LABEL(" * context : %d",context); 602 LABEL(" * port : %d",port); 603 604 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 605 { 606 request_t request; 607 request.context = context; 608 request.address_src = 0xdeadbeef+i; 609 request.address_dest = 0x21071981+i; 610 request.address_good = request.address_dest; 611 request.condition = BRANCH_CONDITION_FLAG_SET; 612 request.take = 1; 613 request.take_good = 1; 614 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 615 request.is_accurate = true; 616 request.miss_ifetch = false; 617 request.miss_decod = false; 618 request.miss_commit = false; 619 request.history = i; 620 request.ras_address = 0xdeaddead+i; 621 request.ras_index = (0x12345678+i)%_param->_size_ras_index[context]; 622 request.ufpt_ptr = ufpt_top [context]; 623 // request.upt_ptr; 624 625 bool have_transaction = false; 626 do 627 { 628 in_PREDICT_VAL [port]->write((rand()%100)<percent_transaction_predict); 629 in_PREDICT_CONTEXT_ID [port]->write(request.context ); 630 in_PREDICT_BTB_ADDRESS_SRC [port]->write(request.address_src ); 631 in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest); 632 in_PREDICT_BTB_CONDITION [port]->write(request.condition ); 633 in_PREDICT_BTB_LAST_TAKE [port]->write(request.take ); 634 in_PREDICT_BTB_IS_ACCURATE [port]->write(request.is_accurate ); 635 in_PREDICT_DIR_HISTORY [port]->write(request.history ); 636 in_PREDICT_RAS_ADDRESS [port]->write(request.ras_address ); 637 in_PREDICT_RAS_INDEX [port]->write(request.ras_index ); 638 639 if (_param->_have_port_depth) 640 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 641 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 642 643 SC_START(0); // fct melay 644 645 LABEL("PREDICT [%d] %d - %d (accurate : %d).", 646 port, 647 in_PREDICT_VAL [port]->read(), 648 out_PREDICT_ACK [port]->read(), 649 in_PREDICT_BTB_IS_ACCURATE [port]->read()); 650 651 if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read()) 652 { 653 LABEL("PREDICT [%d] - Transaction accepted",port); 654 have_transaction = true; 655 656 if (_param->_have_port_depth) 657 TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]); 658 659 ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context]; 660 } 661 662 SC_START(1); // transition 663 664 } while (not have_transaction); 665 666 // ufpt.push_back(request); 667 668 in_PREDICT_VAL [port]->write(0); 669 670 if (_param->_have_port_depth) 671 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 672 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 673 } 674 } 675 676 { 677 LABEL("DECOD - Miss"); 678 uint32_t port = rand() % _param->_nb_inst_decod; 679 680 LABEL(" * context : %d",context); 681 LABEL(" * port : %d",port); 682 683 request_t request; 684 request.context = context; 685 request.address_src = 0x14011959; 686 request.address_dest = 0x25071959; // after = not take 687 request.address_good = request.address_dest; 688 request.condition = BRANCH_CONDITION_FLAG_SET; 689 request.take = 0; 690 request.take_good = 0; 691 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 692 request.is_accurate = true; 693 request.miss_ifetch = false; 694 request.miss_decod = true ; 695 request.miss_commit = false; 696 request.history = 1; 697 request.ras_address = 0xbabababa; 698 request.ras_index = (0x87654321)%_param->_size_ras_index[context]; 699 request.ufpt_ptr = ufpt_top [context]; 700 701 event = request; 702 703 // for (uint32_t i=0; i<upt.size(); i++) 704 // just one 705 { 706 bool have_transaction = false; 707 do 708 { 709 in_DECOD_VAL [port]->write((rand()%100)<percent_transaction_decod); 710 in_DECOD_CONTEXT_ID [port]->write(request.context ); 711 in_DECOD_BTB_ADDRESS_SRC [port]->write(request.address_src ); 712 in_DECOD_BTB_ADDRESS_DEST [port]->write(request.address_dest); 713 in_DECOD_BTB_CONDITION [port]->write(request.condition ); 714 in_DECOD_BTB_LAST_TAKE [port]->write(request.take ); 715 in_DECOD_RAS_ADDRESS [port]->write(request.ras_address ); 716 in_DECOD_RAS_INDEX [port]->write(request.ras_index ); 717 in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr ); 718 in_DECOD_MISS_IFETCH [port]->write(request.miss_ifetch ); 719 in_DECOD_MISS_DECOD [port]->write(request.miss_decod ); 720 in_DECOD_IS_ACCURATE [port]->write(request.is_accurate ); 721 722 SC_START(0); // fct melay 723 724 LABEL("DECOD [%d] %d - %d", 725 port, 726 in_PREDICT_VAL [port]->read(), 727 out_PREDICT_ACK [port]->read()); 728 729 if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read()) 730 { 731 LABEL("DECOD [%d] - Transaction accepted",port); 732 have_transaction = true; 733 734 request.upt_ptr = upt_top [context]; 735 upt.push_back(request); 736 // ufpt.pop_front(); 737 738 upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context]; 739 } 740 741 SC_START(1); // transition 742 743 } while (not have_transaction); 744 745 in_DECOD_VAL [port]->write(0); 746 747 if (_param->_have_port_depth) 748 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 749 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 750 } 751 } 752 753 { 754 LABEL("BRANCH_COMPLETE - hit ifetch"); 755 756 uint32_t port = rand() % _param->_nb_inst_branch_complete; 757 758 LABEL(" * port : %d",port); 759 760 std::list<request_t>::iterator it_upt = upt.begin(); 761 762 // for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 763 // for (uint32_t i=0; i<upt.size(); i++) 764 // just one 765 { 766 bool have_transaction = false; 767 768 do 769 { 770 in_BRANCH_COMPLETE_VAL [port]->write((rand()%100)<percent_transaction_branch_complete); 771 in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_upt->context ); 772 in_BRANCH_COMPLETE_DEPTH [port]->write(it_upt->upt_ptr ); 773 in_BRANCH_COMPLETE_ADDRESS [port]->write(it_upt->address_good); 774 in_BRANCH_COMPLETE_FLAG [port]->write(it_upt->flag ); 775 776 if (_param->_have_port_depth) 777 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 778 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 779 780 SC_START(0); 781 782 LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read()); 783 784 if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read()) 785 { 786 LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port); 787 have_transaction = true; 788 789 TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_upt->miss_commit ); 790 TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE [port]->read(),it_upt->take_good ); 791 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC [port]->read(),it_upt->address_src ); 792 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST [port]->read(),it_upt->address_good); 793 794 it_upt ++; 795 } 796 797 SC_START(1); 798 } while (not have_transaction); 799 800 in_BRANCH_COMPLETE_VAL [port]->write(0); 801 802 if (_param->_have_port_depth) 803 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 804 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 805 } 806 } 807 808 { 809 LABEL("UPDATE - hit ifetch"); 810 811 uint32_t port = 0; 812 813 LABEL(" * port : %d",port); 814 std::list<request_t>::iterator it_upt = upt.begin(); 815 816 // for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 817 // for (uint32_t i=0; i<upt.size(); i++) 818 // just one 819 { 820 bool have_transaction = false; 821 822 do 823 { 824 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 825 826 // if (_param->_have_port_depth) 827 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 828 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 829 830 SC_START(0); 831 832 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 833 834 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 835 { 836 LABEL("UPDATE [%d] - Transaction accepted",port); 837 have_transaction = true; 838 839 if (_param->_have_port_context_id) 840 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_upt->context); 841 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),it_upt->miss_commit); 842 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_upt->take_good); 843 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),update_btb(it_upt->condition)); 844 if (update_btb(it_upt->condition)) 845 { 846 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_upt->address_src); 847 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_upt->address_dest); 848 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_upt->condition); 849 } 850 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod)); 851 852 if (update_dir(it_upt->condition)) 853 if (_param->_have_port_history) 854 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_upt->history); 855 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_upt->condition)); 856 if (update_ras(it_upt->condition)) 857 { 858 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 859 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_upt->condition)); 860 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_upt->ras_address); 861 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_upt->ras_index); 862 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch); 863 } 864 ++ it_upt; 865 } 866 867 SC_START(1); 868 } while (not have_transaction); 869 870 in_UPDATE_ACK [port]->write(0); 871 // if (_param->_have_port_depth) 872 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 873 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 874 } 875 upt.clear(); 876 } 877 878 { 879 LABEL("BRANCH_EVENT - have miss decod"); 880 881 uint32_t port = context; 882 883 { 884 bool have_transaction = false; 885 886 do 887 { 888 in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event); 889 890 SC_START(0); 891 892 LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read()); 893 894 if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read()) 895 { 896 LABEL("BRANCH_EVENT [%d] - Transaction accepted",port); 897 have_transaction = true; 898 899 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC [port]->read(),event.address_src); 900 TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take); 901 if (event.take) 902 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST [port]->read(),event.address_good); 903 904 event.address_src = 0; 905 event.take = 0; 906 event.address_dest = 0; 907 } 908 909 SC_START(1); 910 } while (not have_transaction); 911 912 in_BRANCH_EVENT_ACK [port]->write(0); 913 } 914 } 915 916 917 // Wait Garbage Collector 918 { 919 upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context]; 920 // upt_top [context] = (upt_top [context]); 921 922 while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or 923 (upt_top [context] != out_DEPTH_MAX [context]->read())) 924 SC_START(1); 925 926 } 927 } 928 929 //--------------------------------------------------------------------- 930 //--------------------------------------------------------------------- 931 // DECOD MISS : with RAS in ifetch 932 //--------------------------------------------------------------------- 933 //--------------------------------------------------------------------- 934 if (test3) 935 { 936 uint32_t context = rand() % _param->_nb_context; 937 uint32_t have_ras = false; 938 { 939 LABEL("PREDICT - fill the queue"); 940 uint32_t port = rand() % _param->_nb_inst_predict; 941 942 LABEL(" * context : %d",context); 943 LABEL(" * port : %d",port); 944 945 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 946 { 947 request_t request; 948 request.context = context; 949 request.address_src = 0xdeadbeef+i; 950 request.address_dest = 0x21071981+i; 951 request.address_good = request.address_dest; 952 request.condition = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET; 953 954 have_ras |= (update_ras(request.condition)); 955 956 request.take = 1; 957 request.take_good = 1; 958 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 959 request.is_accurate = true; 960 request.miss_ifetch = false; 961 request.miss_decod = true ; 962 request.miss_commit = false; 963 request.history = i; 964 request.ras_address = 0x12344321+i; 965 request.ras_index = (043211234+i)%_param->_size_ras_index[context]; 966 request.ufpt_ptr = ufpt_top [context]; 967 // request.upt_ptr; 968 969 bool have_transaction = false; 970 do 971 { 972 in_PREDICT_VAL [port]->write((rand()%100)<percent_transaction_predict); 973 in_PREDICT_CONTEXT_ID [port]->write(request.context ); 974 in_PREDICT_BTB_ADDRESS_SRC [port]->write(request.address_src ); 975 in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest); 976 in_PREDICT_BTB_CONDITION [port]->write(request.condition ); 977 in_PREDICT_BTB_LAST_TAKE [port]->write(request.take ); 978 in_PREDICT_BTB_IS_ACCURATE [port]->write(request.is_accurate ); 979 in_PREDICT_DIR_HISTORY [port]->write(request.history ); 980 in_PREDICT_RAS_ADDRESS [port]->write(request.ras_address ); 981 in_PREDICT_RAS_INDEX [port]->write(request.ras_index ); 982 983 if (_param->_have_port_depth) 984 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 985 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 986 987 SC_START(0); // fct melay 988 989 LABEL("PREDICT [%d] %d - %d (accurate : %d).", 990 port, 991 in_PREDICT_VAL [port]->read(), 992 out_PREDICT_ACK [port]->read(), 993 in_PREDICT_BTB_IS_ACCURATE [port]->read()); 994 995 if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read()) 996 { 997 LABEL("PREDICT [%d] - Transaction accepted",port); 998 have_transaction = true; 999 1000 if (_param->_have_port_depth) 1001 TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]); 1002 1003 ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context]; 1004 } 1005 1006 SC_START(1); // transition 1007 1008 } while (not have_transaction); 1009 1010 ufpt.push_back(request); // to update 1011 1012 in_PREDICT_VAL [port]->write(0); 1013 1014 if (_param->_have_port_depth) 1015 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1016 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1017 } 1018 } 1019 1020 { 1021 LABEL("DECOD - Miss"); 1022 uint32_t port = rand() % _param->_nb_inst_decod; 1023 1024 LABEL(" * context : %d",context); 1025 LABEL(" * port : %d",port); 1026 1027 request_t request; 1028 request.context = context; 1029 request.address_src = 0x14011959; 1030 request.address_dest = 0x25071959; // after = not take 1031 request.address_good = request.address_dest; 1032 request.condition = BRANCH_CONDITION_FLAG_SET; 1033 request.take = 0; 1034 request.take_good = 0; 1035 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 1036 request.is_accurate = true; 1037 request.miss_ifetch = false; 1038 request.miss_decod = true ; 1039 request.miss_commit = false; 1040 request.history = 1; 1041 request.ras_address = 0xbabababa; 1042 request.ras_index = (0x87654321)%_param->_size_ras_index[context]; 1043 request.ufpt_ptr = ufpt_top [context]; 1044 1045 event = request; 1046 1047 // for (uint32_t i=0; i<upt.size(); i++) 1048 // just one 1049 { 1050 bool have_transaction = false; 1051 do 1052 { 1053 in_DECOD_VAL [port]->write((rand()%100)<percent_transaction_decod); 1054 in_DECOD_CONTEXT_ID [port]->write(request.context ); 1055 in_DECOD_BTB_ADDRESS_SRC [port]->write(request.address_src ); 1056 in_DECOD_BTB_ADDRESS_DEST [port]->write(request.address_dest); 1057 in_DECOD_BTB_CONDITION [port]->write(request.condition ); 1058 in_DECOD_BTB_LAST_TAKE [port]->write(request.take ); 1059 in_DECOD_RAS_ADDRESS [port]->write(request.ras_address ); 1060 in_DECOD_RAS_INDEX [port]->write(request.ras_index ); 1061 in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr ); 1062 in_DECOD_MISS_IFETCH [port]->write(request.miss_ifetch ); 1063 in_DECOD_MISS_DECOD [port]->write(request.miss_decod ); 1064 in_DECOD_IS_ACCURATE [port]->write(request.is_accurate ); 1065 1066 SC_START(0); // fct melay 1067 1068 LABEL("DECOD [%d] %d - %d", 1069 port, 1070 in_PREDICT_VAL [port]->read(), 1071 out_PREDICT_ACK [port]->read()); 1072 1073 if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read()) 1074 { 1075 LABEL("DECOD [%d] - Transaction accepted",port); 1076 have_transaction = true; 1077 1078 request.upt_ptr = upt_top [context]; 1079 upt.push_back(request); 1080 // ufpt.pop_front(); 1081 1082 upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context]; 1083 } 1084 1085 SC_START(1); // transition 1086 1087 } while (not have_transaction); 1088 1089 in_DECOD_VAL [port]->write(0); 1090 1091 if (_param->_have_port_depth) 1092 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1093 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1094 } 1095 } 1096 1097 { 1098 LABEL("BRANCH_COMPLETE - hit ifetch"); 1099 1100 uint32_t port = rand() % _param->_nb_inst_branch_complete; 1101 1102 LABEL(" * port : %d",port); 1103 1104 std::list<request_t>::iterator it_upt = upt.begin(); 1105 1106 // for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1107 // for (uint32_t i=0; i<upt.size(); i++) 1108 // just one 1109 { 1110 bool have_transaction = false; 1111 1112 do 1113 { 1114 in_BRANCH_COMPLETE_VAL [port]->write((rand()%100)<percent_transaction_branch_complete); 1115 in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_upt->context ); 1116 in_BRANCH_COMPLETE_DEPTH [port]->write(it_upt->upt_ptr ); 1117 in_BRANCH_COMPLETE_ADDRESS [port]->write(it_upt->address_good); 1118 in_BRANCH_COMPLETE_FLAG [port]->write(it_upt->flag ); 1119 1120 if (_param->_have_port_depth) 1121 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1122 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1123 1124 SC_START(0); 1125 1126 LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read()); 1127 1128 if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read()) 1129 { 1130 LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port); 1131 have_transaction = true; 1132 1133 TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_upt->miss_commit ); 1134 TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE [port]->read(),it_upt->take_good ); 1135 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC [port]->read(),it_upt->address_src ); 1136 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST [port]->read(),it_upt->address_good); 1137 1138 it_upt ++; 1139 } 1140 1141 SC_START(1); 1142 } while (not have_transaction); 1143 1144 in_BRANCH_COMPLETE_VAL [port]->write(0); 1145 1146 if (_param->_have_port_depth) 1147 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1148 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1149 } 1150 } 1151 1152 if (have_ras) 1153 { 1154 LABEL("UPDATE - Update UPFT"); 1155 1156 uint32_t port = 0; 1157 1158 LABEL(" * port : %d",port); 1159 std::list<request_t>::iterator it_ufpt = ufpt.end(); 1160 -- it_ufpt; 1161 1162 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1163 { 1164 bool have_transaction = false; 1165 1166 do 1167 { 1168 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 1169 1170 // if (_param->_have_port_depth) 1171 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]); 1172 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]); 1173 1174 SC_START(0); 1175 1176 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 1177 1178 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 1179 { 1180 LABEL("UPDATE [%d] - Transaction accepted",port); 1181 have_transaction = true; 1182 1183 if (_param->_have_port_context_id) 1184 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_ufpt->context); 1185 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),(it_ufpt->miss_ifetch or 1186 it_ufpt->miss_decod or 1187 it_ufpt->miss_commit )); 1188 // if (update_btb(it_ufpt->condition) or 1189 // update_dir(it_ufpt->condition)) 1190 // TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_ufpt->take_good); 1191 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),0); 1192 // if (update_btb(it_ufpt->condition)) 1193 // { 1194 // TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_ufpt->address_src); 1195 // TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_ufpt->address_dest); 1196 // TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_ufpt->condition); 1197 // } 1198 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),0); 1199 1200 // if (update_dir(it_ufpt->condition)) 1201 // if (_param->_have_port_history) 1202 // TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_ufpt->history); 1203 // TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_ufpt->condition)); 1204 if (update_ras(it_ufpt->condition)) 1205 { 1206 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 1207 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_ufpt->condition)); 1208 LABEL("KANE : out_UPDATE_RAS_ADDRESS [port]->read() : %.8x",out_UPDATE_RAS_ADDRESS [port]->read()); 1209 LABEL("KANE : it_ufpt->ras_address : %.8x",it_ufpt->ras_address); 1210 1211 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_ufpt->ras_address); 1212 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_ufpt->ras_index); 1213 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_ufpt->miss_ifetch); 1214 } 1215 } 1216 1217 SC_START(1); 1218 } while (not have_transaction); 1219 1220 -- it_ufpt; 1221 1222 1223 in_UPDATE_ACK [port]->write(0); 1224 // if (_param->_have_port_depth) 1225 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]); 1226 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]); 1227 } 1228 } 1229 ufpt.clear(); 1230 1231 { 1232 LABEL("UPDATE - hit ifetch"); 1233 1234 uint32_t port = 0; 1235 1236 LABEL(" * port : %d",port); 1237 std::list<request_t>::iterator it_upt = upt.begin(); 1238 1239 // for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1240 // for (uint32_t i=0; i<upt.size(); i++) 1241 // just one 1242 { 1243 bool have_transaction = false; 1244 1245 do 1246 { 1247 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 1248 1249 // if (_param->_have_port_depth) 1250 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1251 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1252 1253 SC_START(0); 1254 1255 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 1256 1257 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 1258 { 1259 LABEL("UPDATE [%d] - Transaction accepted",port); 1260 have_transaction = true; 1261 1262 if (_param->_have_port_context_id) 1263 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_upt->context); 1264 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),it_upt->miss_commit); 1265 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_upt->take_good); 1266 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),update_btb(it_upt->condition)); 1267 if (update_btb(it_upt->condition)) 1268 { 1269 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_upt->address_src); 1270 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_upt->address_dest); 1271 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_upt->condition); 1272 } 1273 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod)); 1274 1275 if (update_dir(it_upt->condition)) 1276 if (_param->_have_port_history) 1277 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_upt->history); 1278 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_upt->condition)); 1279 if (update_ras(it_upt->condition)) 1280 { 1281 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 1282 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_upt->condition)); 1283 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_upt->ras_address); 1284 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_upt->ras_index); 1285 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch); 1286 } 1287 ++ it_upt; 1288 } 1289 1290 SC_START(1); 1291 } while (not have_transaction); 1292 1293 in_UPDATE_ACK [port]->write(0); 1294 // if (_param->_have_port_depth) 1295 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1296 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1297 } 1298 } 1299 upt.clear(); 1300 1301 { 1302 LABEL("BRANCH_EVENT - have miss decod"); 1303 1304 uint32_t port = context; 1305 1306 { 1307 bool have_transaction = false; 1308 1309 do 1310 { 1311 in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event); 1312 1313 SC_START(0); 1314 1315 LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read()); 1316 1317 if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read()) 1318 { 1319 LABEL("BRANCH_EVENT [%d] - Transaction accepted",port); 1320 have_transaction = true; 1321 1322 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC [port]->read(),event.address_src); 1323 TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take); 1324 if (event.take) 1325 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST [port]->read(),event.address_good); 1326 1327 event.address_src = 0; 1328 event.take = 0; 1329 event.address_dest = 0; 1330 } 1331 1332 SC_START(1); 1333 } while (not have_transaction); 1334 1335 in_BRANCH_EVENT_ACK [port]->write(0); 1336 } 1337 } 1338 1339 // Wait Garbage Collector 1340 { 1341 upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context]; 1342 // upt_top [context] = (upt_top [context]); 1343 1344 while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or 1345 (upt_top [context] != out_DEPTH_MAX [context]->read())) 1346 SC_START(1); 1347 1348 } 1349 } 1350 1351 //--------------------------------------------------------------------- 1352 //--------------------------------------------------------------------- 1353 // COMMIT MISS : with RAS in UPFT and UPT 1354 //--------------------------------------------------------------------- 1355 //--------------------------------------------------------------------- 1356 if (test4) 1357 { 1358 uint32_t context = rand() % _param->_nb_context; 1359 uint32_t have_ufpt_ras = false; 1360 uint32_t have_upt_ras = false; 1361 { 1362 LABEL("PREDICT - fill the queue"); 1363 uint32_t port = rand() % _param->_nb_inst_predict; 1364 1365 LABEL(" * context : %d",context); 1366 LABEL(" * port : %d",port); 1367 1368 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1369 { 1370 request_t request; 1371 request.context = context; 1372 request.address_src = rand(); 1373 request.address_dest = rand(); 1374 1375 request.condition = (rand()%2)?BRANCH_CONDITION_READ_STACK:BRANCH_CONDITION_FLAG_SET; 1376 1377 request.take = 1; 1378 request.take_good = 1; 1379 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 1380 request.is_accurate = false; 1381 request.miss_ifetch = false; 1382 request.miss_decod = false; 1383 request.miss_commit = false; 1384 request.history = i; 1385 request.ras_address = rand(); 1386 request.ras_index = rand()%_param->_size_ras_index[context]; 1387 request.ufpt_ptr = ufpt_top [context]; 1388 // request.upt_ptr; 1389 1390 bool have_transaction = false; 1391 do 1392 { 1393 in_PREDICT_VAL [port]->write((rand()%100)<percent_transaction_predict); 1394 in_PREDICT_CONTEXT_ID [port]->write(request.context ); 1395 in_PREDICT_BTB_ADDRESS_SRC [port]->write(request.address_src ); 1396 in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest); 1397 in_PREDICT_BTB_CONDITION [port]->write(request.condition ); 1398 in_PREDICT_BTB_LAST_TAKE [port]->write(request.take ); 1399 in_PREDICT_BTB_IS_ACCURATE [port]->write(request.is_accurate ); 1400 in_PREDICT_DIR_HISTORY [port]->write(request.history ); 1401 in_PREDICT_RAS_ADDRESS [port]->write(request.ras_address ); 1402 in_PREDICT_RAS_INDEX [port]->write(request.ras_index ); 1403 1404 if (_param->_have_port_depth) 1405 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1406 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1407 1408 SC_START(0); // fct melay 1409 1410 LABEL("PREDICT [%d] %d - %d (accurate : %d).", 1411 port, 1412 in_PREDICT_VAL [port]->read(), 1413 out_PREDICT_ACK [port]->read(), 1414 in_PREDICT_BTB_IS_ACCURATE [port]->read()); 1415 1416 if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read()) 1417 { 1418 LABEL("PREDICT [%d] - Transaction accepted",port); 1419 have_transaction = true; 1420 1421 if (_param->_have_port_depth) 1422 TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]); 1423 1424 ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context]; 1425 } 1426 1427 SC_START(1); // transition 1428 1429 } while (not have_transaction); 1430 1431 ufpt.push_back(request); // to update 1432 1433 in_PREDICT_VAL [port]->write(0); 1434 1435 if (_param->_have_port_depth) 1436 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1437 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1438 } 1439 } 1440 1441 { 1442 LABEL("DECOD"); 1443 uint32_t port = rand() % _param->_nb_inst_decod; 1444 1445 LABEL(" * context : %d",context); 1446 LABEL(" * port : %d",port); 1447 1448 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1449 { 1450 request_t request = ufpt.front(); 1451 1452 bool have_transaction = false; 1453 do 1454 { 1455 in_DECOD_VAL [port]->write((rand()%100)<percent_transaction_decod); 1456 in_DECOD_CONTEXT_ID [port]->write(request.context ); 1457 in_DECOD_BTB_ADDRESS_SRC [port]->write(request.address_src ); 1458 in_DECOD_BTB_ADDRESS_DEST [port]->write(request.address_dest); 1459 in_DECOD_BTB_CONDITION [port]->write(request.condition ); 1460 in_DECOD_BTB_LAST_TAKE [port]->write(request.take ); 1461 in_DECOD_RAS_ADDRESS [port]->write(request.ras_address ); 1462 in_DECOD_RAS_INDEX [port]->write(request.ras_index ); 1463 in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr ); 1464 in_DECOD_MISS_IFETCH [port]->write(request.miss_ifetch ); 1465 in_DECOD_MISS_DECOD [port]->write(request.miss_decod ); 1466 in_DECOD_IS_ACCURATE [port]->write(request.is_accurate ); 1467 1468 have_upt_ras |= (update_ras(request.condition)); 1469 1470 SC_START(0); // fct melay 1471 1472 LABEL("DECOD [%d] %d - %d", 1473 port, 1474 in_PREDICT_VAL [port]->read(), 1475 out_PREDICT_ACK [port]->read()); 1476 1477 if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read()) 1478 { 1479 LABEL("DECOD [%d] - Transaction accepted",port); 1480 have_transaction = true; 1481 1482 request.upt_ptr = upt_top [context]; 1483 upt.push_back(request); 1484 ufpt.pop_front(); 1485 1486 upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context]; 1487 } 1488 1489 SC_START(1); // transition 1490 1491 } while (not have_transaction); 1492 1493 in_DECOD_VAL [port]->write(0); 1494 1495 if (_param->_have_port_depth) 1496 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1497 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1498 } 1499 } 1500 1501 { 1502 LABEL("PREDICT - fill the queue"); 1503 uint32_t port = rand() % _param->_nb_inst_predict; 1504 1505 LABEL(" * context : %d",context); 1506 LABEL(" * port : %d",port); 1507 1508 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1509 { 1510 request_t request; 1511 request.context = context; 1512 request.address_src = rand(); 1513 request.address_dest = rand(); 1514 request.address_good = request.address_dest; 1515 request.condition = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET; 1516 1517 have_ufpt_ras |= (update_ras(request.condition)); 1518 1519 request.take = 1; 1520 request.take_good = 1; 1521 request.flag = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good); 1522 request.is_accurate = false; 1523 request.miss_ifetch = false; 1524 request.miss_decod = false; 1525 request.miss_commit = true; 1526 request.history = i; 1527 request.ras_address = rand(); 1528 request.ras_index = rand()%_param->_size_ras_index[context]; 1529 request.ufpt_ptr = ufpt_top [context]; 1530 // request.upt_ptr; 1531 1532 bool have_transaction = false; 1533 do 1534 { 1535 in_PREDICT_VAL [port]->write((rand()%100)<percent_transaction_predict); 1536 in_PREDICT_CONTEXT_ID [port]->write(request.context ); 1537 in_PREDICT_BTB_ADDRESS_SRC [port]->write(request.address_src ); 1538 in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest); 1539 in_PREDICT_BTB_CONDITION [port]->write(request.condition ); 1540 in_PREDICT_BTB_LAST_TAKE [port]->write(request.take ); 1541 in_PREDICT_BTB_IS_ACCURATE [port]->write(request.is_accurate ); 1542 in_PREDICT_DIR_HISTORY [port]->write(request.history ); 1543 in_PREDICT_RAS_ADDRESS [port]->write(request.ras_address ); 1544 in_PREDICT_RAS_INDEX [port]->write(request.ras_index ); 1545 1546 if (_param->_have_port_depth) 1547 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1548 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1549 1550 SC_START(0); // fct melay 1551 1552 LABEL("PREDICT [%d] %d - %d (accurate : %d).", 1553 port, 1554 in_PREDICT_VAL [port]->read(), 1555 out_PREDICT_ACK [port]->read(), 1556 in_PREDICT_BTB_IS_ACCURATE [port]->read()); 1557 1558 if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read()) 1559 { 1560 LABEL("PREDICT [%d] - Transaction accepted",port); 1561 have_transaction = true; 1562 1563 if (_param->_have_port_depth) 1564 TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]); 1565 1566 ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context]; 1567 } 1568 1569 SC_START(1); // transition 1570 1571 } while (not have_transaction); 1572 1573 ufpt.push_back(request); // to update 1574 1575 in_PREDICT_VAL [port]->write(0); 1576 1577 if (_param->_have_port_depth) 1578 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1579 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1580 } 1581 } 1582 1583 std::list<request_t>::iterator it_event; 1584 { 1585 LABEL("BRANCH_COMPLETE - hit ifetch"); 1586 1587 uint32_t port = rand() % _param->_nb_inst_branch_complete; 1588 1589 LABEL(" * port : %d",port); 1590 1591 // middle 1592 it_event = upt.begin(); 1593 for (uint32_t i=0; i < (upt.size()>>1); ++i) 1594 it_event ++; 1595 1596 for (std::list<request_t>::iterator it_upt = it_event; 1597 it_upt != upt.end(); 1598 ++it_upt) 1599 it_upt->miss_commit = true; 1600 1601 if (update_ras(it_event->condition)) 1602 it_event->address_good = ~(it_event->address_dest); 1603 else 1604 { 1605 it_event->address_good = it_event->address_dest; 1606 it_event->flag = not it_event->flag; 1607 it_event->take_good = not it_event->take_good; 1608 } 1609 1610 event = *it_event; 1611 1612 1613 // for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1614 // for (uint32_t i=0; i<upt.size(); i++) 1615 // just one 1616 { 1617 bool have_transaction = false; 1618 1619 do 1620 { 1621 in_BRANCH_COMPLETE_VAL [port]->write((rand()%100)<percent_transaction_branch_complete); 1622 in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_event->context ); 1623 in_BRANCH_COMPLETE_DEPTH [port]->write(it_event->upt_ptr ); 1624 in_BRANCH_COMPLETE_ADDRESS [port]->write(it_event->address_good); 1625 in_BRANCH_COMPLETE_FLAG [port]->write(it_event->flag ); 1626 1627 if (_param->_have_port_depth) 1628 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1629 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1630 1631 SC_START(0); 1632 1633 LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read()); 1634 1635 if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read()) 1636 { 1637 LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port); 1638 LABEL(" * CONTEXT_ID %d" ,it_event->context ); 1639 LABEL(" * DEPTH %d" ,it_event->upt_ptr ); 1640 LABEL(" * CONDITION %d" ,it_event->condition ); 1641 LABEL(" * ADDRESS %.8x",it_event->address_good); 1642 LABEL(" * FLAG %d" ,it_event->flag ); 1643 1644 have_transaction = true; 1645 1646 TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_event->miss_commit ); 1647 TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE [port]->read(),it_event->take_good ); 1648 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC [port]->read(),it_event->address_src ); 1649 TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST [port]->read(),it_event->address_good); 1650 1651 upt_top [it_event->context] = it_event->upt_ptr; 1652 } 1653 1654 SC_START(1); 1655 } while (not have_transaction); 1656 1657 in_BRANCH_COMPLETE_VAL [port]->write(0); 1658 1659 if (_param->_have_port_depth) 1660 TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1661 TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1662 } 1663 } 1664 1665 if (have_ufpt_ras) 1666 { 1667 LABEL("UPDATE - Update UPFT"); 1668 1669 uint32_t port = 0; 1670 1671 LABEL(" * port : %d",port); 1672 std::list<request_t>::iterator it_ufpt = ufpt.end(); 1673 -- it_ufpt; 1674 1675 for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++) 1676 { 1677 bool have_transaction = false; 1678 1679 do 1680 { 1681 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 1682 1683 // if (_param->_have_port_depth) 1684 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]); 1685 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]); 1686 1687 SC_START(0); 1688 1689 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 1690 1691 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 1692 { 1693 LABEL("UPDATE [%d] - Transaction accepted",port); 1694 have_transaction = true; 1695 1696 if (_param->_have_port_context_id) 1697 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_ufpt->context); 1698 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),(it_ufpt->miss_ifetch or 1699 it_ufpt->miss_decod or 1700 it_ufpt->miss_commit )); 1701 // if (update_btb(it_ufpt->condition) or 1702 // update_dir(it_ufpt->condition)) 1703 // TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_ufpt->take_good); 1704 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),0); 1705 // if (update_btb(it_ufpt->condition)) 1706 // { 1707 // TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_ufpt->address_src); 1708 // TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_ufpt->address_dest); 1709 // TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_ufpt->condition); 1710 // } 1711 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),0); 1712 1713 // if (update_dir(it_ufpt->condition)) 1714 // if (_param->_have_port_history) 1715 // TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_ufpt->history); 1716 // TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_ufpt->condition)); 1717 if (update_ras(it_ufpt->condition)) 1718 { 1719 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 1720 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_ufpt->condition)); 1721 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_ufpt->ras_address); 1722 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_ufpt->ras_index); 1723 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_ufpt->miss_ifetch); 1724 } 1725 } 1726 1727 SC_START(1); 1728 } while (not have_transaction); 1729 1730 -- it_ufpt; 1731 1732 1733 in_UPDATE_ACK [port]->write(0); 1734 // if (_param->_have_port_depth) 1735 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]); 1736 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]); 1737 } 1738 } 1739 ufpt.clear(); 1740 1741 { 1742 LABEL("UPDATE - upt"); 1743 1744 uint32_t port = 0; 1745 1746 LABEL(" * port : %d",port); 1747 std::list<request_t>::iterator it_upt = upt.end(); 1748 --it_upt; 1749 1750 // for (uint32_t i=0; i<upt.size(); i++) 1751 while (it_upt != it_event) 1752 { 1753 bool have_transaction = false; 1754 1755 do 1756 { 1757 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 1758 1759 // if (_param->_have_port_depth) 1760 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1761 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1762 1763 SC_START(0); 1764 1765 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 1766 1767 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 1768 { 1769 LABEL("UPDATE [%d] - Transaction accepted",port); 1770 have_transaction = true; 1771 1772 if (_param->_have_port_context_id) 1773 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_upt->context); 1774 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),it_upt->miss_commit); 1775 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_upt->take_good); 1776 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),update_btb(it_upt->condition)); 1777 if (update_btb(it_upt->condition)) 1778 { 1779 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_upt->address_src); 1780 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_upt->address_dest); 1781 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_upt->condition); 1782 } 1783 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod)); 1784 1785 if (update_dir(it_upt->condition)) 1786 if (_param->_have_port_history) 1787 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_upt->history); 1788 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_upt->condition)); 1789 if (update_ras(it_upt->condition)) 1790 { 1791 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 1792 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_upt->condition)); 1793 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_upt->ras_address); 1794 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_upt->ras_index); 1795 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch); 1796 } 1797 1798 -- it_upt; 1799 } 1800 1801 SC_START(1); 1802 } while (not have_transaction); 1803 1804 upt.pop_back(); 1805 in_UPDATE_ACK [port]->write(0); 1806 // if (_param->_have_port_depth) 1807 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1808 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1809 } 1810 } 1811 // upt.clear(); // Not yet 1812 1813 { 1814 LABEL("BRANCH_EVENT - have miss decod"); 1815 1816 uint32_t port = context; 1817 1818 { 1819 bool have_transaction = false; 1820 1821 do 1822 { 1823 in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event); 1824 1825 SC_START(0); 1826 1827 LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read()); 1828 1829 if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read()) 1830 { 1831 LABEL("BRANCH_EVENT [%d] - Transaction accepted",port); 1832 have_transaction = true; 1833 1834 LABEL(" * event.address_src : %.8x,",event.address_src ); 1835 LABEL(" * event.address_good : %.8x,",event.address_good); 1836 LABEL(" * event.take : %.8x,",event.take ); 1837 1838 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC [port]->read(),event.address_src); 1839 TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take_good); 1840 if (event.take_good) 1841 TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST [port]->read(),event.address_good); 1842 1843 event.address_src = 0; 1844 event.take = 0; 1845 event.address_dest = 0; 1846 } 1847 1848 SC_START(1); 1849 } while (not have_transaction); 1850 1851 in_BRANCH_EVENT_ACK [port]->write(0); 1852 } 1853 } 1854 1855 { 1856 LABEL("UPDATE - upt"); 1857 1858 uint32_t port = 0; 1859 1860 LABEL(" * port : %d",port); 1861 std::list<request_t>::iterator it_upt = upt.begin(); 1862 1863 for (uint32_t i=0; i<upt.size(); i++) 1864 { 1865 bool have_transaction = false; 1866 1867 do 1868 { 1869 in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update); 1870 1871 // if (_param->_have_port_depth) 1872 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1873 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1874 1875 SC_START(0); 1876 1877 LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read()); 1878 1879 if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read()) 1880 { 1881 LABEL("UPDATE [%d] - Transaction accepted",port); 1882 have_transaction = true; 1883 1884 if (_param->_have_port_context_id) 1885 TEST(Tcontext_t ,out_UPDATE_CONTEXT_ID [port]->read(),it_upt->context); 1886 TEST(Tcontrol_t ,out_UPDATE_MISS_PREDICTION [port]->read(),it_upt->miss_commit); 1887 TEST(Tcontrol_t ,out_UPDATE_DIRECTION_GOOD [port]->read(),it_upt->take_good); 1888 TEST(Tcontrol_t ,out_UPDATE_BTB_VAL [port]->read(),update_btb(it_upt->condition)); 1889 if (update_btb(it_upt->condition)) 1890 { 1891 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_SRC [port]->read(),it_upt->address_src); 1892 TEST(Taddress_t ,out_UPDATE_BTB_ADDRESS_DEST [port]->read(),it_upt->address_dest); 1893 TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION [port]->read(),it_upt->condition); 1894 } 1895 TEST(Tcontrol_t ,out_UPDATE_DIR_VAL [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod)); 1896 1897 if (update_dir(it_upt->condition)) 1898 if (_param->_have_port_history) 1899 TEST(Thistory_t ,out_UPDATE_DIR_HISTORY [port]->read(),it_upt->history); 1900 TEST(Tcontrol_t ,out_UPDATE_RAS_VAL [port]->read(),update_ras(it_upt->condition)); 1901 if (update_ras(it_upt->condition)) 1902 { 1903 // TEST(Tcontrol_t ,out_UPDATE_RAS_FLUSH [port]->read(),0); 1904 TEST(Tcontrol_t ,out_UPDATE_RAS_PUSH [port]->read(),push_ras (it_upt->condition)); 1905 TEST(Taddress_t ,out_UPDATE_RAS_ADDRESS [port]->read(),it_upt->ras_address); 1906 TEST(Tptr_t ,out_UPDATE_RAS_INDEX [port]->read(),it_upt->ras_index); 1907 TEST(Tcontrol_t ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch); 1908 } 1909 1910 -- it_upt; 1911 } 1912 1913 SC_START(1); 1914 } while (not have_transaction); 1915 1916 in_UPDATE_ACK [port]->write(0); 1917 // if (_param->_have_port_depth) 1918 // TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]); 1919 // TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]); 1920 } 1921 } 1922 upt.clear(); // Not yet 1923 1924 // Wait Garbage Collector 1925 { 1926 upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context]; 1927 // upt_top [context] = (upt_top [context]); 1928 1929 while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or 1930 (upt_top [context] != out_DEPTH_MAX [context]->read())) 1931 SC_START(1); 1932 1933 } 1934 } 1935 588 1936 }// ITERATION 589 1937 … … 649 1997 // delete [] out_BRANCH_EVENT_MISS_PREDICTION; 650 1998 delete [] out_BRANCH_EVENT_ADDRESS_SRC ; 1999 delete [] out_BRANCH_EVENT_ADDRESS_DEST_VAL; 651 2000 delete [] out_BRANCH_EVENT_ADDRESS_DEST ; 652 2001 … … 664 2013 delete [] out_UPDATE_DIR_HISTORY ; 665 2014 delete [] out_UPDATE_RAS_VAL ; 2015 delete [] out_UPDATE_RAS_FLUSH ; 666 2016 delete [] out_UPDATE_RAS_PUSH ; 667 2017 delete [] out_UPDATE_RAS_ADDRESS ; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Update_Prediction_Table.h
r88 r94 120 120 //public : SC_OUT(Tcontrol_t ) ** out_BRANCH_EVENT_MISS_PREDICTION ; //[nb_context] is always miss prediction 121 121 public : SC_OUT(Taddress_t ) ** out_BRANCH_EVENT_ADDRESS_SRC ; //[nb_context] 122 public : SC_OUT(Tcontrol_t ) ** out_BRANCH_EVENT_ADDRESS_DEST_VAL ; //[nb_context] 122 123 public : SC_OUT(Taddress_t ) ** out_BRANCH_EVENT_ADDRESS_DEST ; //[nb_context] 123 124 … … 135 136 public : SC_OUT(Thistory_t ) ** out_UPDATE_DIR_HISTORY ; //[nb_inst_update] 136 137 public : SC_OUT(Tcontrol_t ) ** out_UPDATE_RAS_VAL ; //[nb_inst_update] 138 public : SC_OUT(Tcontrol_t ) ** out_UPDATE_RAS_FLUSH ; //[nb_inst_update] 137 139 public : SC_OUT(Tcontrol_t ) ** out_UPDATE_RAS_PUSH ; //[nb_inst_update] 138 140 public : SC_OUT(Taddress_t ) ** out_UPDATE_RAS_ADDRESS ; //[nb_inst_update] 139 141 public : SC_OUT(Tptr_t ) ** out_UPDATE_RAS_INDEX ; //[nb_inst_update] 140 142 public : SC_OUT(Tcontrol_t ) ** out_UPDATE_RAS_PREDICTION_IFETCH ; //[nb_inst_update] 143 144 // ~~~~~[ Interface : "event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 public : SC_IN (Tevent_state_t ) ** in_EVENT_STATE ; //[nb_context] 146 public : SC_IN (Tevent_type_t ) ** in_EVENT_TYPE ; //[nb_context] 147 public : SC_IN (Tdepth_t ) ** in_EVENT_DEPTH ; //[nb_context] 141 148 142 149 // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 164 171 private : uint32_t * reg_UPT_TOP ; //[nb_context] 165 172 private : uint32_t * reg_UPT_UPDATE ; //[nb_context] 166 private : uint32_t * reg_UPT_NB_NEED_UPDATE ; //[nb_context]167 173 168 174 private : bool * reg_IS_ACCURATE ; //[nb_context] 169 175 170 176 private : event_state_t * reg_EVENT_STATE ; //[nb_context] 171 private : Tcontrol_t * reg_EVENT_RAS_CORRUPTED ; //[nb_context] // RAS must be flush172 177 private : Taddress_t * reg_EVENT_ADDRESS_SRC ; //[nb_context] // Address branch 173 private : Tcontrol_t * reg_EVENT_ADDRESS_ SRC_VAL; //[nb_context] // if miss ifetch, decod issue branch, dest must be reload178 private : Tcontrol_t * reg_EVENT_ADDRESS_DEST_VAL ; //[nb_context] // if miss ifetch, decod issue branch, dest must be reload 174 179 private : Taddress_t * reg_EVENT_ADDRESS_DEST ; //[nb_context] // Address dest 175 180 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_allocation.cpp
r88 r94 114 114 ALLOC1_INTERFACE("branch_event", IN,SOUTH, "branch_event", _param->_nb_context); 115 115 116 ALLOC1_VALACK_OUT(out_BRANCH_EVENT_VAL ,VAL); 117 ALLOC1_VALACK_IN ( in_BRANCH_EVENT_ACK ,ACK); 118 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_CONTEXT_ID ,"context_id" ,Tcontext_t,_param->_size_context_id); 119 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_DEPTH ,"depth" ,Tdepth_t ,_param->_size_depth); 120 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_MISS_PREDICTION,"miss_prediction",Tcontrol_t,1); 121 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_SRC ,"address_src" ,Taddress_t,_param->_size_instruction_address); 122 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_DEST ,"address_dest" ,Taddress_t,_param->_size_instruction_address); 116 ALLOC1_VALACK_OUT(out_BRANCH_EVENT_VAL ,VAL); 117 ALLOC1_VALACK_IN ( in_BRANCH_EVENT_ACK ,ACK); 118 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_CONTEXT_ID ,"context_id" ,Tcontext_t,_param->_size_context_id); 119 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_DEPTH ,"depth" ,Tdepth_t ,_param->_size_depth); 120 // ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_MISS_PREDICTION ,"miss_prediction" ,Tcontrol_t,1); 121 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_SRC ,"address_src" ,Taddress_t,_param->_size_instruction_address); 122 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_DEST_VAL ,"address_dest_val",Tcontrol_t,1); 123 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_DEST ,"address_dest" ,Taddress_t,_param->_size_instruction_address); 123 124 } 124 125 … … 139 140 ALLOC1_SIGNAL_OUT(out_UPDATE_DIR_HISTORY ,"dir_history" ,Thistory_t ,_param->_size_history); 140 141 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_VAL ,"ras_val" ,Tcontrol_t ,1); 142 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_FLUSH ,"ras_flush" ,Tcontrol_t ,1); 141 143 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_PUSH ,"ras_push" ,Tcontrol_t ,1); 142 144 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_ADDRESS ,"ras_address" ,Taddress_t ,_param->_size_instruction_address); 143 145 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_INDEX ,"ras_index" ,Tptr_t ,_param->_max_size_ras_index); 144 146 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_PREDICTION_IFETCH,"ras_prediction_ifetch",Tcontrol_t ,1); 147 } 148 149 // ~~~~~[ Interface : "event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 150 { 151 ALLOC1_INTERFACE("event", IN,SOUTH,"event", _param->_nb_context); 152 153 ALLOC1_SIGNAL_IN ( in_EVENT_STATE ,"state",Tevent_state_t,_param->_size_event_state); 154 ALLOC1_SIGNAL_IN ( in_EVENT_TYPE ,"type" ,Tevent_type_t ,_param->_size_event_type ); 155 ALLOC1_SIGNAL_IN ( in_EVENT_DEPTH ,"depth",Tdepth_t ,_param->_size_depth ); 145 156 } 146 157 … … 187 198 ALLOC1(reg_UPT_TOP ,uint32_t ,_param->_nb_context); 188 199 ALLOC1(reg_UPT_UPDATE ,uint32_t ,_param->_nb_context); 189 ALLOC1(reg_UPT_NB_NEED_UPDATE ,uint32_t ,_param->_nb_context);190 200 191 201 ALLOC1(reg_EVENT_STATE ,event_state_t,_param->_nb_context); 192 ALLOC1(reg_EVENT_RAS_CORRUPTED ,Tcontrol_t ,_param->_nb_context);193 202 ALLOC1(reg_EVENT_ADDRESS_SRC ,Taddress_t ,_param->_nb_context); 194 ALLOC1(reg_EVENT_ADDRESS_ SRC_VAL,Tcontrol_t ,_param->_nb_context);203 ALLOC1(reg_EVENT_ADDRESS_DEST_VAL ,Tcontrol_t ,_param->_nb_context); 195 204 ALLOC1(reg_EVENT_ADDRESS_DEST ,Taddress_t ,_param->_nb_context); 196 205 } -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp
r88 r94 88 88 // delete [] out_BRANCH_EVENT_MISS_PREDICTION; 89 89 delete [] out_BRANCH_EVENT_ADDRESS_SRC ; 90 delete [] out_BRANCH_EVENT_ADDRESS_DEST_VAL; 90 91 delete [] out_BRANCH_EVENT_ADDRESS_DEST ; 91 92 … … 105 106 delete [] out_UPDATE_DIR_HISTORY ; 106 107 delete [] out_UPDATE_RAS_VAL ; 108 delete [] out_UPDATE_RAS_FLUSH ; 107 109 delete [] out_UPDATE_RAS_PUSH ; 108 110 delete [] out_UPDATE_RAS_ADDRESS ; 109 111 delete [] out_UPDATE_RAS_INDEX ; 110 112 delete [] out_UPDATE_RAS_PREDICTION_IFETCH; 113 114 // ~~~~~[ Interface : "event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 115 DELETE1_SIGNAL( in_EVENT_STATE ,_param->_nb_context,_param->_size_event_state); 116 DELETE1_SIGNAL( in_EVENT_TYPE ,_param->_nb_context,_param->_size_event_type ); 117 DELETE1_SIGNAL( in_EVENT_DEPTH ,_param->_nb_context,_param->_size_depth ); 111 118 112 119 // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 149 156 DELETE1(reg_UPT_TOP ,_param->_nb_context); 150 157 DELETE1(reg_UPT_UPDATE ,_param->_nb_context); 151 DELETE1(reg_UPT_NB_NEED_UPDATE ,_param->_nb_context);152 158 153 159 DELETE1(reg_EVENT_STATE ,_param->_nb_context); 154 DELETE1(reg_EVENT_RAS_CORRUPTED ,_param->_nb_context);155 160 DELETE1(reg_EVENT_ADDRESS_SRC ,_param->_nb_context); 156 DELETE1(reg_EVENT_ADDRESS_ SRC_VAL,_param->_nb_context);161 DELETE1(reg_EVENT_ADDRESS_DEST_VAL ,_param->_nb_context); 157 162 DELETE1(reg_EVENT_ADDRESS_DEST ,_param->_nb_context); 158 163 } -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_branch_complete.cpp
r88 r94 61 61 //miss : always hit 62 62 //addr_dest : compute in decod stage 63 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK"); 64 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_NONE_WITH_WRITE_STACK "); 63 65 64 66 #ifdef DEBUG_TEST … … 75 77 //addr_dest : compute in decod stage 76 78 //miss if the direction is bad 79 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_FLAG_UNSET"); 80 77 81 Tcontrol_t take_good = not flag; // flag set = not take 78 82 … … 91 95 //addr_dest : compute in decod stage 92 96 //miss if the direction is bad 97 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_FLAG_SET"); 98 93 99 Tcontrol_t take_good = flag; // flag set = take 94 100 … … 107 113 case BRANCH_CONDITION_READ_STACK : // l.jr (rb==r9) 108 114 { 115 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK"); 116 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK "); 117 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_READ_STACK "); 118 109 119 // miss if destination address is bad 110 120 miss = (addr_dest != addr_good); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
r88 r94 24 24 log_begin(Update_Prediction_Table,FUNCTION); 25 25 log_function(Update_Prediction_Table,FUNCTION,_name.c_str()); 26 log_printf(NONE,Update_Prediction_Table,FUNCTION,FUNCTION);27 26 28 27 if (PORT_READ(in_NRESET) == 1) … … 87 86 Thistory_t dir_history ; 88 87 Tcontrol_t ras_val ; 88 Tcontrol_t ras_flush ; 89 89 Tcontrol_t ras_push ; 90 90 Taddress_t ras_address ; … … 110 110 111 111 val = (state == UPDATE_FETCH_PREDICTION_STATE_EVENT); 112 // val_without_ack = not update_ras(condition); 113 112 114 miss_prediction = 1; 113 115 // direction_good = ; … … 119 121 // dir_history = ; 120 122 ras_val = update_ras(condition); // repop/ repush data -> don't corrupt ras 123 ras_flush = 0; 121 124 ras_push = push_ras(condition); 122 125 ras_address = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._address_ras; … … 132 135 ufpt_update [context] = false; 133 136 134 tab_ufpt_depth[context] = ( depth==0)?(_param->_size_ufpt_queue[context]-1):(depth-1);137 tab_ufpt_depth[context] = ((depth==0)?_param->_size_ufpt_queue[context]:depth)-1; 135 138 } 136 139 } … … 177 180 dir_history = reg_UPDATE_PREDICTION_TABLE [context][depth]._history ; 178 181 ras_val = update_ras(condition); // repop/ repush data -> don't corrupt ras 182 ras_flush = (state == UPDATE_PREDICTION_STATE_KO); // miss prediction, RAS is corrupted 179 183 ras_push = push_ras(condition); 180 184 ras_address = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras; … … 224 228 PORT_WRITE(out_UPDATE_BTB_VAL [i],btb_val ); 225 229 PORT_WRITE(out_UPDATE_BTB_ADDRESS_SRC [i],btb_address_src ); 226 227 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * address_src : %.8x",btb_address_src);228 229 230 PORT_WRITE(out_UPDATE_BTB_ADDRESS_DEST [i],btb_address_dest ); 230 231 PORT_WRITE(out_UPDATE_BTB_CONDITION [i],btb_condition ); … … 233 234 PORT_WRITE(out_UPDATE_DIR_HISTORY [i],dir_history ); 234 235 PORT_WRITE(out_UPDATE_RAS_VAL [i],ras_val ); 236 PORT_WRITE(out_UPDATE_RAS_FLUSH [i],ras_flush ); 235 237 PORT_WRITE(out_UPDATE_RAS_PUSH [i],ras_push ); 236 238 PORT_WRITE(out_UPDATE_RAS_ADDRESS [i],ras_address ); … … 239 241 } 240 242 } 241 242 // // =================================================================== 243 // // =====[ BRANCH_EVENT ]============================================== 244 // // =================================================================== 245 // for (uint32_t i=0; i<_param->_nb_context; i++) 246 // { 247 // Tdepth_t depth = (reg_BOTTOM [i] + reg_NB_ELT_UPDATE [i])%_param->_size_queue [i]; 248 // state_t state = reg_UPDATE_PREDICTION_TABLE [i][depth]._state; 249 250 // Tcontrol_t val = ((state == UPDATE_PREDICTION_STATE_EVENT) or 251 // (state == UPDATE_PREDICTION_STATE_WAITEND_AND_EVENT)); 252 253 // if (val) 254 // { 255 // // breakpoint ("UPT : have an branch_event (depth %d)",depth); 256 // PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_src ); 257 // PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_dest); 258 // internal_BRANCH_EVENT_DEPTH [i] = depth; 259 // } 260 261 // internal_BRANCH_EVENT_VAL [i] = val; 262 // PORT_WRITE(out_BRANCH_EVENT_VAL [i], internal_BRANCH_EVENT_VAL [i]); 263 // } 264 265 } 243 244 // =================================================================== 245 // =====[ BRANCH_EVENT ]============================================== 246 // =================================================================== 247 for (uint32_t i=0; i<_param->_nb_context; i++) 248 { 249 Tcontrol_t val = (reg_EVENT_STATE [i] == EVENT_STATE_UPDATE_CONTEXT); 250 251 PORT_WRITE(out_BRANCH_EVENT_VAL [i],val); 252 PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC [i],reg_EVENT_ADDRESS_SRC [i]); 253 PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST_VAL [i],reg_EVENT_ADDRESS_DEST_VAL [i]); 254 PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i],reg_EVENT_ADDRESS_DEST [i]); 255 256 internal_BRANCH_EVENT_VAL [i] = val; 257 } 258 } 259 266 260 log_end(Update_Prediction_Table,FUNCTION); 267 261 }; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp
r88 r94 45 45 reg_UPT_TOP [i] = 0; 46 46 reg_UPT_UPDATE [i] = 0; 47 reg_UPT_NB_NEED_UPDATE [i] = 0;48 47 49 48 reg_IS_ACCURATE [i] = true; 50 49 51 50 reg_EVENT_STATE [i] = EVENT_STATE_OK; 52 51 } … … 54 53 else 55 54 { 55 bool flush_UFPT [_param->_nb_context]; 56 for (uint32_t i=0; i<_param->_nb_context; i++) 57 flush_UFPT [i] = false; 58 56 59 // =================================================================== 57 60 // =====[ GARBAGE COLLECTOR ]========================================= … … 166 169 Tbranch_condition_t condition ; 167 170 Tcontrol_t is_accurate; 171 Taddress_t address_src = PORT_READ(in_DECOD_BTB_ADDRESS_SRC [i]); 172 Taddress_t address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]); 173 Tcontrol_t last_take = PORT_READ(in_DECOD_BTB_LAST_TAKE [i]); 168 174 169 175 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * DECOD[%d] - Accepted",i); … … 176 182 { 177 183 // Have a miss !!! 184 #ifdef DEBUG_TEST 185 if (reg_EVENT_STATE [context] != EVENT_STATE_OK) 186 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid event state.")); 187 #endif 188 189 if (reg_UFPT_NB_NEED_UPDATE [context] == 0) 190 { 191 // Change state 192 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_UPDATE_CONTEXT (decod - miss - no flush ufpt)",context); 193 reg_EVENT_STATE [context] = EVENT_STATE_UPDATE_CONTEXT; 194 } 195 else 196 { 197 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_FLUSH_UFPT (decod - miss - flush ufpt)",context); 198 reg_EVENT_STATE [context] = EVENT_STATE_FLUSH_UFPT; 199 } 178 200 179 201 // Flush UPFT 180 181 // It's to accelerate miss speculation 182 if (reg_UFPT_NB_NEED_UPDATE [context] == 0) 183 { 184 // No entry need prediction, flush all entry -> Reset 185 for (uint32_t j=0; j<_param->_size_ufpt_queue[context]; ++j) 186 reg_UPDATE_FETCH_PREDICTION_TABLE [context][j]._state = UPDATE_FETCH_PREDICTION_STATE_EMPTY; 187 reg_UFPT_BOTTOM [context] = 0; 188 reg_UFPT_TOP [context] = 0; 189 // reg_UFPT_UPDATE [context] = 0; 190 } 191 else 192 { 193 reg_UFPT_UPDATE [context] = reg_UFPT_TOP [context]; 194 195 #ifdef DEBUG_TEST 196 if (reg_EVENT_STATE [context] == EVENT_STATE_OK) 197 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid event state.")); 198 #endif 199 200 // Change state 201 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_FLUSH_UFPT (decod - miss)",context); 202 203 reg_EVENT_STATE [context] = EVENT_STATE_FLUSH_UFPT; 204 } 202 flush_UFPT [context] = true; 203 204 reg_EVENT_ADDRESS_SRC [context] = address_src; // delay_slot is compute in Context_State 205 reg_EVENT_ADDRESS_DEST_VAL[context] = last_take; 206 reg_EVENT_ADDRESS_DEST [context] = address_dest; 205 207 206 208 // Push upt (from decod interface) … … 209 211 210 212 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._condition = condition; 211 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_src = PORT_READ(in_DECOD_BTB_ADDRESS_SRC [i]);212 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]);213 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._last_take = PORT_READ(in_DECOD_BTB_LAST_TAKE [i]);213 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_src = address_src ; 214 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_dest = address_dest; 215 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._last_take = last_take ; 214 216 // reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._good_take; 215 217 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._is_accurate = is_accurate; … … 277 279 reg_UPT_TOP [context] = (upt_ptr_write+1)%_param->_size_upt_queue [context]; 278 280 // reg_UPT_UPDATE [context] = reg_UPT_TOP [context]; 279 if (need_update(condition))280 {281 reg_UPT_NB_NEED_UPDATE [context] ++;282 }283 281 } 284 282 … … 296 294 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0; 297 295 Tdepth_t depth = (_param->_have_port_depth )?PORT_READ(in_BRANCH_COMPLETE_DEPTH [i]):0; 296 Tcontrol_t miss = internal_BRANCH_COMPLETE_MISS_PREDICTION [i]; 297 Tcontrol_t good_take = internal_BRANCH_COMPLETE_TAKE [i]; 298 Taddress_t good_addr = internal_BRANCH_COMPLETE_ADDRESS_DEST [i]; 298 299 299 300 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_COMPLETE[%d] - Accepted",i); 300 301 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 301 302 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth : %d",depth); 302 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d", internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);303 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss); 303 304 304 if (internal_BRANCH_COMPLETE_MISS_PREDICTION [i])305 if (miss) 305 306 { 306 // Miss case 307 // // breakpoint("Branch_complete and miss ..."); 308 309 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * state [%d][%d] <- UPDATE_PREDICTION_STATE_EVENT (branch_complete)",context,depth); 310 // reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_EVENT; 311 312 // // Another prediction (prediction with depth higer) 313 // Tdepth_t top = reg_TOP[context];314 // uint32_t nb_elt_miss = ((top> depth)?top:(top+_param->_size_queue[context]))-depth; 315 // uint32_t nb_elt_need_update = 1; 316 // for (uint32_t j=1; j<nb_elt_miss; j++) 317 // { 318 // uint32_t k=(depth+j)%_param->_size_queue[context]; 319 320 // // Ifetch have make a prediction and it's a miss 321 // // When ifetch predict :322 // // * btb is not change -> needn't update 323 // // * direction is not change -> needn't update 324 // // * ras have change -> need update 325 326 // Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition;327 // if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or 328 // (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or 329 // (cond == BRANCH_CONDITION_READ_STACK)) 330 // { 331 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * state [%d][%d] <- UPDATE_PREDICTION_STATE_KO (branch_complete, ifetch miss, update ras)",context,k); 332 333 // nb_elt_need_update ++;334 // reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO; 335 // } 336 // else 337 // { 338 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * state [%d][%d] <- UPDATE_PREDICTION_STATE_END (branch_complete, ifetch miss, don't update ras)",context,k);339 340 // reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END; 341 // } 342 // } 343 // reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update; 344 345 // // Update pointer : 346 // reg_TOP [context] = depth; 347 // reg_NB_ELT [context] -= nb_elt_miss; 348 // reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest = internal_BRANCH_COMPLETE_ADDRESS_DEST [i];349 307 // Have a miss !!! 308 // Flush UPFT 309 flush_UFPT [context] = true; 310 311 // Flush UPT 312 uint32_t top = reg_UPT_TOP [context]; 313 uint32_t new_update = ((top==0)?_param->_size_upt_queue[context]:top)-1; 314 for (uint32_t j=(depth+1)%_param->_size_upt_queue[context]; 315 j!=top; 316 j=(j+1)%_param->_size_upt_queue[context]) 317 reg_UPDATE_PREDICTION_TABLE [context][j]._state = UPDATE_PREDICTION_STATE_EVENT; 318 319 // TOP is next write slot : last slot is TOP-1 320 reg_UPT_UPDATE [context] = new_update; 321 322 // reg_UPT_BOTTOM [context]; 323 reg_UPT_TOP [context] = depth; 324 325 #ifdef DEBUG_TEST 326 if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END) 327 throw ERRORMORPHEO(FUNCTION,_("Branch complete : invalid upt state.")); 328 #endif 329 330 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_KO (branch_complete, ifetch hit)",context,depth); 331 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_KO; 332 333 334 Taddress_t address_src = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src; 335 336 if (reg_UFPT_NB_NEED_UPDATE [context] > 0) 337 { 338 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_FLUSH_UFPT_AND_UPT (branch_complete - miss)",context); 339 reg_EVENT_STATE [context] = EVENT_STATE_FLUSH_UFPT_AND_UPT; 340 } 341 else 342 { 343 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_FLUSH_UFPT_RAS (branch_complete - miss)",context); 344 // have ras prediction ? 345 reg_EVENT_STATE [context] = (new_update!=depth)?EVENT_STATE_FLUSH_UPT_RAS:EVENT_STATE_UPDATE_CONTEXT; 346 } 347 348 reg_EVENT_ADDRESS_SRC [context] = address_src; // delay_slot is compute in Context_State 349 reg_EVENT_ADDRESS_DEST_VAL[context] = good_take; 350 reg_EVENT_ADDRESS_DEST [context] = good_addr; 350 351 } 351 352 else … … 363 364 364 365 // In all case : update good_take 365 reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take = internal_BRANCH_COMPLETE_TAKE [i];366 reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take = good_take; 366 367 } 367 368 … … 381 382 if (internal_UPDATE_FROM_UFPT [i]) 382 383 { 384 // if free a slot, also all queue is updated 385 // Last slot ? 386 if (reg_UFPT_UPDATE [context] == reg_UFPT_BOTTOM [context]) 387 switch (reg_EVENT_STATE [context]) 388 { 389 case EVENT_STATE_FLUSH_UFPT : reg_EVENT_STATE [context] = EVENT_STATE_UPDATE_CONTEXT; break; 390 case EVENT_STATE_FLUSH_UFPT_AND_UPT : reg_EVENT_STATE [context] = (reg_UPT_UPDATE[context]!=reg_UPT_TOP[context])?EVENT_STATE_FLUSH_UPT_RAS:EVENT_STATE_UPDATE_CONTEXT; break; 391 default : break; 392 } 393 383 394 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * Update Fetch Prediction Table"); 384 395 … … 393 404 reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._state = UPDATE_FETCH_PREDICTION_STATE_END; 394 405 406 395 407 // Update pointer 396 reg_UFPT_UPDATE [context] = (depth==0)?(_param->_size_ufpt_queue[context]-1):(depth-1); 397 408 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE (before) : %d",reg_UFPT_UPDATE [context]); 409 reg_UFPT_UPDATE [context] = ((depth==0)?_param->_size_ufpt_queue[context]:depth)-1; 410 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE (after ) : %d",reg_UFPT_UPDATE [context]); 398 411 // Free a register that need update ? 399 412 if (need_update(reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._condition)) … … 405 418 406 419 // Change state 407 #ifdef DEBUG_TEST 408 if ((reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_OK ) and 409 (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_KO ) and 410 (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_EVENT)) 411 throw ERRORMORPHEO(FUNCTION,_("Update : invalid upt state.")); 420 #ifdef DEBUG_TEST 421 if (internal_UPDATE_RAS [i]) 422 { 423 if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_EVENT) 424 throw ERRORMORPHEO(FUNCTION,_("Update : invalid upt state.")); 425 } 426 else 427 { 428 if ((reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_OK ) and 429 (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_KO )) 430 throw ERRORMORPHEO(FUNCTION,_("Update : invalid upt state.")); 431 } 412 432 #endif 413 433 … … 417 437 418 438 // Update pointer 439 bool end_event = (reg_UPT_UPDATE [context] == reg_UPT_TOP [context]); 440 419 441 if (internal_UPDATE_RAS [i]) 420 reg_UPT_UPDATE [context] = (depth==0)?(_param->_size_upt_queue[context]-1):(depth-1); 442 { 443 reg_UPT_UPDATE [context] = (end_event)?reg_UPT_BOTTOM[context]:(((depth==0)?_param->_size_upt_queue[context]:depth)-1); 444 } 421 445 else 422 reg_UPT_UPDATE [context] = (depth+1)%_param->_size_upt_queue[context]; 423 424 // Free a register that need update ? 425 if (need_update(reg_UPDATE_PREDICTION_TABLE [context][depth]._condition)) 426 reg_UPT_NB_NEED_UPDATE [context] --; 446 { 447 reg_UPT_UPDATE [context] = (depth+1)%_param->_size_upt_queue[context]; 448 } 449 450 // End and event ? 451 if (end_event and 452 (reg_EVENT_STATE [context] != EVENT_STATE_OK)) 453 { 454 reg_EVENT_STATE [context] = EVENT_STATE_UPDATE_CONTEXT; 455 } 456 427 457 // Free the branch with no accurate ? 428 458 if (reg_UPDATE_PREDICTION_TABLE [context][depth]._is_accurate == false) 429 reg_IS_ACCURATE [ i] = true;459 reg_IS_ACCURATE [context] = true; 430 460 } 431 461 } … … 434 464 reg_UPDATE_PRIORITY = (reg_UPDATE_PRIORITY+1)%_param->_nb_context; 435 465 436 // // =================================================================== 437 // // =====[ BRANCH_EVENT ]============================================== 438 // // =================================================================== 439 // for (uint32_t i=0; i<_param->_nb_context; i++) 440 // if (internal_BRANCH_EVENT_VAL [i] and PORT_READ(in_BRANCH_EVENT_ACK [i])) 441 // { 442 // Tdepth_t depth = internal_BRANCH_EVENT_DEPTH [i]; 443 444 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_EVENT) 445 // { 446 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * state [%d][%d] <- UPDATE_PREDICTION_STATE_KO (branch_event)",i,depth); 447 448 // reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_KO; 449 // } 450 // else 451 // { 452 // #ifdef DEBUG_TEST 453 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_WAITEND_AND_EVENT) 454 // throw ERRORMORPHEO(FUNCTION,_("Branche event : invalid state")); 455 // #endif 456 457 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * state [%d][%d] <- UPDATE_PREDICTION_STATE_WAITEND (branch_event)",i,depth); 458 459 // reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_WAITEND; 460 // } 461 // } 466 // =================================================================== 467 // =====[ BRANCH_EVENT ]============================================== 468 // =================================================================== 469 for (uint32_t i=0; i<_param->_nb_context; i++) 470 if (internal_BRANCH_EVENT_VAL [i] and PORT_READ(in_BRANCH_EVENT_ACK [i])) 471 { 472 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPDATE[%d] - Accepted",i); 473 474 #ifdef DEBUG_TEST 475 if (reg_EVENT_STATE [i] != EVENT_STATE_UPDATE_CONTEXT) 476 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid event state.")); 477 #endif 478 479 // Change state 480 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_OK (branch_event)",i); 481 482 reg_EVENT_STATE [i] = EVENT_STATE_OK; 483 } 484 485 // =================================================================== 486 // =====[ FLUSH ]===================================================== 487 // =================================================================== 488 489 for (uint32_t i=0; i<_param->_nb_context; ++i) 490 { 491 if (flush_UFPT [i]) 492 { 493 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * Flush Update Fetch Prediction Table"); 494 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",i); 495 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_NB_NEED_UPDATE : %d",reg_UFPT_NB_NEED_UPDATE [i]); 496 497 // It's to accelerate miss speculation 498 if (reg_UFPT_NB_NEED_UPDATE [i] == 0) 499 { 500 501 // No entry need prediction, flush all entry -> Reset 502 for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; ++j) 503 reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EMPTY; 504 reg_UFPT_BOTTOM [i] = 0; 505 reg_UFPT_TOP [i] = 0; 506 // reg_UFPT_UPDATE [i]; 507 } 508 else 509 { 510 for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; ++j) 511 reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EVENT; 512 513 // TOP is next write slot : last slot is TOP-1 514 uint32_t top = reg_UFPT_TOP [i]; 515 reg_UFPT_UPDATE [i] = ((top==0)?_param->_size_ufpt_queue[i]:top)-1; 516 517 // reg_UFPT_BOTTOM [i]; 518 // reg_UFPT_TOP [i]; 519 } 520 521 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE (after ) : %d",reg_UFPT_UPDATE [i]); 522 523 } 524 } 525 526 // =================================================================== 527 // =====[ PRINT ]===================================================== 528 // =================================================================== 462 529 463 530 #if (DEBUG >= DEBUG_TRACE) … … 468 535 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_IS_ACCURATE : %d",reg_IS_ACCURATE [i]); 469 536 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_STATE : %s" ,toString(reg_EVENT_STATE [i]).c_str()); 470 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_RAS_CORRUPTED : %d" ,reg_EVENT_RAS_CORRUPTED [i]);471 537 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_SRC : %.8x",reg_EVENT_ADDRESS_SRC [i]); 472 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_ SRC_VAL : %d" ,reg_EVENT_ADDRESS_SRC_VAL[i]);538 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_DEST_VAL: %d" ,reg_EVENT_ADDRESS_DEST_VAL[i]); 473 539 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_DEST : %.8x",reg_EVENT_ADDRESS_DEST [i]); 474 540 … … 476 542 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_BOTTOM : %d",reg_UFPT_BOTTOM [i]); 477 543 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_TOP : %d",reg_UFPT_TOP [i]); 544 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE : %d",reg_UFPT_UPDATE [i]); 478 545 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_NB_NEED_UPDATE : %d",reg_UFPT_NB_NEED_UPDATE [i]); 479 546 for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; j++) … … 495 562 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UPT_TOP : %d",reg_UPT_TOP [i]); 496 563 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UPT_UPDATE : %d",reg_UPT_UPDATE [i]); 497 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UPT_NB_NEED_UPDATE : %d",reg_UPT_NB_NEED_UPDATE [i]);498 564 for (uint32_t j=0; j<_param->_size_upt_queue[i]; j++) 499 565 log_printf(TRACE,Update_Prediction_Table,FUNCTION," [%d] %.4d, %.8x %.8x, %.1d %.1d %.1d, %.8d %.8x %.4d - %s", -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/SelfTest/include/test.h
r81 r94 13 13 #include <iostream> 14 14 #include <sys/time.h> 15 15 #include "Common/include/Time.h" 16 16 #include "Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/include/RegisterFile_Monolithic.h" 17 17 … … 26 26 morpheo::behavioural::generic::registerfile::registerfile_monolithic::Parameters * param); 27 27 28 class Time29 {30 private : timeval time_begin;31 // private : timeval time_end;32 33 public : Time ()34 {35 gettimeofday(&time_begin ,NULL);36 };37 38 public : ~Time ()39 {40 cout << *this;41 };42 43 public : friend ostream& operator<< (ostream& output_stream,44 const Time & x)45 {46 timeval time_end;47 48 gettimeofday(&time_end ,NULL);49 50 uint32_t nb_cycles = static_cast<uint32_t>(sc_simulation_time());51 52 double average = static_cast<double>(nb_cycles) / static_cast<double>(time_end.tv_sec-x.time_begin.tv_sec);53 54 output_stream << nb_cycles << "\t(" << average << " cycles / seconds )" << endl;55 56 return output_stream;57 }58 }; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/SelfTest/src/test.cpp
r88 r94 2 2 * $Id$ 3 3 * 4 * [ 4 * [ Description ] 5 5 * 6 6 * Test 7 7 */ 8 8 9 #define NB_ITERATION 1 610 #define CYCLE_MAX 10 24*NB_ITERATION9 #define NB_ITERATION 1 10 #define CYCLE_MAX 100000*NB_ITERATION 11 11 #include "Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/SelfTest/include/test.h" 12 12 #include "Common/include/Test.h" -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/src/RegisterFile_Monolithic_vhdl_body.cpp
r81 r94 17 17 void RegisterFile_Monolithic::vhdl_body (Vhdl * & vhdl) 18 18 { 19 vhdl->set_body ("");20 vhdl->set_ body ("-----------------------------------------------------------------------------");21 vhdl->set_ body ("--Ackitement");22 vhdl->set_ body ("-----------------------------------------------------------------------------");23 vhdl->set_body ("");19 vhdl->set_body (0,""); 20 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 21 vhdl->set_comment(0," Ackitement"); 22 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 23 vhdl->set_body (0,""); 24 24 25 25 for (uint32_t i = 0; i < _param->_nb_port_read; i++) 26 vhdl->set_body ("out_READ_"+toString(i)+"_ACK <= '1';");26 vhdl->set_body (0,"out_READ_"+toString(i)+"_ACK <= '1';"); 27 27 for (uint32_t i = 0; i < _param->_nb_port_write; i++) 28 vhdl->set_body ("out_WRITE_"+toString(i)+"_ACK <= '1';");28 vhdl->set_body (0,"out_WRITE_"+toString(i)+"_ACK <= '1';"); 29 29 for (uint32_t i = 0; i < _param->_nb_port_read_write; i++) 30 vhdl->set_body ("out_READ_WRITE_"+toString(i)+"_ACK <= '1';");30 vhdl->set_body (0,"out_READ_WRITE_"+toString(i)+"_ACK <= '1';"); 31 31 32 vhdl->set_body ("");33 vhdl->set_ body ("-----------------------------------------------------------------------------");34 vhdl->set_ body ("--Read RegisterFile");35 vhdl->set_ body ("-----------------------------------------------------------------------------");36 vhdl->set_body ("");32 vhdl->set_body (0,""); 33 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 34 vhdl->set_comment(0," Read RegisterFile"); 35 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 36 vhdl->set_body (0,""); 37 37 38 38 for (uint32_t i = 0; i < _param->_nb_port_read; i++) … … 44 44 str_address = "0"; 45 45 46 vhdl->set_body ("out_READ_"+toString(i)+"_DATA <= reg_DATA ("+str_address+") when in_READ_"+toString(i)+"_VAL = '1' else "+std_logic_others(_param->_size_word,0)+";");46 vhdl->set_body (0,"out_READ_"+toString(i)+"_DATA <= reg_DATA ("+str_address+") when in_READ_"+toString(i)+"_VAL = '1' else "+std_logic_others(_param->_size_word,0)+";"); 47 47 } 48 48 for (uint32_t i = 0; i < _param->_nb_port_read_write; i++) … … 53 53 else 54 54 str_address = "0"; 55 vhdl->set_body ("out_READ_WRITE_"+toString(i)+"_RDATA <= reg_DATA ("+str_address+") when in_READ_WRITE_"+toString(i)+"_VAL = '1' and in_READ_WRITE_"+toString(i)+"_RW = '"+toString(RW_READ)+"' else "+std_logic_others(_param->_size_word,0)+";");55 vhdl->set_body (0,"out_READ_WRITE_"+toString(i)+"_RDATA <= reg_DATA ("+str_address+") when in_READ_WRITE_"+toString(i)+"_VAL = '1' and in_READ_WRITE_"+toString(i)+"_RW = '"+toString(RW_READ)+"' else "+std_logic_others(_param->_size_word,0)+";"); 56 56 } 57 57 58 vhdl->set_body ("");59 vhdl->set_ body ("-----------------------------------------------------------------------------");60 vhdl->set_ body ("--Write RegisterFile");61 vhdl->set_ body ("-----------------------------------------------------------------------------");62 vhdl->set_body ("");58 vhdl->set_body (0,""); 59 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 60 vhdl->set_comment(0," Write RegisterFile"); 61 vhdl->set_comment(0,"---------------------------------------------------------------------------"); 62 vhdl->set_body (0,""); 63 63 64 vhdl->set_body ("RegisterFile_write: process (in_CLOCK)");65 vhdl->set_body ("begin -- process RegisterFile_write");66 vhdl->set_body ("\tif in_CLOCK'event and in_CLOCK = '1' then");64 vhdl->set_body (0,"RegisterFile_write: process (in_CLOCK)"); 65 vhdl->set_body (0,"begin -- process RegisterFile_write"); 66 vhdl->set_body (1,"if in_CLOCK'event and in_CLOCK = '1' then"); 67 67 68 68 for (uint32_t i = 0; i < _param->_nb_port_write; i++) … … 74 74 str_address = "0"; 75 75 76 vhdl->set_body ("\t\tif (in_WRITE_"+toString(i)+"_VAL = '1') then");77 vhdl->set_body ("\t\t\treg_DATA("+str_address+") <= in_WRITE_"+toString(i)+"_DATA;");78 vhdl->set_body ("\t\tend if;");76 vhdl->set_body (2,"if (in_WRITE_"+toString(i)+"_VAL = '1') then"); 77 vhdl->set_body (3,"reg_DATA("+str_address+") <= in_WRITE_"+toString(i)+"_DATA;"); 78 vhdl->set_body (2,"end if;"); 79 79 } 80 80 for (uint32_t i = 0; i < _param->_nb_port_read_write; i++) … … 86 86 str_address = "0"; 87 87 88 vhdl->set_body ("\t\tif (in_READ_WRITE_"+toString(i)+"_VAL = '1' and in_READ_WRITE_"+toString(i)+"_RW = '"+toString(RW_WRITE)+"') then");89 vhdl->set_body ("\t\t\treg_DATA("+str_address+") <= in_READ_WRITE_"+toString(i)+"_WDATA;");90 vhdl->set_body ("\t\tend if;");88 vhdl->set_body (2,"if (in_READ_WRITE_"+toString(i)+"_VAL = '1' and in_READ_WRITE_"+toString(i)+"_RW = '"+toString(RW_WRITE)+"') then"); 89 vhdl->set_body (3,"reg_DATA("+str_address+") <= in_READ_WRITE_"+toString(i)+"_WDATA;"); 90 vhdl->set_body (2,"end if;"); 91 91 } 92 92 93 vhdl->set_body ("\tend if;");94 vhdl->set_body ("end process RegisterFile_write;");93 vhdl->set_body (1,"end if;"); 94 vhdl->set_body (0,"end process RegisterFile_write;"); 95 95 }; 96 96 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/src/RegisterFile_Monolithic_vhdl_declaration.cpp
r81 r94 18 18 void RegisterFile_Monolithic::vhdl_declaration (Vhdl * & vhdl) 19 19 { 20 vhdl->set_type ("Tregfile", "array (" + toString(_param->_nb_word-1) + " downto 0)of " + std_logic(_param->_size_word));20 vhdl->set_type ("Tregfile", "array " + std_logic_range(_param->_nb_word,true) + " of " + std_logic(_param->_size_word)); 21 21 22 22 vhdl->set_signal ("reg_DATA", "Tregfile"); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Makefile.Selftest
r88 r94 41 41 declare -i all_ok=1; \ 42 42 for i in $(EXEC_LOG); do \ 43 $(GREP) -q "Timing" $$i; \ 44 declare -i test_timing=$$?; \ 43 45 $(GREP) -q "Test OK" $$i; \ 44 46 declare -i test_ok=$$?; \ 45 47 $(GREP) -q "Test KO" $$i; \ 46 48 declare -i test_ko=$$?; \ 47 $(GREP) -q "ERROR" $$i; \ 48 declare -i test_error=$$?; \ 49 if $(TEST) $$test_ko -eq 0 -o $$test_error -eq 0 -o $$test_ok -ne 0; \ 49 if $(TEST) $$test_ko -eq 0 -o $$test_ok -ne 0 -o $$test_timing -ne 0; \ 50 50 then all_ok=0; \ 51 51 fi; \ … … 168 168 export SYSTEMC=$(SYSTEMC_$(SIMULATOR)); $(EXEC_PREFIX) $(DIR_BIN)/$(EXEC).x $(EXEC_PARAMS) $* `$(CAT) $<` &> $@; \ 169 169 declare timing=`$(GREP) -h "Timing" $@`; \ 170 $(GREP) -q "Timing" $@; \ 171 declare -i test_timing=$$?; \ 170 172 $(GREP) -q "Test OK" $@; \ 171 173 declare -i test_ok=$$?; \ 172 174 $(GREP) -q "Test KO" $@; \ 173 175 declare -i test_ko=$$?; \ 174 $(GREP) -q "ERROR" $@; \ 175 declare -i test_error=$$?; \ 176 if $(TEST) $$test_ko -ne 0 -a $$test_error -ne 0 -a $$test_ok -eq 0; \ 176 if $(TEST) $$test_ko -ne 0 -a $$test_ok -eq 0 -a $$test_timing -eq 0; \ 177 177 then echo -e " $* ... OK\t$$timing";\ 178 178 else echo " $* ... KO"; \ … … 184 184 export SYSTEMC=$(SYSTEMC_$(SIMULATOR)); $(EXEC_PREFIX) $(DIR_BIN)/$(EXEC).x $(EXEC_PARAMS) $* `$(CAT) $<` &> $@; \ 185 185 declare timing=`$(GREP) -h "Timing" $@`; \ 186 $(GREP) -q "Timing" $@; \ 187 declare -i test_timing=$$?; \ 186 188 $(GREP) -q "Test OK" $@; \ 187 189 declare -i test_ok=$$?; \ 188 190 $(GREP) -q "Test KO" $@; \ 189 191 declare -i test_ko=$$?; \ 190 $(GREP) -q "ERROR" $@; \ 191 declare -i test_error=$$?; \ 192 if $(TEST) $$test_ko -ne 0 -a $$test_error -ne 0 -a $$test_ok -eq 0; \ 192 if $(TEST) $$test_ko -ne 0 -a $$test_ok -eq 0 -a $$test_timing -eq 0; \ 193 193 then $(ECHO) -e " $* ... OK\t$$timing";\ 194 194 else $(ECHO) " $* ... KO"; \ -
trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Version.h
r93 r94 10 10 #define MORPHEO_MAJOR_VERSION 0 11 11 #define MORPHEO_MINOR_VERSION 2 12 #define MORPHEO_REVISION "9 3"12 #define MORPHEO_REVISION "94" 13 13 #define MORPHEO_CODENAME "Castor" 14 14 15 #define MORPHEO_DATE_DAY "1 4"15 #define MORPHEO_DATE_DAY "15" 16 16 #define MORPHEO_DATE_MONTH "12" 17 17 #define MORPHEO_DATE_YEAR "2008" -
trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Vhdl.h
r93 r94 23 23 namespace behavioural { 24 24 25 std::string std_logic (uint32_t size);26 std::string std_logic_conv (uint32_t size, std::string value);27 std::string std_logic_conv (uint32_t size, uint32_t value);28 std::string std_logic_range (uint32_t size, uint32_t max , uint32_t min);29 std::string std_logic_range (uint32_t max , uint32_t min);30 std::string std_logic_range (uint32_t size);31 std::string std_logic_others (uint32_t size, uint32_t cst);25 std::string std_logic (uint32_t size); 26 std::string std_logic_conv (uint32_t size, std::string value); 27 std::string std_logic_conv (uint32_t size, uint32_t value); 28 std::string std_logic_range (uint32_t size, uint32_t max , uint32_t min , bool force=false); 29 std::string std_logic_range ( uint32_t max , uint32_t min , bool force=false); 30 std::string std_logic_range (uint32_t size, bool force=false); 31 std::string std_logic_others (uint32_t size, bool cst); 32 32 33 33 class Vhdl … … 125 125 private : std::string get_body (uint32_t depth ); 126 126 public : void set_body (std::string text ); 127 128 public : void set_body (Vhdl * vhdl ); 129 127 public : void set_body (uint32_t depth , 128 std::string text ); 129 130 public : void set_body (uint32_t depth , 131 Vhdl * vhdl ); 130 132 public : void set_body_component (std::string name_instance , 131 133 std::string name_component , … … 136 138 std::string name_signal , 137 139 uint32_t size_signal ); 140 141 public : void set_comment (std::string text ); 142 public : void set_comment (uint32_t depth , 143 std::string text ); 138 144 139 145 private : std::string get_library_ieee (uint32_t depth ); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Component_get_component.cpp
r81 r94 7 7 8 8 #include "Behavioural/include/Component.h" 9 #include "Common/include/Tabulation.h" 9 10 10 11 namespace morpheo { … … 25 26 bool empty = _list_component->empty(); 26 27 27 std::string tab = std::string(depth,'\t'); 28 std::string tab=morpheo::tab(depth); 29 28 30 std::ostringstream text; 29 31 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Component_test_map.cpp
r88 r94 2 2 * $Id$ 3 3 * 4 * [ 4 * [ Description ] 5 5 * 6 6 */ 7 7 8 8 #include "Behavioural/include/Component.h" 9 #include "Common/include/Tabulation.h" 9 10 10 11 namespace morpheo { … … 23 24 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 24 25 25 std::string tab = std::string(depth,' ');26 std::string tab = morpheo::tab(depth); 26 27 std::string name = _entity->get_name(); 27 28 bool test_ok = true; … … 80 81 // log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 81 82 82 // std::string tab = std::string(depth,'\t');83 // std::string tab = tab(depth); 83 84 // std::string name = _entity->get_name(); 84 85 // bool test_ok = true; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Entity_test_map.cpp
r88 r94 7 7 8 8 #include "Behavioural/include/Entity.h" 9 #include "Common/include/Tabulation.h" 9 10 #include <iostream> 10 11 … … 18 19 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 19 20 20 std::string tab = std::string(depth,' '); 21 std::string tab=morpheo::tab(depth); 22 21 23 log_printf(INFO,Interface,FUNCTION,"%s* Entity \"%s\"",tab.c_str(),_name.c_str()); 22 24 … … 41 43 // log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 42 44 43 // std::string tab = std::string(depth,'\t');45 // std::string tab = tab(depth); 44 46 // log_printf(INFO,Behavioural,FUNCTION, "%s* Entity \"%s\"",tab.c_str(),_name.c_str()); 45 47 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interface_fifo_testbench_assert.cpp
r88 r94 39 39 ++i; 40 40 } 41 42 vhdl->set_body("");43 41 } 44 42 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interface_get_signal.cpp
r81 r94 7 7 8 8 #include "Behavioural/include/Interface.h" 9 9 #include "Common/include/Tabulation.h" 10 10 11 11 namespace morpheo { … … 24 24 bool empty = _list_signal->empty(); 25 25 26 std::string tab = std::string(depth,'\t');26 std::string tab = morpheo::tab(depth); 27 27 std::ostringstream text; 28 28 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interface_test_map.cpp
r88 r94 7 7 8 8 #include "Behavioural/include/Interface.h" 9 9 #include "Common/include/Tabulation.h" 10 10 11 11 namespace morpheo { … … 18 18 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 19 19 20 std::string tab = std::string(depth,' ');20 std::string tab = morpheo::tab(depth); 21 21 bool _return = true; 22 22 … … 39 39 // log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 40 40 41 // std::string tab = std::string(depth,'\t');41 // std::string tab = tab(depth); 42 42 // bool _return = true; 43 43 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interfaces_get_interface.cpp
r81 r94 7 7 8 8 #include "Behavioural/include/Interfaces.h" 9 9 #include "Common/include/Tabulation.h" 10 10 11 11 namespace morpheo { … … 25 25 bool empty = _list_interface->empty(); 26 26 27 std::string tab = std::string(depth,'\t');27 std::string tab = morpheo::tab(depth); 28 28 std::ostringstream text; 29 29 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interfaces_test_map.cpp
r88 r94 7 7 8 8 #include "Behavioural/include/Interfaces.h" 9 9 #include "Common/include/Tabulation.h" 10 10 11 11 namespace morpheo { … … 18 18 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 19 19 20 std::string tab = std::string(depth,' ');20 std::string tab = morpheo::tab(depth); 21 21 22 22 bool _return = true; … … 40 40 // log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 41 41 42 // std::string tab = std::string(depth,'\t');42 // std::string tab = tab(depth); 43 43 44 44 // bool _return = true; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Interfaces_testbench_generate_file.cpp
r88 r94 99 99 (*it)->testbench_assert (vhdl_assert,counter); 100 100 101 vhdl->set_body( vhdl_assert);101 vhdl->set_body(3,vhdl_assert); 102 102 103 103 delete vhdl_assert; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Signal_test_map.cpp
r88 r94 7 7 8 8 #include "Behavioural/include/Signal.h" 9 9 #include "Common/include/Tabulation.h" 10 10 11 11 namespace morpheo { … … 19 19 20 20 std::string str = ""; 21 std::string tab = std::string(depth,' ');21 std::string tab = morpheo::tab(depth); 22 22 bool _return = true; 23 23 … … 166 166 167 167 // std::string str = ""; 168 // std::string tab = std::string(depth,'\t');168 // std::string tab = tab(depth); 169 169 // bool _return = true; 170 170 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Stat_binary_tree_valid.cpp
r88 r94 29 29 } 30 30 31 void Stat_binary_tree::print (uint32_t depth)32 {33 std::string tab = std::string(depth,'\t');34 std::string sep = " ";35 if (_data_type == NONE)36 {37 std::cout << tab << "<node> NONE (error)" << std::endl;38 39 if (_left != NULL)40 _left ->print(depth+1);41 if (_right != NULL)42 _right->print(depth+1);43 }44 45 if ((_data_type == VARIABLE) or46 (_data_type == CONSTANT))47 {48 std::cout << tab << "<leaf>"49 << " "50 << ((_left == NULL)?"left == NULL ":"left != NULL (error)")51 << " "52 << ((_right == NULL)?"right == NULL ":"right != NULL (error)")53 << std::endl;54 55 if (_left != NULL)56 _left ->print(depth+1);57 if (_right != NULL)58 _right->print(depth+1);59 }60 61 if (_data_type == OPERATOR_UNARY)62 {63 std::cout << tab << "<unary>"64 << " "65 << ((_left == NULL)?"left == NULL (error)":"left != NULL ")66 << " "67 << ((_right == NULL)?"right == NULL ":"right != NULL (error)")68 << std::endl;69 70 if (_left != NULL)71 _left ->print(depth+1);72 if (_right != NULL)73 _right->print(depth+1);74 }75 76 if (_data_type == OPERATOR_BINARY)77 {78 std::cout << tab << "<binary>"79 << " "80 << ((_left == NULL)?"left == NULL (error)":"left != NULL ")81 << " "82 << ((_right == NULL)?"right == NULL (error)":"right != NULL ")83 << std::endl;84 85 if (_left != NULL)86 _left ->print(depth+1);87 if (_right != NULL)88 _right->print(depth+1);89 }90 }91 92 31 }; 93 32 }; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_architecture.cpp
r81 r94 4 4 * $Id$ 5 5 * 6 * [ 6 * [ Description ] 7 7 * 8 8 */ 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 #include "Common/include/Tabulation.h" 11 12 12 13 #include <sstream> … … 23 24 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 24 25 25 std::string tab = std::string(depth,'\t');26 std::string tab = morpheo::tab(depth); 26 27 std::ostringstream text; 27 28 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_component.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 #include "Common/include/Tabulation.h" 11 12 12 13 #include <sstream> … … 22 23 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 23 24 24 std::string tab = std::string(depth,'\t');25 std::string tab = morpheo::tab(depth); 25 26 std::ostringstream text; 26 27 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_entity.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 #include "Common/include/Tabulation.h" 11 12 12 13 #include <sstream> … … 22 23 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 23 24 24 std::string tab = std::string(depth,'\t');25 std::string tab = morpheo::tab(depth); 25 26 std::ostringstream text; 26 27 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_header.cpp
r88 r94 23 23 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 24 24 25 std::string tab = std::string(depth,'\t');26 25 std::string text; 27 26 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_library_ieee.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 #include "Common/include/Tabulation.h" 11 12 12 13 #include <sstream> … … 21 22 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 22 23 23 std::string tab = std::string(depth,'\t');24 std::string tab = morpheo::tab(depth); 24 25 std::ostringstream text; 25 26 26 text << tab << std::endl27 << tab << "library ieee;" << std::endl28 << tab << " use ieee.numeric_bit.all;"<< std::endl29 << tab << " use ieee.numeric_std.all;"<< std::endl30 << tab << " use ieee.std_logic_1164.all;"<< std::endl31 << tab << " use ieee.std_logic_arith.all;"<< std::endl32 << tab << " use ieee.std_logic_misc.all;"<< std::endl33 << tab << "--use ieee.std_logic_signed.all; " << std::endl34 << tab << " use ieee.std_logic_unsigned.all;" << std::endl35 << tab << "--use ieee.std_logic_textio.all; " << std::endl;27 text << tab << std::endl 28 << tab << "library ieee;" << std::endl 29 << tab << " use ieee.numeric_bit.all; " << std::endl 30 << tab << " use ieee.numeric_std.all; " << std::endl 31 << tab << " use ieee.std_logic_1164.all; " << std::endl 32 << tab << " use ieee.std_logic_arith.all; " << std::endl 33 << tab << " use ieee.std_logic_misc.all; " << std::endl 34 << tab << "--use ieee.std_logic_signed.all; " << std::endl 35 << tab << " use ieee.std_logic_unsigned.all;" << std::endl 36 << tab << "--use ieee.std_logic_textio.all; " << std::endl; 36 37 37 38 log_printf(FUNC,Behavioural,FUNCTION,"End"); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_library_work.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 11 #include "Common/include/Tabulation.h" 12 12 #include <sstream> 13 13 … … 22 22 23 23 std::list<std::string>::iterator i = _list_library_work.begin(); 24 std::string tab = std::string(depth,'\t');24 std::string tab = morpheo::tab(depth); 25 25 std::ostringstream text; 26 26 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_model.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 11 #include "Common/include/Tabulation.h" 12 12 #include <sstream> 13 13 … … 22 22 log_printf(FUNC,Behavioural,"get_model","Begin"); 23 23 24 std::string tab = std::string(depth,'\t');24 std::string tab = morpheo::tab(depth); 25 25 std::ostringstream text; 26 26 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_get_package.cpp
r81 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 11 #include "Common/include/Tabulation.h" 12 12 #include <sstream> 13 13 … … 24 24 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 25 25 26 std::string tab = std::string(depth,'\t');26 std::string tab = morpheo::tab(depth); 27 27 std::ostringstream text; 28 28 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_set_body.cpp
r88 r94 9 9 10 10 #include "Behavioural/include/Vhdl.h" 11 11 #include "Common/include/Tabulation.h" 12 12 #include <sstream> 13 13 … … 20 20 { 21 21 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 22 set_list(_list_body, text); 22 set_body(0, text); 23 log_printf(FUNC,Behavioural,FUNCTION,"End"); 24 }; 25 26 #undef FUNCTION 27 #define FUNCTION "Vhdl::set_body" 28 void Vhdl::set_body (uint32_t depth, 29 std::string text) 30 { 31 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 32 set_list(_list_body, morpheo::tab(depth)+text); 23 33 log_printf(FUNC,Behavioural,FUNCTION,"End"); 24 34 }; … … 26 36 #undef FUNCTION 27 37 #define FUNCTION "Vhdl::set_body" 28 void Vhdl::set_body (Vhdl * vhdl) 38 void Vhdl::set_body (uint32_t depth, 39 Vhdl * vhdl) 29 40 { 30 41 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 31 42 43 std::string tab=morpheo::tab(depth); 44 32 45 for (std::list<std::string>::iterator it=vhdl->_list_body.begin(); 33 46 it!=vhdl->_list_body.end(); 34 47 ++it) 35 set_list(_list_body, 48 set_list(_list_body,tab+*it); 36 49 37 50 log_printf(FUNC,Behavioural,FUNCTION,"End"); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Vhdl_std_logic.cpp
r81 r94 61 61 #undef FUNCTION 62 62 #define FUNCTION "Vhdl::std_logic_range" 63 std::string std_logic_range (uint32_t size, uint32_t max, uint32_t min )63 std::string std_logic_range (uint32_t size, uint32_t max, uint32_t min, bool force) 64 64 { 65 65 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 66 66 std::string type; 67 67 68 if (size < 2) 69 type = ""; 68 if (force) 69 { 70 type = "("+toString(max)+" downto "+toString(min)+")"; 71 } 70 72 else 71 if (max == min) 72 type = "("+toString(max)+")"; 73 else 74 type = "("+toString(max)+" downto "+toString(min)+")"; 73 { 74 if (max == min) 75 { 76 type = "("+toString(max)+")"; 77 } 78 else 79 { 80 if (size < 2) 81 type = ""; 82 else 83 type = "("+toString(max)+" downto "+toString(min)+")"; 84 } 85 } 75 86 76 87 log_printf(FUNC,Behavioural,FUNCTION,"End"); … … 79 90 }; 80 91 81 std::string std_logic_range (uint32_t max, uint32_t min )92 std::string std_logic_range (uint32_t max, uint32_t min, bool force) 82 93 { 83 94 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 84 95 std::string type; 85 96 86 if (max == 0) 87 type = ""; 97 if (force) 98 { 99 type = "("+toString(max)+" downto "+toString(min)+")"; 100 } 88 101 else 89 if (max == min) 90 type = "("+toString(max)+")"; 91 else 92 type = "("+toString(max)+" downto "+toString(min)+")"; 102 { 103 if (max == min) 104 { 105 type = "("+toString(max)+")"; 106 } 107 else 108 { 109 if (max == 0) 110 type = ""; 111 else 112 type = "("+toString(max)+" downto "+toString(min)+")"; 113 } 114 } 93 115 94 116 log_printf(FUNC,Behavioural,FUNCTION,"End"); … … 97 119 }; 98 120 99 std::string std_logic_range (uint32_t size )121 std::string std_logic_range (uint32_t size, bool force) 100 122 { 101 123 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 102 std::string _return = std_logic_range(size-1,0 );124 std::string _return = std_logic_range(size-1,0,force); 103 125 log_printf(FUNC,Behavioural,FUNCTION,"End"); 104 126 … … 108 130 #undef FUNCTION 109 131 #define FUNCTION "Vhdl::std_logic_others" 110 std::string std_logic_others (uint32_t size, uint32_tcst )132 std::string std_logic_others (uint32_t size, bool cst ) 111 133 { 112 134 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); … … 124 146 } 125 147 126 127 128 148 }; // end namespace behavioural 129 149 }; // end namespace morpheo -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/XML_get_body.cpp
r88 r94 7 7 8 8 #include "Behavioural/include/XML.h" 9 #include "Common/include/Tabulation.h" 9 10 10 11 namespace morpheo { -
trunk/IPs/systemC/processor/Morpheo/Behavioural/src/XML_indent.cpp
r81 r94 7 7 8 8 #include "Behavioural/include/XML.h" 9 #include "Common/include/Tabulation.h" 9 10 10 11 namespace morpheo { … … 16 17 { 17 18 log_printf(FUNC,Behavioural,FUNCTION,"Begin"); 18 std::string _return = std::string(depth,'\t');19 std::string _return = tab(depth); 19 20 log_printf(FUNC,Behavioural,FUNCTION,"End"); 20 21
Note: See TracChangeset
for help on using the changeset viewer.