Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
282a07b1
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
9 个月 前同步成功
通知
1183
Star
3914
Fork
526
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
XiangShan
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
282a07b1
编写于
1月 29, 2021
作者:
L
LinJiawei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
CtrlBlock: fix flush logic
上级
0df85908
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
16 addition
and
13 deletion
+16
-13
src/main/scala/xiangshan/backend/CtrlBlock.scala
src/main/scala/xiangshan/backend/CtrlBlock.scala
+3
-1
src/main/scala/xiangshan/backend/ftq/Ftq.scala
src/main/scala/xiangshan/backend/ftq/Ftq.scala
+11
-11
src/main/scala/xiangshan/backend/roq/Roq.scala
src/main/scala/xiangshan/backend/roq/Roq.scala
+2
-1
未找到文件。
src/main/scala/xiangshan/backend/CtrlBlock.scala
浏览文件 @
282a07b1
...
...
@@ -228,6 +228,8 @@ class CtrlBlock extends XSModule with HasCircularQueuePtrHelper {
}
ftq
.
io
.
redirect
<>
backendRedirect
ftq
.
io
.
flush
:=
flush
ftq
.
io
.
flushIdx
:=
roq
.
io
.
flushOut
.
bits
.
ftqIdx
ftq
.
io
.
flushOffset
:=
roq
.
io
.
flushOut
.
bits
.
ftqOffset
ftq
.
io
.
frontendRedirect
<>
frontendRedirect
ftq
.
io
.
exuWriteback
<>
io
.
fromIntBlock
.
exuRedirect
...
...
@@ -268,7 +270,7 @@ class CtrlBlock extends XSModule with HasCircularQueuePtrHelper {
// pipeline between decode and dispatch
for
(
i
<-
0
until
RenameWidth
)
{
PipelineConnect
(
decode
.
io
.
out
(
i
),
rename
.
io
.
in
(
i
),
rename
.
io
.
in
(
i
).
ready
,
backendRedirect
.
valid
||
f
rontendRedirect
.
valid
)
backendRedirect
.
valid
||
f
lush
||
io
.
frontend
.
redirect_cfiUpdate
.
valid
)
}
rename
.
io
.
redirect
<>
backendRedirect
...
...
src/main/scala/xiangshan/backend/ftq/Ftq.scala
浏览文件 @
282a07b1
...
...
@@ -48,6 +48,8 @@ class Ftq extends XSModule with HasCircularQueuePtrHelper {
// redirect, reset enq ptr
val
redirect
=
Flipped
(
ValidIO
(
new
Redirect
))
val
flush
=
Input
(
Bool
())
val
flushIdx
=
Input
(
new
FtqPtr
)
val
flushOffset
=
Input
(
UInt
(
log2Up
(
PredictWidth
).
W
))
// update mispredict target
val
frontendRedirect
=
Flipped
(
ValidIO
(
new
Redirect
))
// exu write back, update info
...
...
@@ -65,7 +67,10 @@ class Ftq extends XSModule with HasCircularQueuePtrHelper {
io
.
enq
.
ready
:=
validEntries
<
FtqSize
.
U
io
.
enqPtr
:=
tailPtr
val
real_fire
=
io
.
enq
.
fire
()
&&
!
io
.
redirect
.
valid
&&
!
io
.
frontendRedirect
.
valid
&&
!
io
.
flush
val
stage2Flush
=
io
.
redirect
.
valid
||
io
.
flush
val
stage3Flush
=
RegNext
(
stage2Flush
)
val
real_fire
=
io
.
enq
.
fire
()
&&
!
stage2Flush
&&
!
stage3Flush
val
dataModule
=
Module
(
new
DataModuleTemplate
(
new
FtqEntry
,
FtqSize
,
4
,
1
,
true
))
dataModule
.
io
.
wen
(
0
)
:=
real_fire
...
...
@@ -164,18 +169,13 @@ class Ftq extends XSModule with HasCircularQueuePtrHelper {
}
// redirect, reset ptr
when
(
io
.
flush
)
{
// flush pipe / exception
// clear ftq
tailPtr
:=
headPtr
commitStateQueue
(
headPtr
.
value
).
foreach
(
_
:=
s_invalid
)
assert
(
headPtr
===
io
.
redirect
.
bits
.
ftqIdx
)
}.
elsewhen
(
io
.
redirect
.
valid
)
{
// branch misprediction or load replay
val
isReplay
=
RedirectLevel
.
flushItself
(
io
.
redirect
.
bits
.
level
)
when
(
io
.
flush
||
io
.
redirect
.
valid
){
val
idx
=
Mux
(
io
.
flush
,
io
.
flushIdx
,
io
.
redirect
.
bits
.
ftqIdx
)
val
next
=
io
.
redirect
.
bits
.
ftqIdx
+
1.
U
tailPtr
:=
next
val
offset
=
io
.
redirect
.
bits
.
ftqOffset
commitStateQueue
(
i
o
.
redirect
.
bits
.
ftqI
dx
.
value
).
zipWithIndex
.
foreach
({
case
(
s
,
i
)
=>
when
(
i
.
U
>
offset
||
(
isReplay
&&
i
.
U
===
offset
))
{
// replay will not commit
val
offset
=
Mux
(
io
.
flush
,
io
.
flushOffset
,
io
.
redirect
.
bits
.
ftqOffset
)
commitStateQueue
(
idx
.
value
).
zipWithIndex
.
foreach
({
case
(
s
,
i
)
=>
when
(
i
.
U
>
offset
){
s
:=
s_invalid
}
})
...
...
src/main/scala/xiangshan/backend/roq/Roq.scala
浏览文件 @
282a07b1
...
...
@@ -438,8 +438,9 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
val
dirty_fs
=
Mux
(
io
.
commits
.
isWalk
,
false
.
B
,
Cat
(
fpWen
).
orR
())
// when mispredict branches writeback, stop commit in the next 2 cycles
// TODO: don't check all exu write back
val
misPredWb
=
Cat
(
VecInit
((
0
until
numWbPorts
).
map
(
i
=>
io
.
exeWbResults
(
i
).
bits
.
redirect
.
cfiUpdate
.
isMisPred
&&
io
.
exeWbResults
(
i
).
v
alid
io
.
exeWbResults
(
i
).
bits
.
redirect
.
cfiUpdate
.
isMisPred
&&
io
.
exeWbResults
(
i
).
bits
.
redirectV
alid
))).
orR
()
val
misPredBlockCounter
=
Reg
(
UInt
(
2.
W
))
misPredBlockCounter
:=
Mux
(
misPredWb
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录