⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rf.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <stdio.h>
#include "cpu.h"
extern      FILE *lf_fp_code,*reg_trace_fp,*pc_trace_fp,*sysad_trace_fp;

void write_back(){
/////////////////////////////Write Back//////////////////////////
       void  cp0_reg_write_bach(int cp0_reg_num,long cp0_reg_value);
//   if(pc_wp >= 0){
//           fprintf(pc_trace_fp,"0x%08x\t0x%08x\n",0xbfc00000+pc_wp*4,pc_address_wp);			
//}

//if((pc_wp >= 0) && (nullify_flag_wp == 0) && (exception_invalid_instr_flag != 1)){
//
//                    fprintf(pc_trace_fp,"0x%08x\t0x%08x\n",0xbfc00000+pc_wp*4,pc_address_wp);			
//
//}
   if((pc_wp >= 0) && (nullify_flag_wp == 0)){
           fprintf(pc_trace_fp,"0x%08x\n",pc_address_wp);			
       }


if((exception_invalid_instr_flag == 0)||(exception_invalid_instr_flag == 5)){
	
	if(exception_invalid_instr_flag == 5){
		exception_invalid_instr_flag=exception_invalid_instr_flag - 1;
		}
	
       if(load_store_flag_wp && (nullify_flag_op == 0)){
       	
       	      if(normal_instr_num_wp == 47){
       	      	   //cache instruction
       		           switch(opb_wp)
        		           {case 0 : icache(opa_wp,2);
        		                     #ifdef DEBUG
        		                     printf("icache instruction\n");
        		                     #endif
        		                     break;
        		            case 1 :dcache(opa_wp,0,0,2);
        		                     #ifdef DEBUG
        		                     printf("dcache instruction\n");
        		                     #endif
        		                     break;
        		            case 16 :icache(opa_wp,3);
        		                     #ifdef DEBUG
        		                     printf("icache instruction\n");
        		                     #endif
        		                     break;
        		            case 17 :dcache(opa_wp,0,0,3);
        		                     #ifdef DEBUG
        		                     printf("dcache instruction\n");
        		                     #endif
        		                     break;
        		            default: printf("Find unexist cache function!\n");	
        		           }
       	 	  }
       }

                if(write_trace_flag_wp && (nullify_flag_op == 0)){
                	printf("write back!\n");
                	              if((result_regnum_wp>=0)&&(result_regnum_wp<32)&&(result_regnum_wp!=0)){
					//printf("write back!!!!!!!!!!!!!!!!!!!!!!!!!\n");
              	                            switch(load_store_byte_select_wp){
              	                            	  case 1:result_first_wp=(result_first_wp>>24)&(0x000000ff);
              	                            	         GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xffffff00))|(result_first_wp);
              	                            	          break;
              	                            	  case 3:result_first_wp=(result_first_wp>>16)&(0x0000ffff);
              	                            	         GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xffff0000))|(result_first_wp);
              	                            	         break;
              	                            	  case 7:result_first_wp=(result_first_wp>>8)&(0x00ffffff);
              	                            	         GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xff000000))|(result_first_wp);
              	                            	         break;
              	                            	  case 8:result_first_wp=(result_first_wp<<24)&(0xff000000);
              	                            	         GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x00ffffff))|(result_first_wp);
              	                            	         break;
              	                            	  case 12:result_first_wp=(result_first_wp<<16)&(0xffff0000);
              	                            	          GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x0000ffff))|(result_first_wp);
              	                            	         break;
              	                            	  case 14:result_first_wp=(result_first_wp<<8)&(0xffffff00);
              	                            	         GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x000000ff))|(result_first_wp);
              	                            	         break;
              	                            	  case 15:GPR[result_regnum_wp]=result_first_wp;
              	                            	          break;
              	                            	         default: printf("write back to register error!\n");
              	                            	  }
              	                          
              	                          //GPR[result_regnum_wp]=result_first_wp;
					//fprintf(reg_trace_fp,"write back one time!\n");
					 printf("0x%08x\t%08x\t0x%08x\t0x%08x\n",pc_address_op,instruction_op,result_regnum_wp,GPR[result_regnum_wp]);
              	                          fprintf(reg_trace_fp,"0x%08x\t%08x\t0x%08x\t0x%08x\n",pc_address_op,instruction_op,result_regnum_wp,GPR[result_regnum_wp]);
              	                         // fprintf(pc_trace_fp,"0x%x\t0x%x\n",0xbfc00000+pc_wp*4,pc_address_wp);
                                        }else if(result_regnum_wp==100){
        	                           HI=result_first_wp;
                                        }else if(result_regnum_wp==200){
        	                           LO=result_first_wp;
                                        }else if(result_regnum_wp==300){
        	                          HI=result_first_wp;
        	                          LO=result_second_wp;
                                        }else if(((result_regnum_wp>=400)&&(result_regnum_wp<434))){
                                              // CPR[result_regnum_wp-400]=result_first_wp;
                                                //write back to cp0  register in cp0 module
                                                 cp0_reg_write_bach(result_regnum_wp,result_first_wp);

                                        }else if(result_regnum_wp==500){
                                        	switch(cp0_co_instr_num_wp)
                                        	{case 1:Index=CPR[0];
                                        	        mmu(1);    //tlbr
                                        	        CPR[10]=Entryhi;
                                        	        CPR[2]=Entrylo0;
                                        	        CPR[3]=Entrylo1;
                                        	        CPR[5]=Pagemask;
                                        	        break;
                                        	 case 2: printf("cpr[10]=%08x\n",CPR[10]);
                                        	         Entryhi=CPR[10];
                                        	         Entrylo0=CPR[2];
                                        	         Entrylo1=CPR[3];
                                        	         Index=CPR[0];
                                        	         Random=CPR[1];
                                        	         mmu(2);  //tlbwi 
                                        	       break;
                                        	 case 6: Entryhi=CPR[10];
                                        	         Entrylo0=CPR[2];
                                        	         Entrylo1=CPR[3];
                                        	         Index=CPR[0];
                                        	         Random=CPR[1];
                                        	         mmu(6);  //tlbwr 
                                        	        break;
                                        	 case 8: Entryhi=CPR[10];
                                        	         mmu(8);   //tlbp
                                        	         CPR[0]=Index;
                                        	        break;
                                        	 case 24:printf("eret instruction!\n");
                                        	        break;
                                        	 default:printf("tlb instruction error in write back!\n");
                                        		}
                                        }else{
                                           #ifdef DEBUG
                                           printf("result_regnum_wp=%d   \n",result_regnum_wp);
                                           #endif
                                           printf("error! Write Back occur errors ");
                                        }
                                write_trace_flag_wp=0;
                	           }
    /*              if(load_store_flag_ep){
                  //	printf("*********************************************************\n");
                  	fprintf(sysad_trace_fp,"0x%x\t0x%08x\t0x%08x\n",pc_address_ep,opa_ep,opb_ep);
				  }*/
	
}else{
   
   exception_invalid_instr_flag=exception_invalid_instr_flag-1;

}

