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

📄 rf.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		            ErrorEPC=pc_address_dp;
		            EPC=pc_address_dp;
		            CPR[30]=pc_address_dp;
		            CPR[14]=pc_address_dp;
		 }
	}else if(instruction_type_dp==16){
//	cp0 instrction
        //printf("cp0 instrction\n");
        if((cp0_instr_num_dp>=0)&&(cp0_instr_num_dp<16)){
		   	switch(cp0_instr_num_dp)
				{case  0 : //printf(" mfc0 \n");
				    if((rd==16)&&(sel==1)){
				    	opa_dp=(result_regnum_ep==432)? result_first_ep : ((result_regnum_mp==432)? result_first_mp : ((result_regnum_wp==432)? result_first_wp : CPR[32]));
				    	//opa_dp=CPR[32];
				    }else if((rd==28)&&(sel==1)){
					opa_dp=(result_regnum_ep==433)? result_first_ep : ((result_regnum_mp==433)? result_first_mp : ((result_regnum_wp==433)? result_first_wp : CPR[33]));
					//opa_dp=CPR[33];
				    }else{
				         opa_dp=(result_regnum_ep==(400+rd))? result_first_ep : ((result_regnum_mp==(400+rd))? result_first_mp : ((result_regnum_wp==(400+rd))? result_first_wp : CPR[rd]));
		                  // opa_dp=CPR[rd];
				}
					       opb_dp=0;
					       result_regnum_dp=rt;
					       write_trace_flag_dp=1; 
					       jump_flag=0;
					       branch_address_offset_dp=0;
					       jump_address=0;
					       load_store_flag_dp=0;
					       load_store_byte_select_dp=0x000f;
			               break;
		         case  4 : //printf(" mtc0 \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]));
		                  // opa_dp=GPR[rd];
					       opb_dp=sel;
				if((rd==16)&&(sel==1)){
				    	 result_regnum_dp=432;
				}else if((rd==28)&&(sel==1)){
					 result_regnum_dp=433;
				}else{
		                  result_regnum_dp=rd+400;
				}
					       write_trace_flag_dp=1; 
					       jump_flag=0;
					       branch_address_offset_dp=0;
					       jump_address=0;
					       load_store_flag_dp=0;
					       load_store_byte_select_dp=0x000f;
					       break;
		         default : printf("cp0 (normal) instruction error!\n");
		                   exception_flag_dp=18;
		            ErrorEPC=pc_address_dp;
		            EPC=pc_address_dp;
		            CPR[30]=pc_address_dp;
		            CPR[14]=pc_address_dp;
		 }
		}else if((cp0_instr_num_dp>=16)&&(cp0_instr_num_dp<32)){
		   	switch(cp0_co_instr_num_dp)
			{case  1 : //printf(" tlbr \n"); 
			              //   opa_dp=(result_regnum_ep==400)? result_first_ep : ((result_regnum_mp==400)? result_first_mp : ((result_regnum_wp==400)? result_first_wp : CPR[0]));
		                         opa_dp=0;
					 opb_dp=0;
					 result_regnum_dp=500;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=offset;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=5;
					 dp_stop=5;
			           break;
		         case  2 : //printf(" tlbwi \n");
		                         opa_dp=0;
					 opb_dp=0;
					 result_regnum_dp=500;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=offset;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=5;
					 dp_stop=5;
		                   break;
		         case  6 : //printf(" tlbwr \n");
		                         opa_dp=0;
					 opb_dp=0;
					 result_regnum_dp=500;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=offset;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=5;
					 dp_stop=5;
		                   break;
		         case  8 : //printf(" tlbp \n");
		                        // opa_dp=(result_regnum_ep==410)? result_first_ep : ((result_regnum_mp==410)? result_first_mp : ((result_regnum_wp==410)? result_first_wp : CPR[10]));
		                         opa_dp=0;
					 opb_dp=0;
					 result_regnum_dp=500;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=offset;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=5;
					 dp_stop=5;
		                   break;
		         case  24 : //printf(" eret \n"); 
		                         opa_dp=0;
					 opb_dp=0;
					 result_regnum_dp=0;
					 write_trace_flag_dp=0; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 exception_flag_dp=31;
					 load_store_byte_select_dp=0x0000;
					 ip_stop=0;
					 dp_stop=0;
		                   break;
		         case  31 : //printf(" deret \n"); 
		                   break;
		         case  32 : //printf(" wait \n");
		                     break;
		         default : printf("regimm instruction error!\n");
		                   exception_flag_dp=18;
		            ErrorEPC=pc_address_dp;
		            EPC=pc_address_dp;
		            CPR[30]=pc_address_dp;
		            CPR[14]=pc_address_dp;
			}		
		}else{
		    printf("cp0 instruction error!\n");
		}

	}else if(instruction_type_dp==28){
//	special2 instrction
	    //printf("special2 instrction\n");
				 switch(special2_instr_num_dp)
		 {case  0 : //printf(" madd \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=300;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=1;
					 dp_stop=1;
				    break;
		  case  1 : //printf(" maddu \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=300;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=1;
					 dp_stop=1;
			        break;
		  case  2 : //printf(" mul \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=rd;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=1;
					 dp_stop=1;
			        break;
		  case  4 : //printf(" msub \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=300;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=1;
					 dp_stop=1;
			        break;
		  case  5 : //printf(" msubu \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=300;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 ip_stop=1;
					 dp_stop=1;
			        break;
		  case  32 : //printf(" clz \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=0;
					 result_regnum_dp=rd;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
			         break;
		  case  33 : //printf(" clo \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=0;
					 result_regnum_dp=rd;
					 write_trace_flag_dp=1; 
					 jump_flag=0;
					 branch_address_offset_dp=0;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
			         break;
		  case  63 : //printf(" sdbbp \n"); break;      //目前不需要处理
		  default : printf("special2 instruction error!\n");
		            exception_flag_dp=18;
		            ErrorEPC=pc_address_dp;
		            EPC=pc_address_dp;
		            CPR[30]=pc_address_dp;
		            CPR[14]=pc_address_dp;
		 }
	}else{
//	normal instrction
	    //printf("normal instrction\n");
		switch(normal_instr_num_dp)
		{ case  2 : //printf(" j  \n");
		             opa_dp=target;
					 opb_dp=0;
					 result_regnum_dp=0;
					 write_trace_flag_dp=0; 
					 jump_flag=1;
					 branch_address_offset_dp=0;
					 jump_address=((pc_address_dp&(0xf0000000))|((opa_dp<<2)&(0x0fffffff)));
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x0000;
					 #ifdef DEBUG
					// printf("j instruction target=%08x,jump_address=%08x\n",target,jump_address);
		                         #endif
		            break;
		  case  3 : //printf(" jal  \n");
		             opa_dp=target;
					 opb_dp=0;
					 result_regnum_dp=31;
					 write_trace_flag_dp=1; 
					 jump_flag=1;
					 branch_address_offset_dp=0;
					 jump_address=((pc_address_dp&(0xf0000000))|((opa_dp<<2)&(0x0fffffff)));
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x000f;
					 #ifdef DEBUG
					// printf("j instruction target=%08x,jump_address=%08x\n",target,jump_address);
			                 #endif
			        break;
		  case  4 : //printf(" beq  \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=0;
					 write_trace_flag_dp=0; 
					 jump_flag=0;
					 branch_address_offset_dp=offset;
					 jump_address=0;
					 load_store_flag_dp=0;
					 load_store_byte_select_dp=0x0000;
					 #ifdef DEBUG
					 printf("result_first_ep=,%08x,result_first_mp=,%08x,result_first_wp=,%08x,GPR[rs]=%08x",result_first_ep,result_first_mp,result_first_wp,GPR[rs]);
			                 printf("result_regnum_ep=,%08x,result_regnum_mp=,%08x,result_regnum_wp=,%08x,GPR[rt]=%08x",result_regnum_ep,result_regnum_mp,result_regnum_wp,GPR[rt]);
			                 #endif
			        break;
		  case  5 : //printf(" bne  \n");
		             opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
					 opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
					 result_regnum_dp=0;
					 write_trace_flag_dp=0; 
					 jump_flag=0;

⌨️ 快捷键说明

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