Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
36674a2f
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 搜索 >>
提交
36674a2f
编写于
7月 15, 2021
作者:
Z
zoujr
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[WIP]BPU: Fix BIM and FTB bugs
上级
3a01be68
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
27 deletion
+22
-27
src/main/scala/xiangshan/decoupled-frontend/Bim.scala
src/main/scala/xiangshan/decoupled-frontend/Bim.scala
+1
-1
src/main/scala/xiangshan/decoupled-frontend/FTB.scala
src/main/scala/xiangshan/decoupled-frontend/FTB.scala
+21
-26
未找到文件。
src/main/scala/xiangshan/decoupled-frontend/Bim.scala
浏览文件 @
36674a2f
...
...
@@ -50,7 +50,7 @@ class BIM(implicit p: Parameters) extends BasePredictor with BimParams with BPUU
val
s1_read
=
bim
.
io
.
r
.
resp
.
data
io
.
out
.
bits
.
resp
.
s1
.
preds
.
taken_mask
:=
Cat
(
s1_read
(
0
)(
1
),
s1_read
(
1
)(
1
),
0.
U
(
1.
W
))
io
.
out
.
bits
.
resp
.
s1
.
preds
.
taken_mask
:=
Cat
(
0.
U
(
1.
W
),
s1_read
(
1
)(
1
),
s1_read
(
0
)(
1
))
io
.
out
.
bits
.
resp
.
s1
.
meta
:=
s1_read
// TODO: Replace RegNext by RegEnable
...
...
src/main/scala/xiangshan/decoupled-frontend/FTB.scala
浏览文件 @
36674a2f
...
...
@@ -95,8 +95,8 @@ class FTB(implicit p: Parameters) extends BasePredictor with FTBParams {
ftb
.
io
.
r
.
req
.
valid
:=
io
.
s0_fire
ftb
.
io
.
r
.
req
.
bits
.
setIdx
:=
s0_idx
io
.
in
.
ready
:=
ftb
.
io
.
r
.
req
.
ready
&&
!
io
.
flush
.
valid
&&
!
io
.
redirect
.
valid
io
.
out
.
valid
:=
RegEnable
(
RegNext
(
io
.
s0_fire
),
io
.
s1_fire
)
&&
!
io
.
flush
.
valid
&&
!
io
.
redirect
.
valid
io
.
in
.
ready
:=
ftb
.
io
.
r
.
req
.
ready
&&
!
io
.
flush
.
valid
io
.
out
.
valid
:=
RegEnable
(
RegNext
(
io
.
s0_fire
),
io
.
s1_fire
)
&&
!
io
.
flush
.
valid
val
s1_read
=
VecInit
((
0
until
numWays
).
map
(
w
=>
ftb
.
io
.
r
.
resp
.
data
(
w
)
...
...
@@ -139,9 +139,9 @@ class FTB(implicit p: Parameters) extends BasePredictor with FTBParams {
io
.
out
.
bits
.
resp
:=
io
.
in
.
bits
.
resp_in
(
0
)
when
(
s1_hit
)
{
io
.
out
.
bits
.
resp
.
s1
.
preds
.
target
:=
Mux
(
ftb_entry
.
jmpValid
,
jmpTarget
,
Mux
(
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken
,
ParallelMux
(
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken_mask
zip
brTargets
),
s0_pc
+
(
FetchWidth
*
4
).
U
))
io
.
out
.
bits
.
resp
.
s1
.
preds
.
target
:=
Mux
(
(
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken_mask
.
asUInt
&
ftb_entry
.
brValids
.
asUInt
)
=/=
0.
U
,
PriorityMux
(
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken_mask
.
asUInt
&
ftb_entry
.
brValids
.
asUInt
,
ftb_entry
.
brTargets
),
Mux
(
ftb_entry
.
jmpValid
,
ftb_entry
.
jmpTarget
,
s0_pc
+
(
FetchWidth
*
4
).
U
))
}
io
.
out
.
bits
.
resp
.
s1
.
preds
.
taken_mask
:=
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken_mask
...
...
@@ -159,20 +159,20 @@ class FTB(implicit p: Parameters) extends BasePredictor with FTBParams {
io
.
out
.
bits
.
resp
.
s1
.
ftb_entry
:=
ftb_entry
when
(
RegNext
(
s1_hit
))
{
io
.
out
.
bits
.
resp
.
s2
.
preds
.
target
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
target
)
io
.
out
.
bits
.
resp
.
s2
.
hit
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
hit
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_br
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_br
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_jal
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_jal
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_call
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_call
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_ret
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_ret
)
io
.
out
.
bits
.
resp
.
s2
.
meta
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
meta
)
io
.
out
.
bits
.
resp
.
s2
.
ftb_entry
:=
Reg
Next
(
io
.
out
.
bits
.
resp
.
s1
.
ftb_entry
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
target
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
target
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
hit
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
hit
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_br
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_br
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_jal
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_jal
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_call
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_call
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
preds
.
is_ret
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
preds
.
is_ret
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
meta
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
meta
,
io
.
s1_fire
)
io
.
out
.
bits
.
resp
.
s2
.
ftb_entry
:=
Reg
Enable
(
io
.
out
.
bits
.
resp
.
s1
.
ftb_entry
,
io
.
s1_fire
)
}
// override flush logic
io
.
out
.
bits
.
flush_out
.
valid
:=
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
taken
=/=
io
.
in
.
bits
.
resp_in
(
0
).
s2
.
preds
.
taken
||
io
.
in
.
bits
.
resp_in
(
0
).
s1
.
preds
.
target
=/=
io
.
in
.
bits
.
resp_in
(
0
).
s2
.
preds
.
target
io
.
out
.
bits
.
flush_out
.
bits
:=
io
.
in
.
bits
.
resp_in
(
0
).
s2
.
preds
.
target
//
io.out.bits.flush_out.valid := io.in.bits.resp_in(0).s1.preds.taken =/= io.in.bits.resp_in(0).s2.preds.taken ||
//
io.in.bits.resp_in(0).s1.preds.target =/= io.in.bits.resp_in(0).s2.preds.target
//
io.out.bits.flush_out.bits := io.in.bits.resp_in(0).s2.preds.target
// Update logic
val
update
=
io
.
update
.
bits
...
...
@@ -182,18 +182,13 @@ class FTB(implicit p: Parameters) extends BasePredictor with FTBParams {
val
u_meta
=
update
.
meta
.
asTypeOf
(
new
FTBMeta
)
val
u_way
=
u_meta
.
writeWay
val
u_idx
=
ftbAddr
.
getIdx
(
u_pc
)
// val u_is_br = update.br_mask(update.cfi_idx.bits)
val
u_is_br
=
update
.
preds
.
is_br
.
reduce
(
_
||
_
)
&&
update
.
preds
.
taken
// val u_taken = update.cfi_idx.valid && (update.jmp_valid || update.br_mask(update.cfi_idx.bits))
val
u_taken
=
update
.
preds
.
taken
&&
(
update
.
preds
.
is_jal
||
update
.
preds
.
is_br
.
reduce
(
_
||
_
))
val
ftb_write
=
Wire
(
new
FTBEntry
)
ftb_write
.
valid
:=
true
.
B
ftb_write
.
tag
:=
ftbAddr
.
getTag
(
u_pc
)
val
cfi_hit
=
update
.
meta
.
asTypeOf
(
new
FTBMeta
).
hit
val
u_valid
=
RegNext
(
io
.
update
.
valid
)
val
u_way_mask
=
UIntToOH
(
u_way
)
val
ftb_write
=
update
.
ftb_entry
ftb_write
.
valid
:=
true
.
B
ftb_write
.
tag
:=
ftbAddr
.
getTag
(
u_pc
)
ftb
.
io
.
w
.
apply
(
u_valid
,
ftb_write
,
u_idx
,
u_way_mask
)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录