//////////////////////////////////end///////////////////////////////	
	}




void decode_pre(){
/////////////////////////////////////Decode pre//////////////////////////////////////////
              opa_wp=opa_mp;
              opb_wp=opb_mp;
              opa_mp=opa_ep;
              opb_mp=opb_ep;
               opa_ep=opa_dp;
		opb_ep=opb_dp;
		load_store_flag_wp=load_store_flag_mp;
		load_store_flag_mp=load_store_flag_ep;
		load_store_flag_ep=load_store_flag_dp;
	       result_regnum_wp=result_regnum_mp;
	       result_regnum_mp=result_regnum_ep;
	       result_regnum_ep=result_regnum_dp;
		write_trace_flag_wp=write_trace_flag_mp;
		write_trace_flag_mp=write_trace_flag_ep;
		write_trace_flag_ep=write_trace_flag_dp;
	    instruction_type_ep=instruction_type_dp;
	    normal_instr_num_wp=normal_instr_num_mp;
	       normal_instr_num_mp=normal_instr_num_ep;
		normal_instr_num_ep=normal_instr_num_dp;
		special_instr_num_ep=special_instr_num_dp;
		special2_instr_num_ep=special2_instr_num_dp;
		cp0_co_instr_num_wp=cp0_co_instr_num_mp;
		cp0_co_instr_num_mp=cp0_co_instr_num_ep;
		cp0_co_instr_num_ep=cp0_co_instr_num_dp;
		regimm_instr_num_ep=regimm_instr_num_dp;
		cp0_instr_num_ep=cp0_instr_num_dp;
		
		load_store_byte_select_wp=load_store_byte_select_mp;
		load_store_byte_select_mp=load_store_byte_select_ep;
		load_store_byte_select_ep=load_store_byte_select_dp;

	        // nullify_flag_ep=nullify_flag_ep;
	  branch_address_offset_ep=branch_address_offset_dp;
/////////////////////////////////////////////////////////////////////////////////////////
	
	}



