当前位置:网站首页>CPU设计实战-第四章实践任务二用阻塞技术解决相关引发的冲突
CPU设计实战-第四章实践任务二用阻塞技术解决相关引发的冲突
2022-07-05 14:31:00 【小威程序员】
用阻塞技术解决数据相关引发的冲突
前言
在lab3的实验环境下,添加lab4的指令测试序列,增加相应代码用阻塞技术解决相关引发的冲突。
实验
其关键点在于控制译码流水级指令前进还是阻塞的条件如何生成,其核心判断处于流水线不同阶段的指令是否存在会引发冲突的“写后读”相关关系。
1.传递执行级、访存级和写回级的目的寄存器号到译码级
我们在译码级判断当前时刻处于执行级、访存级或者写回级的指令的目的操作数的寄存器号是否与译码级源操作数的寄存器号是否相同,所以必须将执行级、访存级和写回级的目的寄存器号直接传递到译码级。在各流水级添加代码如下:
EXE_stage:
output [ 4:0] EXE_dest, //执行级目的操作数寄存器号
assign EXE_dest = es_dest & {
5{
es_valid}}; // 建议添加在末尾,下同
MEM_stage:
output [ 4:0] MEM_dest //访存级目的操作数寄存器号
assign MEM_dest = ms_dest & {
5{
ms_valid}};
WB_stage:
output [ 4:0] WB_dest //写回级目的操作数寄存器号
assign WB_dest = ws_dest & {
5{
ws_valid}};
ID_stage:
input [ 4:0] EXE_dest, //执行级目的操作数寄存器号
input [ 4:0] MEM_dest, //访存级目的操作数寄存器号
input [ 4:0] WB_dest, //写回级目的操作数寄存器号
并在mycpu_top相应模块的实例化中添加对应的信号:
//实例化所用线路声明,第一次更改时忘了这一部分…………
wire [4:0] EXE_dest;
wire [4:0] MEM_dest;
wire [4:0] WB_dest;
//wire es_load_op;
ID_stage:
//实例化端口的增添
.EXE_dest (EXE_dest),
.MEM_dest (MEM_dest),
.WB_dest (WB_dest),
//.es_load_op (es_load_op) //下面要添加
EXE_stage:
//实例化端口的增添
.EXE_dest (EXE_dest),
//.es_load_op (es_load_op)
MEM_stage:
//实例化端口的增添
.MEM_dest (MEM_dest)
WB_stage:
//实例化端口的增添
.WB_dest (WB_dest)
2.判断是否产生数据相关
我们在译码级得到了当前时刻处于执行级、访存级和写回级的指令的目的操作数的寄存器号后,接下来就要产生相应的逻辑来判断是否产生数据相关,产生数据相关之后,暂停流水线。在译码级添加和修改的代码如下:
/*数据前递增加/修改代码*/
//增加-begin
wire src1_no_rs; //指令 rs 域非 0,且不是从寄存器堆读 rs 的数据
wire src2_no_rt; //指令 rt 域非 0,且不是从寄存器堆读 rt 的数据
assign src1_no_rs = 1'b0;
assign src2_no_rt = inst_addiu | load_op | inst_jal | inst_lui;
wire rs_wait; //与源操作数rs对应的寄存器号一致
wire rt_wait; //与源操作数rt对应的寄存器号一致
assign rs_wait = ~src1_no_rs & (rs!=5'd0)
& ( (rs==EXE_dest) | (rs==MEM_dest) | (rs==WB_dest) );
assign rt_wait = ~src2_no_rt & (rt!=5'd0)
& ( (rt==EXE_dest) | (rt==MEM_dest) | (rt==WB_dest) );
wire inst_no_dest; //标记指令没有寄存器号
assign inst_no_dest = inst_beq | inst_bne | inst_jr | inst_sw;
//增加-end
//修改-begin
assign dest = dst_is_r31 ? 5'd31 :
dst_is_rt ? rt :
inst_no_dest ? 5'd0 : rd;
assign ds_ready_go = ds_valid & ~rs_wait & ~rt_wait;
//修改-end
/*---------------*/
3.转移计算未完成
还需考虑一种情况,就是转移计算未完成。即当转移指令在译码级时,Load指令在执行级无法获得Load结果,因而转移指令无法计算正确的跳转目标。此时根据课本上面的要求,添加和修改相应的代码,如下:
IF_stage:
wire pre_fs_ready_go; //增加
wire br_stall; //增加
assign to_fs_valid = ~reset && pre_fs_ready_go;//修改
assign pre_fs_ready_go = ~br_stall; //增加
assign {
br_stall,br_taken,br_target} = br_bus; //修改
assign inst_sram_en = to_fs_valid && fs_allowin && ~br_stall; //修改
ID_stage:
input es_load_op //表示当前执行级为load指令
wire br_stall; //增加
wire load_stall;
assign br_stall = br_taken & load_stall & {
5{
ds_valid}}; //增加
assign load_stall = (rs_wait & (rs == EXE_dest) & es_load_op ) ||
(rt_wait & (rt == EXE_dest) & es_load_op );
assign br_bus = {
br_stall,br_taken,br_target}; //修改
EXE_stage:
output es_load_op //表示执行级为load指令
mycpu.h:
`define BR_BUS_WD 34 //修改
在mycpu_top相应模块的实例化中添加对应的信号:
//实例化所用线路声明
wire es_load_op;
ID_stage:
//实例化端口的增添
.es_load_op (es_load_op)
EXE_stage:
//实例化端口的增添
.es_load_op (es_load_op)
实验结果
仿真结果:
launch_simulation: Time (s): cpu = 00:00:09 ; elapsed = 00:00:15 . Memory (MB): peak = 945.371 ; gain = 91.242
过测试:
----PASS!!!
run: Time (s): cpu = 00:00:20 ; elapsed = 00:00:16 . Memory (MB): peak = 945.371 ; gain = 0.000
边栏推荐
- 选择排序和冒泡排序
- R语言ggplot2可视化:可视化折线图、使用theme函数中的legend.position参数自定义图例的位置
- Total amount analysis accounting method and potential method - allocation analysis
- Intelligent supply chain collaboration system solution for daily chemical products industry: digital intelligent SCM supply chain, which is the "acceleration" of enterprise transformation
- [summary of leetcode weekly competition] the 81st fortnight competition of leetcode (6.25)
- What are the advantages and characteristics of SAS interface
- Explain Vue's plan to clean up keepalive cache in time
- Share 20 strange JS expressions and see how many correct answers you can get
- 世界环境日 | 周大福用心服务推动减碳环保
- 魅族新任董事長沈子瑜:創始人黃章先生將作為魅族科技產品戰略顧問
猜你喜欢

What are the advantages and characteristics of SAS interface

Intelligent supply chain collaboration system solution for daily chemical products industry: digital intelligent SCM supply chain, which is the "acceleration" of enterprise transformation

魅族新任董事長沈子瑜:創始人黃章先生將作為魅族科技產品戰略顧問

Solution of commercial supply chain collaboration platform in household appliance industry: lean supply chain system management, boosting enterprise intelligent manufacturing upgrading

LeetCode_ 2 (add two numbers)

SaaS multi tenant solution for FMCG industry to build digital marketing competitiveness of the whole industry chain

循环不变式

黑马程序员-软件测试-10阶段2-linux和数据库-44-57为什么学习数据库,数据库分类关系型数据库的说明Navicat操作数据的说明,Navicat操作数据库连接说明,Navicat的基本使用,

Sorter evolution of ticdc 6.0 principle

Thymeleaf th:with use of local variables
随机推荐
启牛证券账户怎么开通,开户安全吗?
2022年国内正规的期货公司平台有哪些啊?方正中期怎么样?安全可靠吗?
dynamic programming
【学习笔记】阶段测试1
申请代码签名证书时如何选择合适的证书品牌?
FR练习题目---简单题
R language uses boxplot function in native package (basic import package, graphics) to visualize box plot
【NVMe2.0b 14-9】NVMe SR-IOV
无密码身份验证如何保障用户隐私安全?
R语言ggplot2可视化:使用ggplot2可视化散点图、使用labs参数自定义X轴的轴标签文本(customize X axis labels)
Fonctions communes de thymeleaf
世界环境日 | 周大福用心服务推动减碳环保
开挖财上的证券账户可以吗?安全吗?
区间 - 左闭右开
World Environment Day | Chow Tai Fook serves wholeheartedly to promote carbon reduction and environmental protection
黑马程序员-软件测试-10阶段2-linux和数据库-44-57为什么学习数据库,数据库分类关系型数据库的说明Navicat操作数据的说明,Navicat操作数据库连接说明,Navicat的基本使用,
Matrix chain multiplication dynamic programming example
Explain Vue's plan to clean up keepalive cache in time
How to protect user privacy without password authentication?
Show strength. In this way, the mobile phone will not be difficult to move forward