热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Rocket–core–wb_reg_flush_pipe

https:mp.weixin.qq.coms6WVmHCY0nd_AtOBByfgJVA 简单介绍wb_reg_flush_pipe的作用。  1.wb_reg_flush_pi

https://mp.weixin.qq.com/s/6WVmHCY0nd_AtOBByfgJVA

 

简单介绍wb_reg_flush_pipe的作用。

 

 

1. wb_reg_flush_pipe值的由来

 

1) wb_reg_flush_pipe

wb_reg_flush_pipe的值是通过流水线从mem_reg_flush_pipe传递而来的。

如果没有kill mem阶段,则可以把mem_reg_flush_pipe传递给wb_reg_flush_pipe:

这里kill mem的典型情况是mem_reg_valid为假,即mem阶段流水线寄存器的值不合法。

 

2) mem_reg_flush_pipe

 

mem_reg_flush_pipe的值从ex_reg_flush_pipe传递而来:

如果不考虑debug的情况,mem_reg_flush_pipe直接在ex_pc_valid的控制下,由ex_reg_flush_pipe传递而来。

 

ex_pc_valid主要的情况为ex_reg_valid,即ex阶段流水线寄存器的值是合法的。在中断的情况下,ex_pc_valid也为真。

 

3) ex_reg_flush_pipe

 

ex_reg_flush_pipe的值使用id阶段生成的值更新:

这里存在两种情况:

a. 指令为fence_i指令;

b. csr指令要求flush流水线;

 

2. wb_reg_flush_pipe的使用

 

wb_reg_flush_pipe可以导致take_pc_wb,进而导致take_pc,要求重新取指。重新取指的pc是随着flush pipe一路传递而来的wb_reg_pc,其源头为ibuf.io.pc。

 

3. 对流水线的影响

 

所谓flush pipe就是刷新流水线。即以带有flush效果的指令为分界,之前的指令都执行完成之后,才能重新取指进行执行。

 

以fence_i指令为例:

a. 在ID阶段,fence_i指令导致ex_reg_flush_pipe的值将要被更新为1:

因为fence_i是一条正常指令,所以ctrl_killd = 0;

 

b. 在EX阶段,fence_i指令正常执行:

mem_reg_flush_pipe将要被更新为1。

 

c. 在MEM阶段,fence_i指令正常执行:

wb_reg_flush_pipe将要被更新为1。

 

d. 在WB阶段,fence_i指令触发take_pc:

take_pc实时导致之前的各阶段被废弃(killd/killx/killm),并重新取指。

 



推荐阅读
author-avatar
freezing-wing
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有