void instruction_decode(){
		
////////////////////////////Decode instruction////////////////////		
    opcode=((instruction_dp>>26)&(0x0000003f));
    special_opcode=((instruction_dp)&(0x0000003f));
    special2_opcode=((instruction_dp)&(0x0000003f));
    cp0_co_opcode=((instruction_dp)&(0x0000003f));
    
    regimm_opcode=((instruction_dp>>16)&(0x0000001f));
    cp0_opcode=((instruction_dp>>21)&(0x0000001f));
    rt_opcode=((instruction_dp>>16)&(0x0000001f));
    rs_opcode=((instruction_dp>>21)&(0x0000001f));
    rd_opcode=((instruction_dp>>11)&(0x0000001f));
    sa_opcode=((instruction_dp>>6)&(0x0000001f));
    base_opcode=((instruction_dp>>21)&(0x0000001f));
    op_opcode=((instruction_dp>>16)&(0x0000001f));
    immediate_opcode=(((instruction_dp>>15)&(0x00000001)) == 1)? (long)(instruction_dp|(0xffff0000))  : (instruction_dp)&(0x0000ffff);
    offset_opcode=(((instruction_dp>>15)&(0x00000001)) == 1)? (long)(instruction_dp|(0xffff0000))  : (instruction_dp)&(0x0000ffff);
    target_opcode=(instruction_dp)&(0x03ffffff);
    sel_opcode=instruction_dp&(0x00000003);
/*    for(i=0;i<6;i++){
	    opcode[i]=instruction_dp[i];
	    special_opcode[i]=instruction_dp[i+26];
    	special2_opcode[i]=instruction_dp[i+26];
    	cp0_co_opcode[i]=instruction_dp[i+26];
	}
	for(i=0;i<5;i++){
    	regimm_opcode[i]=instruction_dp[i+11];
	    cp0_opcode[i]=instruction_dp[i+6];
	    rt_opcode[i]=instruction_dp[i+11];
		rs_opcode[i]=instruction_dp[i+6];
		rd_opcode[i]=instruction_dp[i+16];
		sa_opcode[i]=instruction_dp[i+21];
		base_opcode[i]=instruction_dp[i+6];
	}
	for(i=0;i<16;i++){
		immediate_opcode[i]=instruction_dp[i+16];
		offset_opcode[i]=instruction_dp[i+16];
	}
	for(i=0;i<26;i++){
		target_opcode[i]=instruction_dp[i+6];
	}

	for(i=0;i<3;i++){
		sel_opcode[i]=instruction_dp[i+29];
	}*/
	    sel=sel_opcode;
    	    rt=rt_opcode;
		rs=rs_opcode;
		rd=rd_opcode;
		sa=sa_opcode;
		base=base_opcode;
		op=op_opcode;
		immediate=immediate_opcode;
		offset=offset_opcode;
		target=target_opcode;
		instruction_type_dp=opcode;
		normal_instr_num_dp=opcode;
		special_instr_num_dp=special_opcode;
		special2_instr_num_dp=special2_opcode;
		cp0_co_instr_num_dp=cp0_co_opcode;
		regimm_instr_num_dp=regimm_opcode;
		cp0_instr_num_dp=cp0_opcode;
		
/*	    sel=change_nbit(sel_opcode,3);
    	rt=change_nbit(rt_opcode,5);
		rs=change_nbit(rs_opcode,5);
		rd=change_nbit(rd_opcode,5);
		sa=change_nbit(sa_opcode,5);
		base=change_nbit(base_opcode,5);
		immediate=change_signed_nbit(immediate_opcode,16);
		offset=change_signed_nbit(offset_opcode,16);
		target=change_nbit(target_opcode,26);
		instruction_type_dp=change_nbit(opcode,6);
		normal_instr_num_dp=change_nbit(opcode,6);
		special_instr_num_dp=change_nbit(special_opcode,6);
		special2_instr_num_dp=change_nbit(special2_opcode,6);
		cp0_co_instr_num_dp=change_nbit(cp0_co_opcode,6);
		regimm_instr_num_dp=change_nbit(regimm_opcode,5);
		cp0_instr_num_dp=change_nbit(cp0_opcode,5);*/
//   	    printf("rt=%d, rs=%d, rd=%d, sa=%d\n", rt,rs,rd,sa);
//		printf("immediate=%d, offset=%d, target=%d, sa=%d,sel=%d\n", immediate,offset,target,sa,sel);


		
		if(instruction_type_dp==0){
//	special instrction
		//printf("special instrction\n");
		 switch(special_instr_num_dp)
		 {case  0 : //printf(" sll \n");
		            opa_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					opb_dp=sa;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -