当前位置:网站首页>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
边栏推荐
- openGauss数据库源码解析系列文章—— 密态等值查询技术详解(下)
- R语言ggplot2可视化:gganimate包基于transition_time函数创建动态散点图动画(gif)、使用shadow_mark函数为动画添加静态散点图作为动画背景
- R语言ggplot2可视化:使用ggplot2可视化散点图、使用labs参数自定义X轴的轴标签文本(customize X axis labels)
- R语言使用MASS包的polr函数构建有序多分类logistic回归模型、使用coef函数获取模型中每个变量(自变量改变一个单位)对应的对数优势比(log odds ratio)
- R语言使用nnet包的multinom函数构建无序多分类logistic回归模型、使用coef函数获取模型中每个变量(自变量改变一个单位)对应的对数优势比(log odds ratio)
- How to protect user privacy without password authentication?
- Share 20 strange JS expressions and see how many correct answers you can get
- 外盘入金都不是对公转吗,那怎么保障安全?
- 循环不变式
- Judge whether the variable is an array
猜你喜欢
Lepton 无损压缩原理及性能分析
黑马程序员-软件测试-10阶段2-linux和数据库-44-57为什么学习数据库,数据库分类关系型数据库的说明Navicat操作数据的说明,Navicat操作数据库连接说明,Navicat的基本使用,
How can non-technical departments participate in Devops?
想进阿里必须啃透的12道MySQL面试题
魅族新任董事長沈子瑜:創始人黃章先生將作為魅族科技產品戰略顧問
Interpretation of tiflash source code (IV) | design and implementation analysis of tiflash DDL module
分享 20 个稀奇古怪的 JS 表达式,看看你能答对多少
Topology visual drawing engine
循环不变式
世界环境日 | 周大福用心服务推动减碳环保
随机推荐
Penetration testing methodology
01. Solr7.3.1 deployment and configuration of jetty under win10 platform
【学习笔记】图的连通性与回路
Thymeleaf th:with use of local variables
Niuke: intercepting missiles
Section - left closed right open
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
Assembly language
webRTC SDP mslabel lable
04_ Use of solrj7.3 of solr7.3
03_ Dataimport of Solr
Tiflash compiler oriented automatic vectorization acceleration
Qingda KeYue rushes to the science and Innovation Board: the annual revenue is 200million, and it is proposed to raise 750million
注意!软件供应链安全挑战持续升级
无密码身份验证如何保障用户隐私安全?
区间 - 左闭右开
网上电子元器件采购商城:打破采购环节信息不对称难题,赋能企业高效协同管理
How to make a second clip of our media video without infringement
R language uses boxplot function in native package (basic import package, graphics) to visualize box plot
Solution of commercial supply chain collaboration platform in household appliance industry: lean supply chain system management, boosting enterprise intelligent manufacturing upgrading