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

📄 control_unit.h

📁 SystemC 实现 MIPS 处理器 源代码
💻 H
字号:
#ifndef CONTROL_UNIT_H
#define CONTROL_UNIT_H

#include "STDAFX.h"


SC_MODULE(Control_Unit)
{
	//三个周期的指令输入
	sc_in<sc_uint<32> > CON_ID_instr_in,CON_EXE_instr_in,CON_MEM_instr_in;

	//寄存器提取值是否相同,用来进行branch的比较
	sc_in<bool> CON_isEqual;

	//决定是否跳转
	sc_out<bool> CON_Branch;
	
	//决定跳转地址
	sc_out<bool> CON_Branch_address;

	//输出指令
	sc_out<sc_uint<32> > CON_instr_out;

	//Forward控制
	sc_out<sc_uint<2> > CON_ForwardA,CON_ForwardB;

	//决定是否用符号位扩展立即数
	sc_out<bool> CON_isSE;

	//是否Delay
	sc_out<bool> CON_isDelay;

	//纪录内存指令的出现次数
	int read_times,write_times;

	void action()
	{
		unsigned int op=CON_ID_instr_in.read().range(31,26).to_uint();
		CON_Branch_address.write(0);
		CON_Branch.write(false);
		CON_isSE.write(true);

		switch(op)
		{
			//beq
			case 4:
				if (CON_isEqual.read()==true) CON_Branch.write(true);
				else CON_Branch.write(false);
				break;	
		
			//bne
			case 5:
				if (CON_isEqual.read()==true) CON_Branch.write(false);
				else CON_Branch.write(true);
				break;	

			//jump
			case 2:
				CON_Branch_address.write(1);
				CON_Branch.write(true);
				break;	

			//andi
			case 12:
				CON_isSE.write(false);
				break;

			//ori
			case 14:
				CON_isSE.write(false);
				break;
		}

		//根据三个周期的指令,判断分析hazard的处理
		unsigned int ID_rs,ID_rt;
		unsigned int EXE_rd,MEM_rd;
		unsigned int EXE_op,MEM_op;
		//是否需要延迟
		bool isStall=false;

		ID_rs=CON_ID_instr_in.read().range(25,21).to_uint();
		ID_rt=CON_ID_instr_in.read().range(20,16).to_uint();

		EXE_op=CON_EXE_instr_in.read().range(31,26).to_uint();
		MEM_op=CON_MEM_instr_in.read().range(31,26).to_uint();
		
		//获得EXE阶段指令的目的寄存器
		switch(EXE_op)
		{
			case 0:
				EXE_rd=CON_EXE_instr_in.read().range(15,11).to_uint();
				break;
			case 8:
			case 12:
			case 13:
			case 35:
				EXE_rd=CON_EXE_instr_in.read().range(20,16);
				break;
			default:
				EXE_rd=0;
		}

		//获得MEM阶段指令的目的寄存器
		switch(MEM_op)
		{
			case 0:
				MEM_rd=CON_MEM_instr_in.read().range(15,11).to_uint();
				break;
			case 8:
			case 12:
			case 13:
			case 35:
				MEM_rd=CON_MEM_instr_in.read().range(20,16);
				break;
			default:
				MEM_rd=0;
		}

		unsigned int forwarda,forwardb;
		isStall=false;

		//判断处理forwarding,分三种情况分析
		forwarda=0;forwardb=0;
		if (ID_rs!=0)
		{
			if (ID_rs==EXE_rd && EXE_op == 35) isStall=true;
			if (ID_rs==EXE_rd && EXE_op !=35) forwarda=1;
			if (ID_rs==MEM_rd && MEM_op!=35) forwarda=2;
			if (ID_rs==MEM_rd && MEM_op==35) forwarda=3;
		}

		if (ID_rt!=0)
		{
			if (ID_rt==EXE_rd && EXE_op == 35) isStall=true;
			if (ID_rt==EXE_rd && EXE_op !=35) forwardb=1;
			if (ID_rt==MEM_rd && MEM_op!=35) forwardb=2;
			if (ID_rt==MEM_rd && MEM_op==35) forwardb=3;
		}

		CON_isDelay.write(false);
		CON_ForwardA.write(forwarda);
		CON_ForwardB.write(forwardb);
		CON_instr_out.write(CON_ID_instr_in.read());

		if (isStall) 
		{
			CON_isDelay.write(true);
			CON_instr_out.write(0);
		}

		/*
		cout<<sc_simulation_time()<<endl;
		if (isStall) cout<<"isStall"<<endl;
		PrintInstr(CON_ID_instr_in,cout);
		cout<<"forward "<<forwarda<<" "<<forwardb<<endl;
		cout<<"--------------------"<<endl;
		*/

		
		if (op==35) read_times++;
		if (op==43) write_times++;
	}

	SC_CTOR(Control_Unit)
	{
		SC_METHOD(action);
		sensitive<<CON_ID_instr_in<<CON_EXE_instr_in<<CON_MEM_instr_in<<CON_isEqual;

		read_times=write_times=0;
	}
};

#endif

⌨️ 快捷键说明

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