Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
52bd42c2
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 搜索 >>
提交
52bd42c2
编写于
8月 17, 2020
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
lsroq: optimize lsroqViolation logic
上级
5c18a2d3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
21 addition
and
20 deletion
+21
-20
src/main/scala/xiangshan/mem/Lsroq.scala
src/main/scala/xiangshan/mem/Lsroq.scala
+21
-20
未找到文件。
src/main/scala/xiangshan/mem/Lsroq.scala
浏览文件 @
52bd42c2
...
...
@@ -434,8 +434,9 @@ class Lsroq extends XSModule {
def
getFirstOne
(
mask
:
Vec
[
Bool
],
start
:
UInt
)
=
{
val
length
=
mask
.
length
val
lowMask
=
(
1.
U
((
length
+
1
).
W
)
<<
start
).
asUInt
()
-
1.
U
val
highBits
=
(
0
until
length
).
map
(
i
=>
mask
(
i
)
&
lowMask
(
i
))
Mux
(
Cat
(
highBits
).
orR
(),
PriorityEncoder
(
highBits
),
PriorityEncoder
(
mask
))
val
highBits
=
(
0
until
length
).
map
(
i
=>
mask
(
i
)
&
~
lowMask
(
i
))
val
highBitsUint
=
Cat
(
highBits
.
reverse
)
PriorityEncoder
(
Mux
(
highBitsUint
.
orR
(),
highBitsUint
,
mask
.
asUInt
))
}
def
getOldestInTwo
(
valid
:
Seq
[
Bool
],
uop
:
Seq
[
MicroOp
])
=
{
...
...
@@ -458,33 +459,33 @@ class Lsroq extends XSModule {
})
}
def
rangeMask
(
start
:
UInt
,
end
:
UInt
)
:
UInt
=
{
val
startMask
=
(
1.
U
((
LsroqSize
+
1
).
W
)
<<
start
(
InnerLsroqIdxWidth
-
1
,
0
)).
asUInt
-
1.
U
val
endMask
=
(
1.
U
((
LsroqSize
+
1
).
W
)
<<
end
(
InnerLsroqIdxWidth
-
1
,
0
)).
asUInt
-
1.
U
val
xorMask
=
startMask
(
LsroqSize
-
1
,
0
)
^
endMask
(
LsroqSize
-
1
,
0
)
Mux
(
start
(
InnerLsroqIdxWidth
)
===
end
(
InnerLsroqIdxWidth
),
xorMask
,
~
xorMask
)
}
// store backward query and rollback
// val needCheck = Seq.fill(8)(WireInit(true.B))
(
0
until
StorePipelineWidth
).
foreach
(
i
=>
{
rollback
(
i
)
:=
DontCare
when
(
io
.
storeIn
(
i
).
valid
)
{
val
needCheck
=
Seq
.
fill
(
LsroqSize
+
1
)(
Seq
.
fill
(
8
)(
WireInit
(
true
.
B
)))
// TODO: refactor
val
startIndex
=
io
.
storeIn
(
i
).
bits
.
uop
.
lsroqIdx
(
InnerLsroqIdxWidth
-
1
,
0
)
val
toEnqPtrMask
=
rangeMask
(
io
.
storeIn
(
i
).
bits
.
uop
.
lsroqIdx
,
ringBufferHeadExtended
)
val
lsroqViolationVec
=
VecInit
((
0
until
LsroqSize
).
map
(
j
=>
{
val
ptr
=
io
.
storeIn
(
i
).
bits
.
uop
.
lsroqIdx
+
j
.
U
val
reachHead
=
(
ptr
+
1.
U
)
===
ringBufferHeadExtended
val
addrMatch
=
allocated
(
ptr
)
&&
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
data
(
ptr
).
paddr
(
PAddrBits
-
1
,
3
)
val
mask
=
data
(
ptr
).
mask
val
s
=
store
(
ptr
)
val
w
=
writebacked
(
ptr
)
val
v
=
valid
(
ptr
)
val
violationVec
=
(
0
until
8
)
map
(
k
=>
{
needCheck
(
j
+
1
)(
k
)
:=
needCheck
(
j
)(
k
)
&&
!(
addrMatch
&&
s
&&
mask
(
k
))
&&
!
reachHead
needCheck
(
j
)(
k
)
&&
addrMatch
&&
mask
(
k
)
&&
io
.
storeIn
(
i
).
bits
.
mask
(
k
)
&&
!
s
&&
v
// TODO: update refilled data
})
Cat
(
violationVec
).
orR
()
val
addrMatch
=
allocated
(
j
)
&&
io
.
storeIn
(
i
).
bits
.
paddr
(
PAddrBits
-
1
,
3
)
===
data
(
j
).
paddr
(
PAddrBits
-
1
,
3
)
val
entryNeedCheck
=
toEnqPtrMask
(
j
)
&&
addrMatch
&&
!
store
(
j
)
&&
valid
(
j
)
// TODO: update refilled data
val
violationVec
=
(
0
until
8
).
map
(
k
=>
data
(
j
).
mask
(
k
)
&&
io
.
storeIn
(
i
).
bits
.
mask
(
k
))
Cat
(
violationVec
).
orR
()
&&
entryNeedCheck
}))
val
lsroqViolation
=
lsroqViolationVec
.
asUInt
().
orR
()
val
lsroqViolationIndex
=
io
.
storeIn
(
i
).
bits
.
uop
.
lsroqIdx
+
PriorityEncoder
(
lsroqViolationVec
)
val
lsroqViolationIndex
=
getFirstOne
(
lsroqViolationVec
,
startIndex
)
val
lsroqViolationUop
=
uop
(
lsroqViolationIndex
)
XSDebug
(
lsroqViolation
,
p
"${Binary(Cat(lsroqViolationVec))}, $
lsroqViolationIndex
"
)
XSDebug
(
lsroqViolation
,
p
"${Binary(Cat(lsroqViolationVec))}, $
startIndex, $lsroqViolationIndex\n
"
)
// when l/s writeback to roq together, check if rollback is needed
val
wbViolationVec
=
VecInit
((
0
until
LoadPipelineWidth
).
map
(
j
=>
{
...
...
@@ -495,7 +496,7 @@ class Lsroq extends XSModule {
}))
val
wbViolation
=
wbViolationVec
.
asUInt
().
orR
()
val
wbViolationUop
=
getOldestInTwo
(
wbViolationVec
,
io
.
loadIn
.
map
(
_
.
bits
.
uop
))
XSDebug
(
wbViolation
,
p
"${Binary(Cat(wbViolationVec))}, $wbViolationUop"
)
XSDebug
(
wbViolation
,
p
"${Binary(Cat(wbViolationVec))}, $wbViolationUop
\n
"
)
// check if rollback is needed for load in l4
val
l4ViolationVec
=
VecInit
((
0
until
LoadPipelineWidth
).
map
(
j
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录