Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
340ece08
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,发现更多精彩内容 >>
提交
340ece08
编写于
1月 07, 2021
作者:
L
Lingrui98
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
btb: use concatenation to generate target
上级
2c2aca92
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
19 addition
and
13 deletion
+19
-13
src/main/scala/xiangshan/frontend/Btb.scala
src/main/scala/xiangshan/frontend/Btb.scala
+19
-13
未找到文件。
src/main/scala/xiangshan/frontend/Btb.scala
浏览文件 @
340ece08
...
...
@@ -14,18 +14,19 @@ import scala.math.min
trait
BTBParams
extends
HasXSParameter
with
HasIFUConst
{
val
nRows
=
BtbSize
/
(
PredictWidth
*
BtbWays
)
val
offsetLen
=
13
val
lowerBitsSize
=
13
val
extendedNRows
=
nRows
}
class
BtbDataEntry
extends
XSBundle
with
BTBParams
{
val
offset
=
SInt
(
offsetLen
.
W
)
val
lower
=
UInt
(
lowerBitsSize
.
W
)
val
extended
=
Bool
()
}
object
BtbDataEntry
{
def
apply
(
offset
:
S
Int
,
extended
:
Bool
)
=
{
def
apply
(
lower
:
U
Int
,
extended
:
Bool
)
=
{
val
e
=
Wire
(
new
BtbDataEntry
)
e
.
offset
:=
offset
e
.
lower
:=
lower
e
.
extended
:=
extended
e
}
...
...
@@ -156,7 +157,7 @@ class BTB extends BasePredictor with BTBParams{
val
meta_entry
=
if2_metaRead
(
if2_bankHitWays
(
b
))(
b
)
val
data_entry
=
if2_dataRead
(
if2_bankHitWays
(
b
))(
b
)
// Use real pc to calculate the target
io
.
resp
.
targets
(
b
)
:=
Mux
(
data_entry
.
extended
,
if2_edataRead
,
(
if2_pc
.
asSInt
+
(
b
<<
instOffsetBits
).
S
+
data_entry
.
offset
).
asUInt
)
io
.
resp
.
targets
(
b
)
:=
Mux
(
data_entry
.
extended
,
if2_edataRead
,
Cat
(
if2_pc
(
VAddrBits
-
1
,
lowerBitsSize
+
instOffsetBits
),
data_entry
.
lower
,
0.
U
(
instOffsetBits
.
W
))
)
io
.
resp
.
hits
(
b
)
:=
if2_bankHits
(
b
)
io
.
resp
.
types
(
b
)
:=
meta_entry
.
btbType
io
.
resp
.
isRVC
(
b
)
:=
meta_entry
.
isRVC
...
...
@@ -174,11 +175,16 @@ class BTB extends BasePredictor with BTBParams{
}
val
u
=
io
.
update
.
bits
val
max_offset
=
Cat
(
0.
B
,
~(
0.
U
((
offsetLen
-
1
).
W
))).
asSInt
val
min_offset
=
Cat
(
1.
B
,
(
0.
U
((
offsetLen
-
1
).
W
))).
asSInt
// val max_offset = Cat(0.B, ~(0.U((offsetLen-1).W))).asSInt
// val min_offset = Cat(1.B, (0.U((offsetLen-1).W))).asSInt
// val new_offset = (new_target.asSInt - u.pc.asSInt)
val
new_target
=
Mux
(
u
.
pd
.
isBr
,
u
.
brTarget
,
u
.
target
)
val
new_offset
=
(
new_target
.
asSInt
-
u
.
pc
.
asSInt
)
val
new_extended
=
(
new_offset
>
max_offset
||
new_offset
<
min_offset
)
val
new_lower
=
u
.
target
(
lowerBitsSize
+
instOffsetBits
-
1
,
instOffsetBits
)
val
update_pc_higher
=
u
.
pc
(
VAddrBits
-
1
,
lowerBitsSize
+
instOffsetBits
)
val
update_target_higher
=
new_target
(
VAddrBits
-
1
,
lowerBitsSize
+
instOffsetBits
)
val
higher_identical
=
update_pc_higher
===
update_target_higher
// val new_extended = (new_offset > max_offset || new_offset < min_offset)
val
new_extended
=
!
higher_identical
val
updateWay
=
u
.
bpuMeta
.
btbWriteWay
...
...
@@ -187,7 +193,7 @@ class BTB extends BasePredictor with BTBParams{
val
updateRow
=
btbAddr
.
getBankIdx
(
u
.
pc
)
val
updateType
=
pdInfoToBTBtype
(
u
.
pd
)
val
metaWrite
=
BtbMetaEntry
(
btbAddr
.
getTag
(
u
.
pc
),
updateType
,
u
.
pd
.
isRVC
)
val
dataWrite
=
BtbDataEntry
(
new_
offset
,
new_extended
)
val
dataWrite
=
BtbDataEntry
(
new_
lower
,
new_extended
)
val
jalFirstEncountered
=
!
u
.
isMisPred
&&
!
u
.
bpuMeta
.
btbHitJal
&&
updateType
===
BTBtype
.
J
val
updateValid
=
io
.
update
.
valid
&&
(
u
.
isMisPred
||
jalFirstEncountered
)
&&
!
u
.
isReplay
...
...
@@ -222,8 +228,8 @@ class BTB extends BasePredictor with BTBParams{
if
(
debug_verbose
)
{
for
(
i
<-
0
until
BtbBanks
){
for
(
j
<-
0
until
BtbWays
)
{
XSDebug
(
validLatch
,
"read_resp[w=%d][b=%d][r=%d] is valid(%d) mask(%d), tag=0x%x,
offset
=0x%x, type=%d, isExtend=%d, isRVC=%d\n"
,
j
.
U
,
i
.
U
,
if2_row
,
if2_metaRead
(
j
)(
i
).
valid
,
if2_mask
(
i
),
if2_metaRead
(
j
)(
i
).
tag
,
if2_dataRead
(
j
)(
i
).
offset
,
if2_metaRead
(
j
)(
i
).
btbType
,
if2_dataRead
(
j
)(
i
).
extended
,
if2_metaRead
(
j
)(
i
).
isRVC
)
XSDebug
(
validLatch
,
"read_resp[w=%d][b=%d][r=%d] is valid(%d) mask(%d), tag=0x%x,
lower
=0x%x, type=%d, isExtend=%d, isRVC=%d\n"
,
j
.
U
,
i
.
U
,
if2_row
,
if2_metaRead
(
j
)(
i
).
valid
,
if2_mask
(
i
),
if2_metaRead
(
j
)(
i
).
tag
,
if2_dataRead
(
j
)(
i
).
lower
,
if2_metaRead
(
j
)(
i
).
btbType
,
if2_dataRead
(
j
)(
i
).
extended
,
if2_metaRead
(
j
)(
i
).
isRVC
)
}
}
}
...
...
@@ -234,8 +240,8 @@ class BTB extends BasePredictor with BTBParams{
XSDebug
(
validLatch
&&
if2_bankHits
(
i
),
"resp(%d): bank(%d) hits, tgt=%x, isRVC=%d, type=%d\n"
,
i
.
U
,
i
.
U
,
io
.
resp
.
targets
(
i
),
io
.
resp
.
isRVC
(
i
),
io
.
resp
.
types
(
i
))
}
XSDebug
(
updateValid
,
"update_req: cycle=%d, pc=0x%x, target=0x%x, misPred=%d,
offset
=%x, extended=%d, way=%d, bank=%d, row=0x%x\n"
,
u
.
bpuMeta
.
debug_btb_cycle
,
u
.
pc
,
new_target
,
u
.
isMisPred
,
new_
offset
,
new_extended
,
updateWay
,
updateBankIdx
,
updateRow
)
XSDebug
(
updateValid
,
"update_req: cycle=%d, pc=0x%x, target=0x%x, misPred=%d,
lower
=%x, extended=%d, way=%d, bank=%d, row=0x%x\n"
,
u
.
bpuMeta
.
debug_btb_cycle
,
u
.
pc
,
new_target
,
u
.
isMisPred
,
new_
lower
,
new_extended
,
updateWay
,
updateBankIdx
,
updateRow
)
for
(
i
<-
0
until
BtbBanks
)
{
// Conflict when not hit and allocating a valid entry
val
conflict
=
if2_metaRead
(
allocWays
(
i
))(
i
).
valid
&&
!
if2_bankHits
(
i
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录