Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
ca18e2c6
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 搜索 >>
提交
ca18e2c6
编写于
8月 09, 2022
作者:
Z
zhanglinjuan
提交者:
William Wang
11月 18, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
MainPipe: fix fanout of regs in stage 3 (#1718)
上级
0a47e4a1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
48 addition
and
33 deletion
+48
-33
src/main/scala/xiangshan/cache/dcache/mainpipe/MainPipe.scala
...main/scala/xiangshan/cache/dcache/mainpipe/MainPipe.scala
+48
-33
未找到文件。
src/main/scala/xiangshan/cache/dcache/mainpipe/MainPipe.scala
浏览文件 @
ca18e2c6
...
...
@@ -517,20 +517,6 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
}
val
miss_new_coh
=
ClientMetadata
(
missCohGen
(
s3_req_cmd_dup
(
2
),
s3_req
.
miss_param
,
s3_req
.
miss_dirty
))
val
new_coh
=
Mux
(
miss_update_meta
,
miss_new_coh
,
Mux
(
probe_update_meta
,
probe_new_coh
,
Mux
(
store_update_meta
||
amo_update_meta
,
s3_new_hit_coh
,
ClientMetadata
.
onReset
)
)
)
// LR, SC and AMO
val
debug_sc_fail_addr
=
RegInit
(
0.
U
)
val
debug_sc_fail_cnt
=
RegInit
(
0.
U
(
8.
W
))
...
...
@@ -602,22 +588,7 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
// assert(debug_sc_fail_cnt < 100.U, "L1DCache failed too many SCs in a row")
val
banked_amo_wmask
=
UIntToOH
(
s3_req
.
word_idx
)
// val banked_wmask = s3_banked_store_wmask
val
banked_wmask
=
Mux
(
s3_req_miss_dup
(
1
),
banked_full_wmask
,
Mux
(
s3_store_hit
,
s3_banked_store_wmask
,
Mux
(
s3_can_do_amo_write
,
banked_amo_wmask
,
banked_none_wmask
)
)
)
val
update_data
=
s3_req_miss_dup
(
2
)
||
s3_store_hit_dup
(
0
)
||
s3_can_do_amo_write
assert
(!(
s3_valid
&&
banked_wmask
.
orR
&&
!
update_data
))
// generate write data
// AMO hits
...
...
@@ -642,7 +613,6 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
0.
U
(
wordBytes
.
W
)
)
s3_amo_data_merged
(
i
)
:=
mergePutData
(
old_data
,
new_data
,
wmask
)
// s3_sc_data_merged(i) := amo_bitmask & s3_req.amo_data | ~amo_bitmask & old_data
s3_sc_data_merged
(
i
)
:=
mergePutData
(
old_data
,
s3_req
.
amo_data
,
Mux
(
s3_req_word_idx_dup
(
i
)
===
i
.
U
&&
!
s3_sc_fail
,
s3_req
.
amo_mask
,
0.
U
(
wordBytes
.
W
))
)
...
...
@@ -772,6 +742,20 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
val
s3_fire_dup_for_meta_w_valid
=
s3_valid_dup_for_meta_w_valid
&&
s3_can_go_dup_for_meta_w_valid
when
(
do_amoalu_dup_for_meta_w_valid
)
{
s3_s_amoalu_dup_for_meta_w_valid
:=
true
.
B
}
when
(
s3_fire_dup_for_meta_w_valid
)
{
s3_s_amoalu_dup_for_meta_w_valid
:=
false
.
B
}
val
new_coh
=
Mux
(
miss_update_meta_dup_for_meta_w_valid
,
miss_new_coh
,
Mux
(
probe_update_meta
,
probe_new_coh_dup_for_meta_w_valid
,
Mux
(
store_update_meta_dup_for_meta_w_valid
||
amo_update_meta_dup_for_meta_w_valid
,
s3_new_hit_coh_dup_for_meta_w_valid
,
ClientMetadata
.
onReset
)
)
)
// -------------------------------------------------------------------------------------
// ---------------- duplicate regs for err_write.valid to solve fanout -----------------
...
...
@@ -1047,6 +1031,37 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
val
s3_fire_dup_for_data_w_valid
=
s3_valid_dup_for_data_w_valid
&&
s3_can_go_dup_for_data_w_valid
when
(
do_amoalu_dup_for_data_w_valid
)
{
s3_s_amoalu_dup_for_data_w_valid
:=
true
.
B
}
when
(
s3_fire_dup_for_data_w_valid
)
{
s3_s_amoalu_dup_for_data_w_valid
:=
false
.
B
}
val
s3_banked_store_wmask_dup_for_data_w_valid
=
RegEnable
(
s2_banked_store_wmask
,
s2_fire_to_s3
)
val
s3_req_word_idx_dup_for_data_w_valid
=
RegEnable
(
s2_req
.
word_idx
,
s2_fire_to_s3
)
val
banked_wmask
=
Mux
(
s3_req_miss_dup_for_data_w_valid
,
banked_full_wmask
,
Mux
(
s3_store_hit_dup_for_data_w_valid
,
s3_banked_store_wmask_dup_for_data_w_valid
,
Mux
(
s3_can_do_amo_write_dup_for_data_w_valid
,
UIntToOH
(
s3_req_word_idx_dup_for_data_w_valid
),
banked_none_wmask
)
)
)
assert
(!(
s3_valid
&&
banked_wmask
.
orR
&&
!
update_data
))
val
s3_sc_data_merged_dup_for_data_w_valid
=
Wire
(
Vec
(
DCacheBanks
,
UInt
(
DCacheSRAMRowBits
.
W
)))
val
s3_req_amo_data_dup_for_data_w_valid
=
RegEnable
(
s2_req
.
amo_data
,
s2_fire_to_s3
)
val
s3_req_amo_mask_dup_for_data_w_valid
=
RegEnable
(
s2_req
.
amo_mask
,
s2_fire_to_s3
)
for
(
i
<-
0
until
DCacheBanks
)
{
val
old_data
=
s3_store_data_merged
(
i
)
s3_sc_data_merged_dup_for_data_w_valid
(
i
)
:=
mergePutData
(
old_data
,
s3_req_amo_data_dup_for_data_w_valid
,
Mux
(
s3_req_word_idx_dup_for_data_w_valid
===
i
.
U
&&
!
s3_sc_fail_dup_for_data_w_valid
,
s3_req_amo_mask_dup_for_data_w_valid
,
0.
U
(
wordBytes
.
W
)
)
)
}
// -------------------------------------------------------------------------------------
val
s3_fire
=
s3_valid_dup
(
4
)
&&
s3_can_go
...
...
@@ -1187,11 +1202,11 @@ class MainPipe(implicit p: Parameters) extends DCacheModule with HasPerfEvents {
io
.
data_write
.
bits
.
addr
:=
s3_req_vaddr_dup_for_data_write
io
.
data_write
.
bits
.
wmask
:=
banked_wmask
io
.
data_write
.
bits
.
data
:=
Mux
(
amo_wait_amoalu
,
amo_wait_amoalu
_dup_for_data_w_valid
,
s3_amo_data_merged_reg
,
Mux
(
s3_sc
,
s3_sc_data_merged
,
s3_sc
_dup_for_data_w_valid
,
s3_sc_data_merged
_dup_for_data_w_valid
,
s3_store_data_merged
)
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录