📄 control_unit.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 + -