Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
29efe000
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
29efe000
编写于
7月 29, 2020
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Mem: send missReq to missQueue by lsroq
上级
732cc1b3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
43 addition
and
49 deletion
+43
-49
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
+41
-49
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
+2
-0
未找到文件。
src/main/scala/xiangshan/mem/pipeline/Lsroq.scala
浏览文件 @
29efe000
...
...
@@ -37,16 +37,17 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
val
mcommit
=
Input
(
UInt
(
3.
W
))
val
forward
=
Vec
(
LoadPipelineWidth
,
Flipped
(
new
LoadForwardQueryIO
))
val
rollback
=
Output
(
Valid
(
new
Redirect
))
val
miss
=
Vali
d
(
new
MissReqIO
)
val
miss
=
Decouple
d
(
new
MissReqIO
)
})
val
uop
=
Mem
(
LSRoqSize
,
new
MicroOp
)
val
data
=
Reg
(
Vec
(
LSRoqSize
,
new
LsRoqEntry
))
val
allocated
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
val
valid
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
val
writebacked
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
val
store
=
Reg
(
Vec
(
MoqSize
,
Bool
()))
val
miss
=
Reg
(
Vec
(
MoqSize
,
Bool
()))
val
allocated
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
// lsroq entry has been allocated
val
valid
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
// data is valid
val
writebacked
=
RegInit
(
VecInit
(
List
.
fill
(
MoqSize
)(
false
.
B
)))
// inst has been writebacked to CDB
val
store
=
Reg
(
Vec
(
MoqSize
,
Bool
()))
// inst is a store inst
val
miss
=
Reg
(
Vec
(
MoqSize
,
Bool
()))
// load inst missed, waiting for miss queue to accept miss request
val
listening
=
Reg
(
Vec
(
MoqSize
,
Bool
()))
// waiting foe refill result
val
ringBufferHeadExtended
=
RegInit
(
0.
U
(
MoqIdxWidth
.
W
))
val
ringBufferTailExtended
=
RegInit
(
0.
U
(
MoqIdxWidth
.
W
))
...
...
@@ -68,6 +69,7 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
writebacked
(
ringBufferHead
+
offset
)
:=
false
.
B
store
(
ringBufferHead
+
offset
)
:=
false
.
B
miss
(
ringBufferHead
+
offset
)
:=
false
.
B
listening
(
ringBufferHead
+
offset
)
:=
false
.
B
data
(
ringBufferHead
+
offset
).
bwdMask
:=
0.
U
(
8.
W
).
asBools
}
io
.
dp1Req
(
i
).
ready
:=
ringBufferAllowin
&&
!
allocated
(
ringBufferHead
+
offset
)
...
...
@@ -93,44 +95,37 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
// writeback load
(
0
until
LoadPipelineWidth
).
map
(
i
=>
{
assert
(!
io
.
loadIn
(
i
).
bits
.
miss
)
when
(
io
.
loadIn
(
i
).
fire
()){
// when(io.loadIn(i).miss){
// valid(io.loadIn(i).bits.UOPmoqIdx) := true.B
// data(io.loadIn(i).bits.uop.moqIdx).paddr := io.loadIn(i).bits.paddr
// data(io.loadIn(i).bits.uop.moqIdx).mask := io.loadIn(i).bits.mask
// data(io.loadIn(i).bits.uop.moqIdx).data := io.loadIn(i).bits.data
// data(io.loadIn(i).bits.uop.moqIdx).miss := true.B
// data(io.loadIn(i).bits.uop.moqIdx).mmio := io.loadIn(i).bits.mmio
// data(io.loadIn(i).bits.uop.moqIdx).store := false.B
// XSInfo("load miss write to lsroq pc 0x%x vaddr %x paddr %x miss %x mmio %x roll %x\n",
// io.loadIn(i).bits.uop.cf.pc,
// io.loadIn(i).bits.vaddr,
// io.loadIn(i).bits.paddr,
// io.loadIn(i).bits.miss,
// io.loadIn(i).bits.mmio,
// io.loadIn(i).bits.rollback
// )
// }.otherwise{
assert
(!
io
.
loadIn
(
i
).
bits
.
miss
)
valid
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
true
.
B
writebacked
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
true
.
B
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
paddr
:=
io
.
loadIn
(
i
).
bits
.
paddr
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
mask
:=
io
.
loadIn
(
i
).
bits
.
mask
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
data
:=
io
.
loadIn
(
i
).
bits
.
data
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
mmio
:=
io
.
loadIn
(
i
).
bits
.
mmio
miss
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
io
.
loadIn
(
i
).
bits
.
miss
store
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
false
.
B
XSInfo
(
io
.
loadIn
(
i
).
valid
,
"load hit write to cbd idx %d pc 0x%x vaddr %x paddr %x data %x miss %x mmio %x roll %x\n"
,
when
(
io
.
loadIn
(
i
).
bits
.
miss
){
XSInfo
(
io
.
loadIn
(
i
).
valid
,
"load miss write to cbd idx %d pc 0x%x vaddr %x paddr %x data %x mmio %x roll %x\n"
,
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
,
io
.
loadIn
(
i
).
bits
.
uop
.
cf
.
pc
,
io
.
loadIn
(
i
).
bits
.
vaddr
,
io
.
loadIn
(
i
).
bits
.
paddr
,
io
.
loadIn
(
i
).
bits
.
data
,
io
.
loadIn
(
i
).
bits
.
miss
,
io
.
loadIn
(
i
).
bits
.
mmio
,
io
.
loadIn
(
i
).
bits
.
rollback
)
// }
}.
otherwise
{
XSInfo
(
io
.
loadIn
(
i
).
valid
,
"load hit write to cbd idx %d pc 0x%x vaddr %x paddr %x data %x mmio %x roll %x\n"
,
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
,
io
.
loadIn
(
i
).
bits
.
uop
.
cf
.
pc
,
io
.
loadIn
(
i
).
bits
.
vaddr
,
io
.
loadIn
(
i
).
bits
.
paddr
,
io
.
loadIn
(
i
).
bits
.
data
,
io
.
loadIn
(
i
).
bits
.
mmio
,
io
.
loadIn
(
i
).
bits
.
rollback
)
}
valid
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
!
io
.
loadIn
(
i
).
bits
.
miss
writebacked
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
!
io
.
loadIn
(
i
).
bits
.
miss
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
paddr
:=
io
.
loadIn
(
i
).
bits
.
paddr
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
mask
:=
io
.
loadIn
(
i
).
bits
.
mask
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
data
:=
io
.
loadIn
(
i
).
bits
.
data
data
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
).
mmio
:=
io
.
loadIn
(
i
).
bits
.
mmio
miss
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
io
.
loadIn
(
i
).
bits
.
miss
store
(
io
.
loadIn
(
i
).
bits
.
uop
.
moqIdx
)
:=
false
.
B
}
})
...
...
@@ -182,20 +177,16 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
})
// cache miss request
// TODO
io
.
miss
.
valid
:=
false
.
B
io
.
miss
:=
DontCare
// val missRefillSelVec = VecInit(
// (0 until MoqSize).map(i => allocated(i) && valid(i) && miss(i))
// )
// val missRefillSel = OHToUInt(missRefillSelVec.asUInt)
// io.miss.req.valid := missRefillSelVec.orR
// io.miss.req.bits.addr := data(missRefillSel).paddr
// when(io.fire()){
// valid(missRefillSel) := false.B
// miss(missRefillSel) := false.B
// // TODO: re-exec missed inst
// }
val
missRefillSelVec
=
VecInit
(
(
0
until
MoqSize
).
map
(
i
=>
allocated
(
i
)
&&
miss
(
i
))
)
val
missRefillSel
=
OHToUInt
(
missRefillSelVec
.
asUInt
)
io
.
miss
.
valid
:=
missRefillSelVec
.
asUInt
.
orR
io
.
miss
.
bits
.
paddr
:=
data
(
missRefillSel
).
paddr
when
(
io
.
miss
.
fire
()){
miss
(
missRefillSel
)
:=
false
.
B
listening
(
missRefillSel
)
:=
true
.
B
}
// get load result from refill resp
// TODO
...
...
@@ -455,6 +446,7 @@ class Lsroq(implicit val p: XSConfig) extends XSModule with HasMEMConst {
PrintFlag
(
writebacked
(
i
),
"w"
)
PrintFlag
(
store
(
i
),
"s"
)
PrintFlag
(
miss
(
i
),
"m"
)
PrintFlag
(
listening
(
i
),
"l"
)
XSDebug
(
false
,
true
.
B
,
" "
)
if
(
i
%
4
==
3
)
XSDebug
(
false
,
true
.
B
,
"\n"
)
}
...
...
src/main/scala/xiangshan/mem/pipeline/Lsu.scala
浏览文件 @
29efe000
...
...
@@ -101,6 +101,8 @@ class Lsu(implicit val p: XSConfig) extends XSModule with HasMEMConst {
io
.
rollback
<>
lsroq
.
io
.
rollback
io
.
dcache
.
redirect
:=
io
.
redirect
lsroq
.
io
.
miss
.
ready
:=
DontCare
// TODO
def
genWmask
(
addr
:
UInt
,
sizeEncode
:
UInt
)
:
UInt
=
{
LookupTree
(
sizeEncode
,
List
(
"b00"
.
U
->
0x1
.
U
,
//0001 << addr(2:0)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录