当前位置:网站首页>CPU设计实战-第四章实践任务三用前递技术解决相关引发的冲突
CPU设计实战-第四章实践任务三用前递技术解决相关引发的冲突
2022-07-05 14:31:00 【小威程序员】
用前递技术解决数据相关引发的冲突
前言
实践任务三是在实践任务二的基础上进行修改的!!!
在lab4的实验环境下,增加相应代码用前递技术解决相关引发的冲突,最后使得仿真时间相比实践任务二更少。
实验
1.添加将执行级、访存级或者写回级的数据前递到译码级的数据通路
在译码级判断当前时刻处于执行级、访存级或者写回级的指令的目的操作数的寄存器号是否与译码级源操作数的寄存器号是否相同后,表示已经发生了数据相关,需要将执行级、访存级或者写回级的数据前递到译码级。代码如下:
EXE_stage:
output [31:0] EXE_result, //执行级
assign EXE_result = es_alu_result;
MEM_stage:
output [31:0] MEM_result
assign MEM_result = ms_final_result;
WB_stage:
output [31:0] WB_result
assign WB_result = ws_final_result;
ID_stage:
input [31:0] EXE_result,
input [31:0] MEM_result,
input [31:0] WB_result,
在mycpu_top相应模块的实例化中添加对应的信号:
//实例化所用线路声明
wire [31:0] EXE_result;
wire [31:0] MEM_result;
wire [31:0] WB_result;
ID_stage:
.EXE_result (EXE_result),
.MEM_result (MEM_result),
.WB_result (WB_result)
EXE_stage:
.EXE_result (EXE_result)
MEM_stage:
.MEM_result (MEM_result)
WB_stage:
.WB_result (WB_result)
2.判断需要前递的是执行级、访存级还是写回级的数据
我们在译码级得到了当前时刻处于执行级、访存级和写回级的指令需要最终写回到寄存器的目的操作数后,接下来就要产生相应的逻辑来判断需要前递的是执行级、访存级还是写回级的数据。在译码级修改的代码如下:
//删除
/* assign rs_value = rf_rdata1; assign rt_value = rf_rdata2; */
//添加-begin
assign rs_value = rs_wait ? (rs == EXE_dest ? EXE_result :
rs == MEM_dest ? MEM_result : WB_result)
: rf_rdata1;
assign rt_value = rt_wait ? (rt == EXE_dest ? EXE_result :
rt == MEM_dest ? MEM_result : WB_result)
: rf_rdata2;
assign ds_ready_go = ds_valid & ~load_stall;
//load_stall在实践任务二就已经添加,表示第i条指令是load指令,第i+1条指令
//和load指令发生数据相关,此时需要前递的数据还未准备好,需要流水线暂停。
//添加-end
实验结果
仿真结果:
launch_simulation: Time (s): cpu = 00:00:05 ; elapsed = 00:00:12 . Memory (MB): peak = 958.809 ; gain = 0.000
过测试:
----PASS!!!
run: Time (s): cpu = 00:00:18 ; elapsed = 00:00:16 . Memory (MB): peak = 958.809 ; gain = 0.000
边栏推荐
- openGauss数据库源码解析系列文章—— 密态等值查询技术详解(下)
- 一网打尽异步神器CompletableFuture
- 03_ Dataimport of Solr
- Tdengine biweekly selection of community issues | phase III
- Google eventbus usage details
- World Environment Day | Chow Tai Fook serves wholeheartedly to promote carbon reduction and environmental protection
- Assembly language
- 黑马程序员-软件测试-10阶段2-linux和数据库-44-57为什么学习数据库,数据库分类关系型数据库的说明Navicat操作数据的说明,Navicat操作数据库连接说明,Navicat的基本使用,
- Thymeleaf common functions
- How to make a second clip of our media video without infringement
猜你喜欢
随机推荐
Strong connection component
FR练习题目---简单题
Interpretation of tiflash source code (IV) | design and implementation analysis of tiflash DDL module
Share 20 strange JS expressions and see how many correct answers you can get
微帧科技荣获全球云计算大会“云鼎奖”!
外盘入金都不是对公转吗,那怎么保障安全?
Thymeleaf th:classappend attribute append th:styleappend style append th:data- custom attribute
申请代码签名证书时如何选择合适的证书品牌?
非技术部门,如何参与 DevOps?
R语言dplyr包select函数、group_by函数、mutate函数、cumsum函数计算dataframe分组数据中指定数值变量的累加值、并生成累加数据列
Disjoint Set
美国费城发生“安全事故” 2名警察遭枪杀
PostgreSQL 13 installation
Security analysis of Web Architecture
有一个强大又好看的,赛过Typora,阿里开发的语雀编辑器
FR练习题目---综合题
Thymeleaf 模板的创建与使用
Thymeleaf common functions
【NVMe2.0b 14-9】NVMe SR-IOV
leetcode:881. 救生艇


![[learning notes] stage test 1](/img/22/ad16375d8d1510c2ec75c56403a8bf.png)





