Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
32c63508
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,发现更多精彩内容 >>
提交
32c63508
编写于
8月 31, 2020
作者:
A
Allen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
DCache: make ldu non-blocking.
We do not block it, we nack it and let it go.
上级
7610f3b3
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
27 addition
and
11 deletion
+27
-11
src/main/scala/xiangshan/cache/dcacheWrapper.scala
src/main/scala/xiangshan/cache/dcacheWrapper.scala
+9
-6
src/main/scala/xiangshan/cache/ldu.scala
src/main/scala/xiangshan/cache/ldu.scala
+15
-4
src/main/scala/xiangshan/mem/LoadUnit.scala
src/main/scala/xiangshan/mem/LoadUnit.scala
+3
-1
未找到文件。
src/main/scala/xiangshan/cache/dcacheWrapper.scala
浏览文件 @
32c63508
...
...
@@ -218,9 +218,10 @@ class DCacheImp(outer: DCache) extends LazyModuleImp(outer) with HasDCacheParame
loadArb
.
io
.
in
(
1
)
<>
lsu_0
.
req
assert
(!(
lsu_0
.
req
.
fire
()
&&
lsu_0
.
req
.
bits
.
meta
.
replay
),
"LSU should not replay requests"
)
assert
(!(
loadReplay
.
req
.
fire
()
&&
!
loadReplay
.
req
.
bits
.
meta
.
replay
),
"LoadMissQueue should replay requests"
)
val
ldu_0_block
=
block_load
(
loadArb
.
io
.
out
.
bits
.
addr
)
// do not block replayed reqs
block_decoupled
(
loadArb
.
io
.
out
,
ldu_0
.
req
,
ldu_0_block
&&
!
loadArb
.
io
.
out
.
bits
.
meta
.
replay
)
val
ldu_0_nack
=
nack_load
(
loadArb
.
io
.
out
.
bits
.
addr
)
// do not nack replayed reqs
ldu_0
.
req
<>
loadArb
.
io
.
out
ldu
(
0
).
io
.
nack
:=
ldu_0_nack
&&
!
loadArb
.
io
.
out
.
bits
.
meta
.
replay
ldu_0
.
resp
.
ready
:=
false
.
B
...
...
@@ -242,8 +243,10 @@ class DCacheImp(outer: DCache) extends LazyModuleImp(outer) with HasDCacheParame
ldu_0
.
s1_kill
:=
lsu_0
.
s1_kill
for
(
w
<-
1
until
LoadPipelineWidth
)
{
val
load_w_block
=
block_load
(
io
.
lsu
.
load
(
w
).
req
.
bits
.
addr
)
block_decoupled
(
io
.
lsu
.
load
(
w
).
req
,
ldu
(
w
).
io
.
lsu
.
req
,
load_w_block
)
val
load_w_nack
=
nack_load
(
io
.
lsu
.
load
(
w
).
req
.
bits
.
addr
)
ldu
(
w
).
io
.
lsu
.
req
<>
io
.
lsu
.
load
(
w
).
req
ldu
(
w
).
io
.
nack
:=
load_w_nack
ldu
(
w
).
io
.
lsu
.
resp
<>
io
.
lsu
.
load
(
w
).
resp
ldu
(
w
).
io
.
lsu
.
s1_kill
<>
io
.
lsu
.
load
(
w
).
s1_kill
assert
(!(
io
.
lsu
.
load
(
w
).
req
.
fire
()
&&
io
.
lsu
.
load
(
w
).
req
.
bits
.
meta
.
replay
),
"LSU should not replay requests"
)
...
...
@@ -464,7 +467,7 @@ class DCacheImp(outer: DCache) extends LazyModuleImp(outer) with HasDCacheParame
TLArbiter
.
lowestFromSeq
(
edge
,
bus
.
c
,
Seq
(
prober
.
io
.
rep
,
wb
.
io
.
release
))
// synchronization stuff
def
blo
ck_load
(
addr
:
UInt
)
=
{
def
na
ck_load
(
addr
:
UInt
)
=
{
val
store_addr_matches
=
VecInit
(
stu
.
io
.
inflight_req_block_addrs
map
(
entry
=>
entry
.
valid
&&
entry
.
bits
===
get_block_addr
(
addr
)))
val
store_addr_match
=
store_addr_matches
.
reduce
(
_
||
_
)
...
...
src/main/scala/xiangshan/cache/ldu.scala
浏览文件 @
32c63508
...
...
@@ -13,12 +13,23 @@ class LoadPipe extends DCacheModule
val
data_resp
=
Input
(
Vec
(
nWays
,
Vec
(
refillCycles
,
Bits
(
encRowBits
.
W
))))
val
meta_read
=
DecoupledIO
(
new
L1MetaReadReq
)
val
meta_resp
=
Input
(
Vec
(
nWays
,
new
L1Metadata
))
// req got nacked in stage 0?
val
nack
=
Input
(
Bool
())
})
// LSU requests
io
.
lsu
.
req
.
ready
:=
io
.
meta_read
.
ready
&&
io
.
data_read
.
ready
io
.
meta_read
.
valid
:=
io
.
lsu
.
req
.
valid
io
.
data_read
.
valid
:=
io
.
lsu
.
req
.
valid
// replayed req should never be nacked
assert
(!(
io
.
lsu
.
req
.
valid
&&
io
.
lsu
.
req
.
bits
.
meta
.
replay
&&
io
.
nack
))
// it you got nacked, you can directly passdown
val
not_nacked_ready
=
io
.
meta_read
.
ready
&&
io
.
data_read
.
ready
val
nacked_ready
=
true
.
B
// ready can wait for valid
io
.
lsu
.
req
.
ready
:=
io
.
lsu
.
req
.
valid
&&
((!
io
.
nack
&&
not_nacked_ready
)
||
(
io
.
nack
&&
nacked_ready
))
io
.
meta_read
.
valid
:=
io
.
lsu
.
req
.
valid
&&
!
io
.
nack
io
.
data_read
.
valid
:=
io
.
lsu
.
req
.
valid
&&
!
io
.
nack
val
meta_read
=
io
.
meta_read
.
bits
val
data_read
=
io
.
data_read
.
bits
...
...
@@ -46,7 +57,7 @@ class LoadPipe extends DCacheModule
val
s1_req
=
RegNext
(
s0_req
)
val
s1_valid
=
RegNext
(
s0_valid
,
init
=
false
.
B
)
val
s1_addr
=
s1_req
.
addr
val
s1_nack
=
false
.
B
val
s1_nack
=
RegNext
(
io
.
nack
)
dump_pipeline_reqs
(
"LoadPipe s1"
,
s1_valid
,
s1_req
)
...
...
src/main/scala/xiangshan/mem/LoadUnit.scala
浏览文件 @
32c63508
...
...
@@ -162,7 +162,9 @@ class LoadUnit extends XSModule {
l4_out
.
bits
.
mask
:=
io
.
dcache
.
resp
.
bits
.
meta
.
mask
// when we can get the data completely from forward
// we no longer need to access dcache
l4_out
.
bits
.
miss
:=
Mux
(
fullForward
,
false
.
B
,
io
.
dcache
.
resp
.
bits
.
miss
)
// treat nack as miss
l4_out
.
bits
.
miss
:=
Mux
(
fullForward
,
false
.
B
,
io
.
dcache
.
resp
.
bits
.
miss
||
io
.
dcache
.
resp
.
bits
.
nack
)
XSDebug
(
io
.
dcache
.
resp
.
fire
(),
p
"DcacheResp(l4): data:0x${Hexadecimal(io.dcache.resp.bits.data)} paddr:0x${Hexadecimal(io.dcache.resp.bits.meta.paddr)} pc:0x${Hexadecimal(io.dcache.resp.bits.meta.uop.cf.pc)} roqIdx:${io.dcache.resp.bits.meta.uop.roqIdx} lsroqIdx:${io.dcache.resp.bits.meta.uop.lsroqIdx} miss:${io.dcache.resp.bits.miss}\n"
)
}
.
otherwise
{
l4_out
.
bits
:=
l4_bundle
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录