Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
8b67bf57
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 搜索 >>
提交
8b67bf57
编写于
8月 04, 2020
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Mem: refactor rollback logic
上级
67501993
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
51 addition
and
23 deletion
+51
-23
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
+47
-23
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
+4
-0
未找到文件。
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
浏览文件 @
8b67bf57
...
...
@@ -149,7 +149,7 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
miss
(
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
io
.
storeIn
(
i
).
bits
.
miss
store
(
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
true
.
B
XSInfo
(
"store write to lsroq idx %d pc 0x%x vaddr %x paddr %x data %x miss %x mmio %x roll %x\n"
,
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
,
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
(
InnerMoqIdxWidth
-
1
,
0
)
,
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
,
io
.
storeIn
(
i
).
bits
.
vaddr
,
io
.
storeIn
(
i
).
bits
.
paddr
,
...
...
@@ -416,23 +416,26 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
io
.
forward
(
i
).
forwardMask
(
k
)
:=
true
.
B
io
.
forward
(
i
).
forwardData
(
k
)
:=
data
(
io
.
forward
(
i
).
moqIdx
).
bwdData
(
k
)
XSDebug
(
"backwarding "
+
k
+
"th byte %x, idx %d pc %x\n"
,
io
.
forward
(
i
).
forwardData
(
k
),
io
.
forward
(
i
).
moqIdx
,
uop
(
io
.
forward
(
i
).
moqIdx
).
cf
.
pc
io
.
forward
(
i
).
forwardData
(
k
),
io
.
forward
(
i
).
moqIdx
(
InnerMoqIdxWidth
-
1
,
0
)
,
uop
(
io
.
forward
(
i
).
moqIdx
).
cf
.
pc
)
}
})
})
// rollback check
val
rollback
=
Wire
(
Vec
(
StorePipelineWidth
,
Valid
(
new
Redirect
)))
// def olderThan() TODO
// store backward query and rollback
val
needCheck
=
Seq
.
fill
(
8
)(
WireInit
(
true
.
B
))
(
0
until
StorePipelineWidth
).
map
(
i
=>
{
rollback
(
i
)
:=
DontCare
rollback
(
i
).
valid
:=
false
.
B
when
(
io
.
storeIn
(
i
).
valid
){
val
needCheck
=
Seq
.
fill
(
MoqSize
+
1
)(
Seq
.
fill
(
8
)(
WireInit
(
true
.
B
)))
(
1
until
MoqSize
).
map
(
j
=>
{
val
ptr
=
io
.
forward
(
i
)
.
moqIdx
+
j
.
U
val
needCheck
=
Seq
.
fill
(
MoqSize
+
1
)(
Seq
.
fill
(
8
)(
WireInit
(
true
.
B
)))
// TODO: refactor
(
0
until
MoqSize
).
map
(
j
=>
{
val
ptr
=
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
+
j
.
U
val
reachHead
=
ptr
===
ringBufferHeadExtended
val
addrMatch
=
allocated
(
ptr
)
&&
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
data
(
ptr
).
paddr
(
PAddrBits
-
1
,
3
)
...
...
@@ -446,31 +449,49 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
rollback
(
i
).
bits
.
roqIdx
:=
io
.
storeIn
(
i
).
bits
.
uop
.
roqIdx
rollback
(
i
).
bits
.
target
:=
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
}.
otherwise
{
data
(
ptr
(
InnerMoqIdxWidth
-
1
,
0
)).
bwdMask
(
k
)
:=
true
.
B
data
(
ptr
(
InnerMoqIdxWidth
-
1
,
0
)).
bwdData
(
k
)
:=
io
.
storeIn
(
i
).
bits
.
data
(
8
*(
k
+
1
)-
1
,
8
*
k
)
XSDebug
(
"write backward data: ptr %x
byte %x data %x\n"
,
ptr
(
InnerMoqIdxWidth
-
1
,
0
),
k
.
U
,
io
.
storeIn
(
i
).
bits
.
data
(
8
*(
k
+
1
)-
1
,
8
*
k
))
//
data(ptr(InnerMoqIdxWidth-1,0)).bwdMask(k) := true.B
//
data(ptr(InnerMoqIdxWidth-1,0)).bwdData(k) := io.storeIn(i).bits.data(8*(k+1)-1, 8*k)
// XSDebug("write backward data: ptr %d
byte %x data %x\n", ptr(InnerMoqIdxWidth-1,0), k.U, io.storeIn(i).bits.data(8*(k+1)-1, 8*k))
}
}
needCheck
(
j
+
1
)(
k
)
:=
needCheck
(
j
)(
k
)
&&
!(
addrMatch
&&
_store
)
&&
!
reachHead
})
})
})
// when l/s writeback to roq together, check if rollback is needed
// currently we just rollback (TODO)
when
(
io
.
storeIn
(
i
).
valid
&&
io
.
storeIn
(
i
).
bits
.
uop
.
moqIdx
===
ptr
){
(
0
until
LoadPipelineWidth
).
map
(
j
=>
{
when
(
io
.
loadIn
(
j
).
valid
&&
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
io
.
loadIn
(
j
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
&&
(
io
.
storeIn
(
i
).
bits
.
mask
&
io
.
loadIn
(
j
).
bits
.
mask
).
orR
// when l/s writeback to roq together, check if rollback is needed
// currently we just rollback (TODO)
when
(
io
.
storeIn
(
i
).
valid
){
(
0
until
LoadPipelineWidth
).
map
(
j
=>
{
when
(
io
.
loadIn
(
j
).
valid
&&
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
io
.
loadIn
(
j
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
&&
(
io
.
storeIn
(
i
).
bits
.
mask
&
io
.
loadIn
(
j
).
bits
.
mask
).
orR
// TODO: older than
){
rollback
(
i
).
valid
:=
true
.
B
rollback
(
i
).
bits
.
target
:=
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
rollback
(
i
).
bits
.
roqIdx
:=
io
.
storeIn
(
i
).
bits
.
uop
.
roqIdx
}
})
}
})
XSDebug
(
"need rollback pc %x roqidx %d\n"
,
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
,
io
.
storeIn
(
i
).
bits
.
uop
.
roqIdx
)
}
})
}
// check if rollback is needed for load in l4
when
(
io
.
storeIn
(
i
).
valid
){
(
0
until
LoadPipelineWidth
).
map
(
j
=>
{
when
(
io
.
forward
(
j
).
valid
&&
// L4 valid
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
io
.
forward
(
j
).
paddr
(
PAddrBits
-
1
,
3
)
&&
(
io
.
storeIn
(
i
).
bits
.
mask
&
io
.
forward
(
j
).
mask
).
orR
// TODO: older than
){
XSDebug
(
"need rollback pc %x roqidx %d\n"
,
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
,
io
.
storeIn
(
i
).
bits
.
uop
.
roqIdx
)
rollback
(
i
).
valid
:=
true
.
B
rollback
(
i
).
bits
.
target
:=
io
.
storeIn
(
i
).
bits
.
uop
.
cf
.
pc
rollback
(
i
).
bits
.
roqIdx
:=
io
.
storeIn
(
i
).
bits
.
uop
.
roqIdx
}
})
}
}
})
...
...
@@ -489,7 +510,10 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
)
io
.
rollback
:=
rollback
(
rollbackSel
)
assert
(!
io
.
rollback
.
valid
)
// assert(!io.rollback.valid)
when
(
io
.
rollback
.
valid
){
XSDebug
(
"Mem rollback: pc %x roqidx %d\n"
,
io
.
rollback
.
bits
.
pc
,
io
.
rollback
.
bits
.
roqIdx
)
}
// debug info
XSDebug
(
"head %d:%d tail %d:%d scommit %d\n"
,
ringBufferHeadExtended
(
InnerMoqIdxWidth
),
ringBufferHead
,
ringBufferTailExtended
(
InnerMoqIdxWidth
),
ringBufferTail
,
scommitPending
)
...
...
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
浏览文件 @
8b67bf57
...
...
@@ -66,6 +66,7 @@ class LoadForwardQueryIO extends XSBundle with HasMEMConst {
val
mask
=
Output
(
UInt
(
8.
W
))
val
moqIdx
=
Output
(
UInt
(
MoqIdxWidth
.
W
))
val
pc
=
Output
(
UInt
(
VAddrBits
.
W
))
//for debug
val
valid
=
Output
(
Bool
())
//for debug
val
forwardMask
=
Input
(
Vec
(
8
,
Bool
()))
val
forwardData
=
Input
(
Vec
(
8
,
UInt
(
8.
W
)))
...
...
@@ -215,11 +216,13 @@ class Lsu(implicit val p: XSConfig) extends XSModule with HasMEMConst {
lsroq
.
io
.
forward
(
i
).
mask
:=
io
.
dcache
.
load
(
i
).
resp
.
bits
.
user
.
mask
lsroq
.
io
.
forward
(
i
).
moqIdx
:=
l4_out
(
i
).
bits
.
uop
.
moqIdx
lsroq
.
io
.
forward
(
i
).
pc
:=
l4_out
(
i
).
bits
.
uop
.
cf
.
pc
lsroq
.
io
.
forward
(
i
).
valid
:=
l4_out
(
i
).
valid
sbuffer
.
io
.
forward
(
i
).
paddr
:=
l4_out
(
i
).
bits
.
paddr
sbuffer
.
io
.
forward
(
i
).
mask
:=
io
.
dcache
.
load
(
i
).
resp
.
bits
.
user
.
mask
sbuffer
.
io
.
forward
(
i
).
moqIdx
:=
l4_out
(
i
).
bits
.
uop
.
moqIdx
sbuffer
.
io
.
forward
(
i
).
pc
:=
l4_out
(
i
).
bits
.
uop
.
cf
.
pc
sbuffer
.
io
.
forward
(
i
).
valid
:=
l4_out
(
i
).
valid
val
forwardVec
=
WireInit
(
lsroq
.
io
.
forward
(
i
).
forwardData
)
val
forwardMask
=
WireInit
(
lsroq
.
io
.
forward
(
i
).
forwardMask
)
...
...
@@ -300,6 +303,7 @@ class Lsu(implicit val p: XSConfig) extends XSModule with HasMEMConst {
// Current dcache use MSHR
lsroq
.
io
.
loadIn
(
i
).
bits
:=
l5_in
(
i
).
bits
lsroq
.
io
.
loadIn
(
i
).
bits
.
data
:=
rdataPartialLoad
// for debug
lsroq
.
io
.
loadIn
(
i
).
valid
:=
loadWriteBack
(
i
)
// pipeline control
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录