当前位置:网站首页>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
边栏推荐
- R语言使用nnet包的multinom函数构建无序多分类logistic回归模型、使用coef函数获取模型中每个变量(自变量改变一个单位)对应的对数优势比(log odds ratio)
- Which Internet companies are worth going to in Shenzhen for software testers [Special Edition for software testers]
- Tdengine biweekly selection of community issues | phase III
- 2022年国内正规的期货公司平台有哪些啊?方正中期怎么样?安全可靠吗?
- CyCa children's physical etiquette Ningbo training results assessment came to a successful conclusion
- be careful! Software supply chain security challenges continue to escalate
- 3W principle [easy to understand]
- Why do mechanical engineers I know complain about low wages?
- 做自媒體視頻二次剪輯,怎樣剪輯不算侵權
- R language ggplot2 visual density map: Visual density map by group and custom configuration geom_ The alpha parameter in the density function sets the image transparency (to prevent multiple density c
猜你喜欢

Sharing the 12 most commonly used regular expressions can solve most of your problems

leetcode:881. lifeboat

Chow Tai Fook fulfills the "centenary commitment" and sincerely serves to promote green environmental protection

Redis如何实现多可用区?

【NVMe2.0b 14-9】NVMe SR-IOV

Lepton 无损压缩原理及性能分析

Qingda KeYue rushes to the science and Innovation Board: the annual revenue is 200million, and it is proposed to raise 750million

非技术部门,如何参与 DevOps?

How does redis implement multiple zones?

分享 12 个最常用的正则表达式,能解决你大部分问题
随机推荐
R语言ggplot2可视化:可视化折线图、使用theme函数中的legend.position参数自定义图例的位置
C language -- structure and function
PMP考试20天能通过吗?
做自媒体视频二次剪辑,怎样剪辑不算侵权
分享 20 个稀奇古怪的 JS 表达式,看看你能答对多少
【招聘岗位】基础设施软件开发人员
Thymeleaf 使用后台自定义工具类处理文本
区间 - 左闭右开
LeetCode_ 2 (add two numbers)
R language ggplot2 visualization: gganimate package is based on Transition_ The time function creates dynamic scatter animation (GIF) and uses shadow_ Mark function adds static scatter diagram as anim
Faire un clip vidéo auto - média deux fois, comment clip n'est pas considéré comme une infraction
Thymeleaf th:classappend属性追加 th:styleappend样式追加 th:data-自定义属性
【学习笔记】阶段测试1
总量分析 核算方法和势方法 - 分摊分析
周大福践行「百周年承诺」,真诚服务推动绿色环保
实现一个博客系统----使用模板引擎技术
Is the securities account given by the head teacher of qiniu school safe? Can I open an account?
The simplest way to open more functions without certificates
Penetration testing methodology
日化用品行业智能供应链协同系统解决方案:数智化SCM供应链,为企业转型“加速度”