> # ♻️ 资源
> **大小:** 117MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010673**](https://www.yuque.com/sxbn/ks/100010673)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87425296**](https://download.csdn.net/download/s1t16/87425296)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 1. 实验名称
指令流水仿真程序
# 2. 实验报告作者
# 3. 实验内容
## 3.1. 定义 NK-CPU 指令流水线仿真的基本数据结构
### 3.1.1. 四个锁存器
nkcpuPipelineDlg.cpp
```
// 模拟各段之间的锁存器
// IF/ID
class ifData {
public:
CString PC;
CString IR;
ifData& operator=(ifData x) {
this->PC = x.PC;
this->IR = x.IR;
return *this;
}
};
ifData ifbefore, ifafter;
// ID/EX
class idData {
public:
CString PC;
CString IR;
int A;
int B;
int C;
int Imm;
idData& operator=(idData x) {
this->PC = x.PC;
this->IR = x.IR;
this->A = x.A;
this->B = x.B;
this->C = x.C;
this->Imm = x.Imm;
return *this;
}
};
idData idbefore, idafter;
// EX/MEM
class exData {
public:
CString PC;
CString IR;
int C;
int Imm;
int ALUOutput;
exData& operator=(exData x) {
this->PC = x.PC;
this->IR = x.IR;
this->ALUOutput = x.ALUOutput;
this->C = x.C;
this->Imm = x.Imm;
return *this;
}
};
exData exbefore, exafter;
// MEM/WB
class memData {
public:
CString PC;
CString IR;
int Imm;
int LMD;
int ALUOutput;
memData& operator=(memData x) {
this->PC = x.PC;
this->IR = x.IR;
this->ALUOutput = x.ALUOutput;
this->LMD = x.LMD;
this->Imm = x.Imm;
return *this;
}
};
memData membefore, memafter;
```
五段流水每段之间需要一个锁存器,所以一共是四个分别以锁存器之前的 段名+Data 命名,其中:
- IR 是该段要处理的指令,
- PC 是该指令对应的地址,
- A 是指令的 6-10 位也就是操作数 s ,
- B 是指令的 11-15 位也就是操作数 t ,
- C 是指令的 16-20 位也就是操作数 d ,
- Imm 是指令的后 16 位也就是对应的立即数,
- ALUOutput 是 EX 段 ALU 运算后的输出结果,
- LMD 是 MEM 段取出的数据。
由于没有实现并行操作,是利用串行模拟所以要将锁存器分成两个状态 ××before 和 ××after ,每段从 ××before 读取数据,向 ××after 写入数据,一个时钟周期结束后将 ××after 的值赋予 ××before ,所以我重载了 = 运算符。
## 3.2. 使用 C 语言实现 NK-CPU 指令流水线仿真程序
### 3.2.1. 模拟五段流水
设计的总逻辑依据下图:
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1714270043210-3096acc1-29c3-44c8-8b47-38c72231bb31.png#averageHue=%23c2bdb4&from=url&id=tqPAJ&originHeight=3024&originWidth=4032&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
《计算机体系结构:量化研究方法(第五版)》 P484
#### 3.2.1.1. IF
nkcpuPipelineDlg.cpp
```
CString CnkcpuPipelineDlg::IF() {
if (ifbefore.IR == "11111111111111111111111111111111") {
ifafter.IR = ifbefore.IR;
return _T("NOP");
}
else {
UpdateData(TRUE);
CString strPC;
strPC.Format(_T("%d"), m_PC);
ifafter.PC = strPC;
m_program.EnsureVisible(m_PC / 4, FALSE);// 滚动到选中行
m_program.SetItemState(m_PC / 4, LVIS_SELECTED, LVIS_SELECTED);// 高亮选中行,其实未聚焦时为灰色
CString code = m_program.GetItemText(m_PC / 4, 1);
ifafter.IR = code.Left(8) + code.Mid(9, 8) + code.Mid(18, 8) + code.Right(8);
if ((idbefore.IR.Left(6) == "100011"
&& ifbefore.IR.Left(6) == "101011"
&& (idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(6, 5) || idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(11, 5) || idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(16, 5))) ||
(idbefore.IR.Left(6) == "100011"
&& (ifbefore.IR.Left(6) == "000000" || ifbefore.IR.Left(6) == "100011")
&& (idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(6, 5) || idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(11, 5))) ||
(idbefore.IR.Left(6) == "100011"
&& (ifbefore.IR.Left(6) == "001000" || ifbefore.IR.Left(6) == "000110")
&& idbefore.IR.Mid(16, 5) == ifbefore.IR.Mid(6, 5)))
{
ifafter = ifbefore;
idafter.IR = _T("000000") + idafter.IR.Mid(6, 20) + _T("000000");
}
else if (ifbefore.IR.Left(6) == "000010" || (ifbefore.IR.Left(6) == "000110"&&idafter.A <= 0))
{
m_PC = idafter.Imm;
ifafter.IR = _T("000000") + ifafter.IR.Mid(6, 20) + _T("000000");
}
else
{
m_PC += 4;
}
UpdateData(FALSE);
return strPC;
}
}
```
IF 段取指,利用 ID 判断分支是否成立的结果,如果分支指令成立或者是跳转指令,就将 PC 置为相应地址,这里会有一周期的延迟,所以会读入下一条指令,如果跳转到别处,这条指令就没用了,所以将控制位置 0 ,之后的操作也就不会做了。参照下图中的 IF 段:
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1714270043333-40fb63d0-42dc-42bd-b09f-9e0eb6eb04b7.png#averageHue=%23c3bfb6&from=url&id=P1iPj&originHeight=3024&originWidth=4032&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
《计算机体系结构:量化研究方法(第五版)》 P484
还有一点就是在 ID 段由于数据冒险会有旁路转发,其中有一种情况不能处理,也就是载入指令的目标寄存器在紧接着的下一条指令中作为源寄存器被调用,这种情况也会有一周期延迟,这需要停顿等待,其实也是将 ID 段的判断结果在这一段使用。所以我就都写在这一段里了。参照下图中的 表C-11 :
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1714270043451-d29ece3a-321f-48d0-af22-10660c79cd78.png#averageHue=%23c4bfb7&from=url&id=tG1Br&originHeight=2291&originWidth=4032&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
《计算机体系结构:量化研究方法(第五版)》 P481
如果这两种情况均不存在,就将 PC + 4 存入 PC。
#### 3.2.1.2. ID
nkcpuPipelineDlg.cpp
```
CString CnkcpuPipelineDlg::ID() {
if (time < 1)return _T("");
else if (ifbefore.IR.Left(6) == "000000"&&ifbefore.IR.Right(6) == "000000"|| ifbefore.IR == "11111111111111111111111111111111") {
idafter.IR = ifbefore.IR;
return _T("NOP");
}
else {
idafter.PC = ifbefore.PC;
idafter.IR = ifbefore.IR;
idafter.A = m_Reg[bin2num(ifbefore.IR.Mid(6, 5))];
idafter.B = m_Reg[bin2num(ifbefore.IR.Mid(11, 5))];
idafter.C = m_Reg[bin2num(ifbefore.IR.Mid(16, 5))];
idafter.Imm = bin2num(ifbefore.IR.Right(16));
if ((memafter.IR.Left(6) == "000000"|| memafter.IR.Left(6) == "100011")
&& (idafter.IR.Left(6) == "000000" || idafter.IR.Left(6) == "100011" || idafter.IR.Left(6) == "101011" || idafter.IR.Left(6) == "001000" || idafter.IR.Left(6) == "000110")
&& (memafter.IR.Mid(16, 5) == idafter.IR.Mid(6, 5))) {
if (memafter.IR.Left(6) == "000000")idafter.A = memafter.ALUOutput;
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现的指令流水仿真程序【100010673】
共83个文件
tlog:18个
jpg:8个
txt:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 84 浏览量
2023-02-07
16:20:10
上传
评论
收藏 117.96MB ZIP 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010673 1. 定义 NK-CPU 指令流水线仿真的基本数据结构 2. 使用 C 语言实现 NK-CPU 指令流水线仿真程序 3. 仿真运行实验 2 中实现的随机数排序程序
资源推荐
资源详情
资源评论
收起资源包目录
100010673-基于C++实现的指令流水仿真程序.zip (83个子文件)
nkcpulinmaster
LICENSE 1KB
《计算机体系结构》课程实验3翻译版.md 9KB
nkcpuPipeline
stdafx.h 1KB
nkcpuPipeline.h 454B
mdata.txt 360B
sort1.asm 354B
十种情况.txt 3KB
nkcpuPipeline.vcxproj 10KB
nkcpuPipeline.aps 94KB
nkcpuPipeline.rc 19KB
resource.h 5KB
mcode.txt 864B
mcode1.txt 612B
res
nkcpuPipeline.ico 66KB
nkcpuPipeline.rc2 682B
Release
nkcpuPipeline.log 528B
nkcpuPipeline.pch 47.06MB
nkcpuPipeline.obj 817KB
nkcpuPipelineDlg.obj 1001KB
stdafx.obj 5.82MB
vc140.pdb 6.69MB
nkcpuPipeline.res 71KB
nkcpuPipeline.tlog
CL.write.1.tlog 2KB
rc.command.1.tlog 510B
nkcpuPipeline.lastbuildstate 229B
rc.write.1.tlog 314B
rc.read.1.tlog 3KB
CL.command.1.tlog 3KB
link.command.1.tlog 2KB
link.read.1.tlog 7KB
link.write.1.tlog 1KB
CL.read.1.tlog 97KB
nkcpuPipelineDlg.cpp 24KB
ReadMe.txt 4KB
sort.asm 444B
nkcpuPipeline.vcxproj.filters 2KB
nkcpuPipelineDlg - 副本.txt 17KB
nkcpuPipeline.cpp 2KB
Debug
nkcpuPipeline.log 268B
nkcpuPipeline.Build.CppClean.log 2KB
nkcpuPipeline.pch 52.69MB
nkcpuPipeline.obj 96KB
nkcpuPipelineDlg.obj 485KB
stdafx.obj 901KB
vc140.idb 2.47MB
vc140.pdb 6.71MB
nkcpuPipeline.res 71KB
nkcpuPipeline.tlog
CL.write.1.tlog 2KB
rc.command.1.tlog 502B
nkcpuPipeline.lastbuildstate 227B
rc.write.1.tlog 310B
rc.read.1.tlog 3KB
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 6KB
link.write.1.tlog 1KB
CL.read.1.tlog 96KB
stdafx.cpp 138B
targetver.h 232B
nkcpuPipelineDlg.h 2KB
.vs
nkcpuPipeline
v14
.suo 40KB
Release
nkcpuPipeline.iobj 1.43MB
nkcpuPipeline.ipdb 257KB
nkcpuPipeline.exe 152KB
nkcpuPipeline.pdb 6.68MB
nkcpuPipeline.sln 1KB
ipch
NKCPUPIPELINE-bfc07a06
NKCPUPIPELINE-1bff82a3.ipch 98.69MB
NKCPUPIPELINE-f753f5dd.ipch 98.5MB
《计算机体系结构》课程实验3.pdf 191KB
nkcpuPipeline.VC.db 68.44MB
readmeImage
2.jpg 1.55MB
6.jpg 190KB
1.jpg 1.82MB
5.jpg 183KB
8.jpg 185KB
3.jpg 2.35MB
7.jpg 181KB
4.jpg 1.64MB
Debug
nkcpuPipeline.ilk 3.12MB
nkcpuPipeline.exe 325KB
nkcpuPipeline.pdb 4.72MB
README.md 27KB
2.bmp 820KB
共 83 条
- 1
资源评论
神仙别闹
- 粉丝: 3739
- 资源: 7464
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功