/*
Main.cpp
程序流程:
1.从instruction.txt中读取Unicore32指令
2.调用asm2bin.h中的函数,将汇编指令转成二进制指令,并保存在指令存储器中
3.按取指->译码->执行->访存->写回的顺序,在流水线结构中运行指令
(1)每个时钟周期,分别创建一个取指线程、一个译码线程、一个执行线程、一个访存线程和一个回写线程,然后等待这五个线程都结束后,才进入下一个时钟周期
(2)取指线程对指令存储器中PC寄存器的地址进行取指
①按PC寄存器的地址进行取指
②如果取到的指令是0xFFFFFFFF,则下一周期不再取指,不再进行下一步
③如果当前执行的指令不是跳转指令,或还未判定是否跳转指令,则进行PC+4操作
(3)译码线程对上一时钟周期取的指令(如果有的话)进行译码
①指令的高8位为操作码
②根据操作码确定state的值,即该周期的执行方式、是否访存、是否取指
(4)执行线程根据上一周期对指令译码的结果分情况(R型、I型、存取、分支、跳转等)执行指令
①先读取寄存器的值
②执行R型指令:如果需要移位则执行移位,如果是减法则对操作数2取反加1,之后根据操作码确定ALU的op值,然后用ALU进行计算
③执行I型指令:先对立即数做零扩展,然后移位,再根据操作码确定ALU的op值和setflag位,然后用ALU进行计算
④执行存取指令:如果有rs2,则进行移位;如果是imm14,则进行扩展。接着用ALU计算地址
⑤执行BEQ指令:如果Z位为1,则将PC的值变成PC+4+offset,并将该指令标为跳转指令;如果Z位为0,无操作
⑥执行B指令:将PC的值变成PC+4+offset,并将该指令标为跳转指令
⑦执行JUMP指令:将PC的值变成rs2寄存器的值,并将该指令标为跳转指令
(5)访存线程对上一周期的存取指令进行访存读写操作
①判断是读存储器还是写存储器
②访问Cache,通过Cache访问存储器
(6)写回线程对上上周期执行的指令需要回写(如果有需要的话)
(7)如果该时钟周期执行的指令发生了跳转,则下一周期不进行译码和执行(相当于停止了顺序将执行的指令的执行)
(8)打印信息
*/
#include "types.h" // 定义了寄存器堆、存储器、Cache、ALU、扩展器、移位器等类
#include "asm2bin.h" // 汇编转二进制的函数
#include <iostream>
#include <fstream>
#include <cmath>
#include <sstream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <windows.h>
#define INSTRUCTION_FILE_NAME "instruction.txt"
#define STRING_MAXLENGTH 1024
using namespace std;
vector<string> vasm; // 保存输入的汇编指令
vector<unsigned> vins; // 保存汇编指令对应的二进制指令
vector<LABEL> vlabel,vbi; // 保存跳转标号的地址
int clock=0; // 时钟周期
REGISTER_FILE regf; // 寄存器堆
PC pc; // PC寄存器
ALU alu; // ALU
ADDER adder; // 加法器
MEMORY insmemory(IMEM_SIZE),datamemory(DMEM_SIZE); // 指令存储器和数据存储器
EXTENDER extender; // 扩展器
SHIFTER shifter; // 移位器
CACHE cache(&datamemory); // 数据存储器的Cache
HANDLE mutex_pc=CreateSemaphore(NULL,1,1,NULL); // 多线程编程中PC寄存器的信号量
HANDLE mutex_cpi=CreateSemaphore(NULL,1,1,NULL);
void InputInstructions();
void ParseInstruction(string instruction);
void ParseBInstruction();
void LoadInstructions();
int state[5][5]={{0,-1,-1,-1,-1},{0,0,-1,-1,-1},{0,0,0,-1,-1},{0,0,0,0,-1},{0,0,0,0,0}}; // 下一周期各线程的状态(是否需要做某一操作/需要如何操作)
unsigned instructions[5]={0}; // 某一周期取的指令
unsigned pctemp[5]={0}; // 某一周期取指时的PC寄存器值
unsigned cachetemp[5][2]={0}; // 某一周期访存的地址和数据
unsigned regwritetemp[5][3]={0}; // 某一周期执行或访存后修改的寄存器的结果
bool isjumpins=false; // 执行的指令是否跳转
bool wbtemp[5]={0}; // 写回的结果
unsigned cpiwithcache=0; // 使用Cache的CPI
unsigned cpiwithoutcache=0; // 不使用Cache的CPI
unsigned execins=0;
DWORD WINAPI FetchInstructions(LPVOID lpParam);
DWORD WINAPI Decode(LPVOID lpParam);
DWORD WINAPI Execute(LPVOID lpParam);
DWORD WINAPI VisitCache(LPVOID lpParam);
DWORD WINAPI WriteBack(LPVOID lpParam);
void ExecRIns(unsigned instruction);
void ExecIIns(unsigned instruction);
void ExecSL(unsigned instruction);
void ExecBeq(unsigned instruction);
void ExecB(unsigned instruction);
void ExecJump(unsigned instruction);
// 从instruction.txt输入汇编指令
void InputInstructions()
{
ifstream fin;
fin.open(INSTRUCTION_FILE_NAME);
char instruction[STRING_MAXLENGTH];
while(fin.getline(instruction,STRING_MAXLENGTH))
{
ParseInstruction(instruction);
}
fin.close();
}
inline bool isSplit(char c)
{
return c==' '||c==','||c=='<'||c=='>'||c=='+'||c=='['||c==']'||c=='#';
}
// 根据输入的指令的操作调用asm2bin.h的函数转化成二进制
void ParseInstruction(string instruction)
{
int length=instruction.length();
int i;
bool islabel=false;
string params[8];
string inscopy=instruction;
if(length==0)
{
return;
}
for(i=0;i<length;i++)
{
if(isSplit(instruction[i]))
{
instruction[i]=' ';
}
else if(instruction[i]==':')
{
islabel=true;
break;
}
}
if(!islabel)
{
stringstream ss;
unsigned ins;
i=0;
ss<<instruction;
while(ss>>params[i])
{
i++;
}
string operation=params[0];
if(params[0]=="ADD")
{
ins=ADD2BinCode(i,params);
}
else if(params[0]=="SUB")
{
ins=SUB2BinCode(i,params);
}
else if(params[0]=="MUL")
{
ins=MUL2BinCode(i,params);
}
else if(params[0]=="AND")
{
ins=AND2BinCode(i,params);
}
else if(params[0]=="OR")
{
ins=OR2BinCode(i,params);
}
else if(params[0]=="MOV")
{
ins=MOV2BinCode(i,params);
}
else if(params[0]=="LDB")
{
ins=LDB2BinCode(i,params);
}
else if(params[0]=="LDW")
{
ins=LDW2BinCode(i,params);
}
else if(params[0]=="STB")
{
ins=STB2BinCode(i,params);
}
else if(params[0]=="STW")
{
ins=STW2BinCode(i,params);
}
else if(params[0]=="CMPSUB.A")
{
ins=CMPSUBA2BinCode(i,params);
}
else if(params[0]=="BEQ")
{
string label=params[1];
vbi.push_back(LABEL(vins.size(),label));
ins=BEQ2BinCode(i,params);
}
else if(params[0]=="B")
{
string label=params[1];
vbi.push_back(LABEL(vins.size(),label));
ins=B2BinCode(i,params);
}
else if(params[0]=="JUMP")
{
ins=JUMP2BinCode(i,params);
}
else return;
vins.push_back(ins);
vasm.push_back(inscopy);
}
else
{
int j=-1,k;
for(k=0;k<length;k++)
{
if(j==-1&&((instruction[k]>='a'&&instruction[k]<='z')||(instruction[k]>='A'&&instruction[k]<='Z')||(instruction[k]>='0'&&instruction[k]<='9')||instruction[k]=='_'))
{
j=k;
}
else if(instruction[k]==':')
{
break;
}
}
vlabel.push_back(LABEL(vins.size(),instruction.substr(j,k-j)));
ParseInstruction(instruction.substr(i+1,instruction.length()-i-1));
}
}
// 计算分支和跳转指令的地址
void ParseBInstructions()
{
int i,j;
for(i=0;i<vbi.size();i++)
{
for(j=0;j<vlabel.size();j++)
{
if(vbi[i].name==vlabel[j].name)
{
break;
}
}
int index=vbi[i].pos;
int imm24=(vlabel[j].pos-index)*4-4;
vins[index]|=SignedInt(imm24,24);
}
}
// 将二进制指令读入指令存储器
void LoadInstructions()
{
int i;
cout<<"指令:"<<endl;
for(i=0;i<vins.size();i++)
{
insmemory.addr=i*4;
insmemory.data=vins[i];
insmemory.Write(4);
printf("0x%08X : ",i*4);
BinOut(vins[i]);
cout<<vasm[i]<<endl;
}
insmemory.addr=
没有合适的资源?快使用搜索试试~ 我知道了~
C指令级模拟器及高级缓存模拟器omputer_Architectures.zip
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共1个文件
cpp:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 18 浏览量
2024-06-16
18:00:17
上传
评论
收藏 6KB ZIP 举报
温馨提示
C指令级模拟器及高级缓存模拟器omputer_Architectures.zip
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 1 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/11124d2ce5db41368adec8b1ad4e99f7_xxzhaoming.jpg!1)
![avatar-vip](https://csdnimg.cn/release/downloadcmsfe/public/img/user-vip.1c89f3c5.png)
应用市场
- 粉丝: 646
- 资源: 3866
![benefits](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-2.ec46750a.png)
C知道特权
![article](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![course-privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![rights](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)