Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
e6aa9709
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
10 个月 前同步成功
通知
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 搜索 >>
提交
e6aa9709
编写于
8月 05, 2020
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Roq, Lsroq: add replay support
上级
2b2ffe78
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
31 addition
and
9 deletion
+31
-9
src/main/scala/xiangshan/backend/Backend.scala
src/main/scala/xiangshan/backend/Backend.scala
+1
-0
src/main/scala/xiangshan/backend/roq/Roq.scala
src/main/scala/xiangshan/backend/roq/Roq.scala
+13
-0
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
+17
-9
未找到文件。
src/main/scala/xiangshan/backend/Backend.scala
浏览文件 @
e6aa9709
...
...
@@ -205,6 +205,7 @@ class Backend extends XSModule
dispatch
.
io
.
redirect
<>
redirect
dispatch
.
io
.
fromRename
<>
rename
.
io
.
out
roq
.
io
.
memRedirect
<>
io
.
mem
.
replayAll
roq
.
io
.
brqRedirect
<>
brq
.
io
.
redirect
roq
.
io
.
dp1Req
<>
dispatch
.
io
.
toRoq
dispatch
.
io
.
roqIdxs
<>
roq
.
io
.
roqIdxs
...
...
src/main/scala/xiangshan/backend/roq/Roq.scala
浏览文件 @
e6aa9709
...
...
@@ -12,6 +12,7 @@ import xiangshan.backend.decode.XSTrap
class
Roq
extends
XSModule
{
val
io
=
IO
(
new
Bundle
()
{
val
brqRedirect
=
Input
(
Valid
(
new
Redirect
))
val
memRedirect
=
Input
(
Valid
(
new
Redirect
))
val
dp1Req
=
Vec
(
RenameWidth
,
Flipped
(
DecoupledIO
(
new
MicroOp
)))
val
roqIdxs
=
Output
(
Vec
(
RenameWidth
,
UInt
(
RoqIdxWidth
.
W
)))
val
redirect
=
Output
(
Valid
(
new
Redirect
))
...
...
@@ -27,6 +28,7 @@ class Roq extends XSModule {
val
microOp
=
Mem
(
RoqSize
,
new
MicroOp
)
val
valid
=
RegInit
(
VecInit
(
List
.
fill
(
RoqSize
)(
false
.
B
)))
val
flag
=
RegInit
(
VecInit
(
List
.
fill
(
RoqSize
)(
false
.
B
)))
val
writebacked
=
Reg
(
Vec
(
RoqSize
,
Bool
()))
val
exuData
=
Reg
(
Vec
(
RoqSize
,
UInt
(
XLEN
.
W
)))
//for debug
...
...
@@ -57,6 +59,7 @@ class Roq extends XSModule {
when
(
io
.
dp1Req
(
i
).
fire
()){
microOp
(
ringBufferHead
+
offset
)
:=
io
.
dp1Req
(
i
).
bits
valid
(
ringBufferHead
+
offset
)
:=
true
.
B
flag
(
ringBufferHead
+
offset
)
:=
(
ringBufferHeadExtended
+
offset
).
head
(
1
).
asBool
()
writebacked
(
ringBufferHead
+
offset
)
:=
false
.
B
when
(
csrEnRoq
(
i
)){
hasCsr
:=
true
.
B
}
}
...
...
@@ -227,6 +230,16 @@ class Roq extends XSModule {
XSDebug
(
"roq full, switched to s_extrawalk. needExtraSpaceForMPR: %b\n"
,
needExtraSpaceForMPR
.
asUInt
)
}
// when rollback, reset writebacked entry to valid
when
(
io
.
brqRedirect
.
valid
&&
io
.
brqRedirect
.
bits
.
isReplay
){
// TODO: opt timing
for
(
i
<-
0
until
RoqSize
)
{
val
recRoqIdx
=
Cat
(
flag
(
i
).
asUInt
,
i
.
U
)
when
(
valid
(
i
)
&&
io
.
memRedirect
.
bits
.
isAfter
(
recRoqIdx
)){
writebacked
(
i
)
:=
false
.
B
}
}
}
// when exception occurs, cancels all
when
(
io
.
redirect
.
valid
)
{
ringBufferHeadExtended
:=
0.
U
...
...
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
浏览文件 @
e6aa9709
...
...
@@ -92,15 +92,6 @@ class Lsroq extends XSModule {
XSInfo
(
"dispatched %d insts to moq\n"
,
PopCount
(
firedDispatch
))
}
// misprediction recovery / exception redirect
// invalidate lsroq term using robIdx
// TODO: check exception redirect implementation
(
0
until
MoqSize
).
map
(
i
=>
{
when
(
uop
(
i
).
needFlush
(
io
.
brqRedirect
)
&&
allocated
(
i
)
&&
!
commited
(
i
))
{
allocated
(
i
)
:=
false
.
B
}
})
// writeback load
(
0
until
LoadPipelineWidth
).
map
(
i
=>
{
assert
(!
io
.
loadIn
(
i
).
bits
.
miss
)
...
...
@@ -506,6 +497,23 @@ class Lsroq extends XSModule {
io
.
rollback
:=
ParallelOperation
(
rollback
,
rollbackSel
)
// misprediction recovery / exception redirect
// invalidate lsroq term using robIdx
// TODO: check exception redirect implementation
(
0
until
MoqSize
).
map
(
i
=>
{
when
(
uop
(
i
).
needFlush
(
io
.
brqRedirect
)
&&
allocated
(
i
)
&&
!
commited
(
i
))
{
when
(
io
.
brqRedirect
.
bits
.
isReplay
){
valid
(
i
)
:=
false
.
B
store
(
i
)
:=
false
.
B
writebacked
(
i
)
:=
false
.
B
listening
(
i
)
:=
false
.
B
miss
(
i
)
:=
false
.
B
}.
otherwise
{
allocated
(
i
)
:=
false
.
B
}
}
})
// assert(!io.rollback.valid)
when
(
io
.
rollback
.
valid
)
{
XSDebug
(
"Mem rollback: pc %x roqidx %d\n"
,
io
.
rollback
.
bits
.
pc
,
io
.
rollback
.
bits
.
roqIdx
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录