Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
28ca676d
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 搜索 >>
提交
28ca676d
编写于
3月 17, 2021
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
StoreSet: put SSIT into decode stage
上级
b1e51a50
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
45 addition
and
32 deletion
+45
-32
src/main/scala/xiangshan/Bundle.scala
src/main/scala/xiangshan/Bundle.scala
+1
-1
src/main/scala/xiangshan/XSCore.scala
src/main/scala/xiangshan/XSCore.scala
+1
-1
src/main/scala/xiangshan/backend/decode/DecodeStage.scala
src/main/scala/xiangshan/backend/decode/DecodeStage.scala
+12
-1
src/main/scala/xiangshan/backend/decode/StoreSet.scala
src/main/scala/xiangshan/backend/decode/StoreSet.scala
+28
-28
src/main/scala/xiangshan/backend/dispatch/Dispatch1.scala
src/main/scala/xiangshan/backend/dispatch/Dispatch1.scala
+1
-1
src/main/scala/xiangshan/frontend/Ibuffer.scala
src/main/scala/xiangshan/frontend/Ibuffer.scala
+2
-0
未找到文件。
src/main/scala/xiangshan/Bundle.scala
浏览文件 @
28ca676d
...
...
@@ -182,6 +182,7 @@ class CtrlFlow extends XSBundle {
val
crossPageIPFFix
=
Bool
()
val
storeSetHit
=
Bool
()
// inst has been allocated an store set
val
loadWaitBit
=
Bool
()
// load inst should not be executed until all former store addr calcuated
val
ssid
=
UInt
(
SSIDWidth
.
W
)
val
ftqPtr
=
new
FtqPtr
val
ftqOffset
=
UInt
(
log2Up
(
PredictWidth
).
W
)
}
...
...
@@ -302,7 +303,6 @@ class MicroOp extends CfCtrl {
val
roqIdx
=
new
RoqPtr
val
lqIdx
=
new
LqPtr
val
sqIdx
=
new
SqPtr
val
ssid
=
UInt
(
SSIDWidth
.
W
)
val
diffTestDebugLrScValid
=
Bool
()
val
debugInfo
=
new
PerfDebugInfo
}
...
...
src/main/scala/xiangshan/XSCore.scala
浏览文件 @
28ca676d
...
...
@@ -281,9 +281,9 @@ trait HasXSParameter {
// load violation predict
val
ResetTimeMax2Pow
=
20
//1078576
val
ResetTimeMin2Pow
=
10
//1024
val
MemPredPCWidth
=
log2Up
(
WaitTableSize
)
// wait table parameters
val
WaitTableSize
=
1024
val
MemPredPCWidth
=
log2Up
(
WaitTableSize
)
// store set parameters
val
SSITSize
=
WaitTableSize
val
LFSTSize
=
32
...
...
src/main/scala/xiangshan/backend/decode/DecodeStage.scala
浏览文件 @
28ca676d
...
...
@@ -18,7 +18,12 @@ class DecodeStage extends XSModule {
})
val
decoders
=
Seq
.
fill
(
DecodeWidth
)(
Module
(
new
DecodeUnit
))
// basic wait table load violation predictor (for debug only)
val
waittable
=
Module
(
new
WaitTable
)
// store set load violation predictor stage 1: SSIT look up
val
ssit
=
Module
(
new
SSIT
)
for
(
i
<-
0
until
DecodeWidth
)
{
decoders
(
i
).
io
.
enq
.
ctrl_flow
<>
io
.
in
(
i
).
bits
...
...
@@ -26,15 +31,21 @@ class DecodeStage extends XSModule {
waittable
.
io
.
raddr
(
i
)
:=
io
.
in
(
i
).
bits
.
foldpc
decoders
(
i
).
io
.
enq
.
ctrl_flow
.
loadWaitBit
:=
waittable
.
io
.
rdata
(
i
)
// read SSIT, get SSID
ssit
.
io
.
raddr
(
i
)
:=
io
.
in
(
i
).
bits
.
foldpc
decoders
(
i
).
io
.
enq
.
ctrl_flow
.
storeSetHit
:=
ssit
.
io
.
rdata
(
i
).
valid
decoders
(
i
).
io
.
enq
.
ctrl_flow
.
ssid
:=
ssit
.
io
.
rdata
(
i
).
ssid
io
.
out
(
i
).
valid
:=
io
.
in
(
i
).
valid
io
.
out
(
i
).
bits
:=
decoders
(
i
).
io
.
deq
.
cf_ctrl
io
.
in
(
i
).
ready
:=
io
.
out
(
i
).
ready
}
for
(
i
<-
0
until
StorePipelineWidth
)
{
waittable
.
io
.
update
(
i
)
<>
RegNext
(
io
.
memPredUpdate
(
i
))
}
waittable
.
io
.
csrCtrl
<>
io
.
csrCtrl
ssit
.
io
.
update
<>
RegNext
(
io
.
memPredUpdate
(
0
))
ssit
.
io
.
csrCtrl
<>
io
.
csrCtrl
val
loadWaitBitSet
=
PopCount
(
io
.
out
.
map
(
o
=>
o
.
fire
()
&&
o
.
bits
.
cf
.
loadWaitBit
))
XSPerf
(
"loadWaitBitSet"
,
loadWaitBitSet
)
...
...
src/main/scala/xiangshan/backend/decode/StoreSet.scala
浏览文件 @
28ca676d
...
...
@@ -50,7 +50,7 @@ class SSIT extends XSModule {
// update stage 0
// RegNext(io.update) while reading SSIT entry for necessary information
val
M
emPredUpdateReqReg
=
RegEnable
(
io
.
update
,
enable
=
io
.
update
.
valid
)
val
m
emPredUpdateReqReg
=
RegEnable
(
io
.
update
,
enable
=
io
.
update
.
valid
)
// load has already been assigned with a store set
val
loadAssigned
=
RegNext
(
valid
(
io
.
update
.
ldpc
))
val
loadOldSSID
=
RegNext
(
ssid
(
io
.
update
.
ldpc
))
...
...
@@ -63,45 +63,45 @@ class SSIT extends XSModule {
val
winnerSSID
=
Mux
(
loadIsWinner
,
loadOldSSID
,
storeOldSSID
)
// for now we just use lowest bits of ldpc as store set id
val
ssidAllocate
=
M
emPredUpdateReqReg
.
ldpc
(
SSIDWidth
-
1
,
0
)
val
ssidAllocate
=
m
emPredUpdateReqReg
.
ldpc
(
SSIDWidth
-
1
,
0
)
// update stage 1
when
(
M
emPredUpdateReqReg
.
valid
){
when
(
m
emPredUpdateReqReg
.
valid
){
switch
(
Cat
(
loadAssigned
,
storeAssigned
))
{
// 1. "If neither the load nor the store has been assigned a store set,
// one is allocated and assigned to both instructions."
is
(
Cat
(
false
.
B
,
false
.
B
))
{
valid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
ssidAllocate
valid
(
M
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
M
emPredUpdateReqReg
.
stpc
)
:=
ssidAllocate
is
(
"b00"
.
U
(
2.
W
))
{
valid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
ssidAllocate
valid
(
m
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
m
emPredUpdateReqReg
.
stpc
)
:=
ssidAllocate
}
// 2. "If the load has been assigned a store set, but the store has not,
// the store is assigned the load’s store set."
is
(
Cat
(
true
.
B
,
false
.
B
))
{
valid
(
M
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
M
emPredUpdateReqReg
.
stpc
)
:=
loadOldSSID
is
(
"b10"
.
U
(
2.
W
))
{
valid
(
m
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
m
emPredUpdateReqReg
.
stpc
)
:=
loadOldSSID
}
// 3. "If the store has been assigned a store set, but the load has not,
// the load is assigned the store’s store set."
is
(
Cat
(
false
.
B
,
true
.
B
))
{
valid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
storeOldSSID
is
(
"b01"
.
U
(
2.
W
))
{
valid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
storeOldSSID
}
// 4. "If both the load and the store have already been assigned store sets,
// one of the two store sets is declared the "winner".
// The instruction belonging to the loser’s store set is assigned the winner’s store set."
is
(
Cat
(
true
.
B
,
true
.
B
))
{
valid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
M
emPredUpdateReqReg
.
ldpc
)
:=
winnerSSID
valid
(
M
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
M
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
M
emPredUpdateReqReg
.
stpc
)
:=
winnerSSID
is
(
"b11"
.
U
(
2.
W
))
{
valid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
ldpc
)
:=
true
.
B
ssid
(
m
emPredUpdateReqReg
.
ldpc
)
:=
winnerSSID
valid
(
m
emPredUpdateReqReg
.
stpc
)
:=
true
.
B
isload
(
m
emPredUpdateReqReg
.
stpc
)
:=
false
.
B
ssid
(
m
emPredUpdateReqReg
.
stpc
)
:=
winnerSSID
}
}
}
...
...
@@ -116,8 +116,8 @@ class SSIT extends XSModule {
// debug
for
(
i
<-
0
until
StorePipelineWidth
)
{
when
(
M
emPredUpdateReqReg
.
valid
)
{
XSDebug
(
"%d: SSIT update: load pc %x store pc %x\n"
,
GTimer
(),
MemPredUpdateReqReg
.
ldpc
,
M
emPredUpdateReqReg
.
stpc
)
when
(
m
emPredUpdateReqReg
.
valid
)
{
XSDebug
(
"%d: SSIT update: load pc %x store pc %x\n"
,
GTimer
(),
memPredUpdateReqReg
.
ldpc
,
m
emPredUpdateReqReg
.
stpc
)
XSDebug
(
"%d: SSIT update: load valid %b ssid %x store valid %b ssid %x\n"
,
GTimer
(),
loadAssigned
,
loadOldSSID
,
storeAssigned
,
storeOldSSID
)
}
}
...
...
@@ -177,7 +177,7 @@ class LFST extends XSModule {
// when store is issued, mark it as invalid
(
0
until
exuParameters
.
StuCnt
).
map
(
i
=>
{
when
(
io
.
storeIssue
(
i
).
valid
){
valid
(
io
.
storeIssue
(
i
).
bits
.
uop
.
ssid
)
:=
false
.
B
valid
(
io
.
storeIssue
(
i
).
bits
.
uop
.
cf
.
ssid
)
:=
false
.
B
}
})
...
...
src/main/scala/xiangshan/backend/dispatch/Dispatch1.scala
浏览文件 @
28ca676d
...
...
@@ -133,7 +133,7 @@ class Dispatch1 extends XSModule with HasExceptionNO {
// or io.fromRename(i).ready && updatedUop(i).cf.storeSetHit && isStore(i), which is much slower
io
.
lfst
(
i
).
bits
.
roqIdx
:=
updatedUop
(
i
).
roqIdx
io
.
lfst
(
i
).
bits
.
sqIdx
:=
updatedUop
(
i
).
sqIdx
io
.
lfst
(
i
).
bits
.
ssid
:=
updatedUop
(
i
).
ssid
io
.
lfst
(
i
).
bits
.
ssid
:=
updatedUop
(
i
).
cf
.
ssid
}
...
...
src/main/scala/xiangshan/frontend/Ibuffer.scala
浏览文件 @
28ca676d
...
...
@@ -129,6 +129,8 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
io
.
out
(
i
).
bits
.
crossPageIPFFix
:=
outWire
.
crossPageIPFFix
io
.
out
(
i
).
bits
.
foldpc
:=
outWire
.
foldpc
io
.
out
(
i
).
bits
.
loadWaitBit
:=
DontCare
io
.
out
(
i
).
bits
.
storeSetHit
:=
DontCare
io
.
out
(
i
).
bits
.
ssid
:=
DontCare
}
val
next_head_vec
=
VecInit
(
head_vec
.
map
(
_
+
numDeq
))
ibuf
.
io
.
raddr
:=
VecInit
(
next_head_vec
.
map
(
_
.
value
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录