Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
3c1a4495
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,发现更多精彩内容 >>
提交
3c1a4495
编写于
8月 10, 2020
作者:
J
jinyue110
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dev-frontend' into dev-ras
上级
6ff7b316
d19aa77c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
25 addition
and
15 deletion
+25
-15
src/main/scala/xiangshan/frontend/BPU.scala
src/main/scala/xiangshan/frontend/BPU.scala
+10
-8
src/main/scala/xiangshan/frontend/Btb.scala
src/main/scala/xiangshan/frontend/Btb.scala
+4
-2
src/main/scala/xiangshan/frontend/IFU.scala
src/main/scala/xiangshan/frontend/IFU.scala
+4
-1
src/main/scala/xiangshan/frontend/uBTB.scala
src/main/scala/xiangshan/frontend/uBTB.scala
+7
-4
未找到文件。
src/main/scala/xiangshan/frontend/BPU.scala
浏览文件 @
3c1a4495
...
...
@@ -114,7 +114,7 @@ abstract class BPUStage extends XSModule {
val
predValid
=
RegInit
(
false
.
B
)
io
.
in
.
ready
:=
!
predValid
||
io
.
out
.
fire
()
&&
io
.
pred
.
fire
()
io
.
in
.
ready
:=
!
predValid
||
io
.
out
.
fire
()
&&
io
.
pred
.
fire
()
||
io
.
flush
def
npc
(
pc
:
UInt
,
instCount
:
UInt
)
=
pc
+
(
instCount
<<
1.
U
)
...
...
@@ -194,10 +194,10 @@ class BPUStage1 extends BPUStage {
// 'overrides' default logic
// when flush, the prediction should also starts
when
(
i
o
.
flush
||
inFire
)
{
predValid
:=
true
.
B
}
.
elsewhen
(
outFire
)
{
predValid
:=
false
.
B
}
.
otherwise
{
predValid
:=
predValid
}
io
.
in
.
ready
:=
!
predValid
||
io
.
out
.
fire
()
&&
io
.
pred
.
fire
()
||
io
.
flush
when
(
i
nFire
)
{
predValid
:=
true
.
B
}
.
elsewhen
(
io
.
flush
)
{
predValid
:=
false
.
B
}
.
elsewhen
(
outFire
)
{
predValid
:=
false
.
B
}
.
otherwise
{
predValid
:=
predValid
}
// io.out.valid := predValid
// ubtb is accessed with inLatch pc in s1,
...
...
@@ -225,7 +225,7 @@ class BPUStage2 extends BPUStage {
// Use latched response from s1
val
btbResp
=
inLatch
.
resp
.
btb
val
bimResp
=
inLatch
.
resp
.
bim
takens
:=
VecInit
((
0
until
PredictWidth
).
map
(
i
=>
btbResp
.
hits
(
i
)
&&
(
btbResp
.
types
(
i
)
===
BTBtype
.
B
&&
bimResp
.
ctrs
(
i
)(
1
)
||
btbResp
.
types
(
i
)
=
==
BTBtype
.
J
)))
takens
:=
VecInit
((
0
until
PredictWidth
).
map
(
i
=>
btbResp
.
hits
(
i
)
&&
(
btbResp
.
types
(
i
)
===
BTBtype
.
B
&&
bimResp
.
ctrs
(
i
)(
1
)
||
btbResp
.
types
(
i
)
=
/=
BTBtype
.
B
)))
notTakens
:=
VecInit
((
0
until
PredictWidth
).
map
(
i
=>
btbResp
.
hits
(
i
)
&&
btbResp
.
types
(
i
)
===
BTBtype
.
B
&&
!
bimResp
.
ctrs
(
i
)(
1
)))
targetSrc
:=
btbResp
.
targets
...
...
@@ -356,9 +356,10 @@ object BranchUpdateInfoWithHist {
abstract
class
BaseBPU
extends
XSModule
with
BranchPredictorComponents
{
val
io
=
IO
(
new
Bundle
()
{
// from backend
val
inOrderBrInfo
=
Flipped
(
ValidIO
(
new
BranchUpdateInfoWithHist
))
val
redirect
=
Flipped
(
ValidIO
(
new
Redirect
))
val
recover
=
Flipped
(
ValidIO
(
new
BranchUpdateInfo
))
val
inOrderBrInfo
=
Flipped
(
ValidIO
(
new
BranchUpdateInfoWithHist
))
val
outOfOrderBrInfo
=
Flipped
(
ValidIO
(
new
BranchUpdateInfoWithHist
))
// from ifu, frontend redirect
val
flush
=
Input
(
Vec
(
3
,
Bool
()))
// from if1
...
...
@@ -373,7 +374,8 @@ abstract class BaseBPU extends XSModule with BranchPredictorComponents{
def
npc
(
pc
:
UInt
,
instCount
:
UInt
)
=
pc
+
(
instCount
<<
1.
U
)
preds
.
map
(
_
.
io
.
update
<>
io
.
inOrderBrInfo
)
preds
.
map
(
_
.
io
.
update
<>
io
.
outOfOrderBrInfo
)
tage
.
io
.
update
<>
io
.
inOrderBrInfo
val
s1
=
Module
(
new
BPUStage1
)
val
s2
=
Module
(
new
BPUStage2
)
...
...
src/main/scala/xiangshan/frontend/Btb.scala
浏览文件 @
3c1a4495
...
...
@@ -142,6 +142,7 @@ class BTB extends BasePredictor with BTBParams{
def
allocWay
(
valids
:
UInt
,
meta_tags
:
UInt
,
req_tag
:
UInt
)
=
{
val
randomAlloc
=
true
if
(
BtbWays
>
1
)
{
val
w
=
Wire
(
UInt
(
log2Up
(
BtbWays
).
W
))
val
valid
=
WireInit
(
valids
.
andR
)
...
...
@@ -151,7 +152,7 @@ class BTB extends BasePredictor with BTBParams{
val
chunks
=
(
0
until
nChunks
).
map
(
i
=>
tags
(
min
((
i
+
1
)*
l
,
tags
.
getWidth
)-
1
,
i
*
l
)
)
w
:=
Mux
(
valid
,
chunks
.
reduce
(
_
^
_
),
PriorityEncoder
(~
valids
))
w
:=
Mux
(
valid
,
chunks
.
reduce
(
_
^
_
),
(
if
(
randomAlloc
)
{
LFSR64
()(
log2Up
(
BtbWays
)-
1
,
0
)}
else
{
PriorityEncoder
(~
valids
)}
))
w
}
else
{
val
w
=
WireInit
(
0.
U
)
...
...
@@ -207,7 +208,8 @@ class BTB extends BasePredictor with BTBParams{
val
metaWrite
=
BtbMetaEntry
(
btbAddr
.
getTag
(
u
.
pc
),
updateType
,
u
.
pd
.
isRVC
)
val
dataWrite
=
BtbDataEntry
(
new_offset
,
new_extended
)
val
updateValid
=
io
.
update
.
valid
&&
(
u
.
isMisPred
||
!
u
.
brInfo
.
btbHitJal
)
val
jalFirstEncountered
=
!
u
.
isMisPred
&&
!
u
.
brInfo
.
btbHitJal
&&
updateType
===
BTBtype
.
J
val
updateValid
=
io
.
update
.
valid
&&
(
u
.
isMisPred
||
jalFirstEncountered
)
// Update btb
for
(
w
<-
0
until
BtbWays
)
{
for
(
b
<-
0
until
BtbBanks
)
{
...
...
src/main/scala/xiangshan/frontend/IFU.scala
浏览文件 @
3c1a4495
...
...
@@ -312,7 +312,10 @@ class IFU extends XSModule with HasIFUConst
bpu
.
io
.
inOrderBrInfo
.
valid
:=
io
.
inOrderBrInfo
.
valid
bpu
.
io
.
inOrderBrInfo
.
bits
:=
BranchUpdateInfoWithHist
(
io
.
inOrderBrInfo
.
bits
,
inOrderBrHist
.
asUInt
)
bpu
.
io
.
redirect
<>
io
.
redirect
bpu
.
io
.
recover
<>
io
.
outOfOrderBrInfo
bpu
.
io
.
recover
<>
io
.
inOrderBrInfo
bpu
.
io
.
outOfOrderBrInfo
.
valid
:=
io
.
outOfOrderBrInfo
.
valid
bpu
.
io
.
outOfOrderBrInfo
.
bits
:=
BranchUpdateInfoWithHist
(
io
.
outOfOrderBrInfo
.
bits
,
inOrderBrHist
.
asUInt
)
// Dont care about hist
// bpu.io.flush := Cat(if4_flush, if3_flush, if2_flush)
bpu
.
io
.
flush
:=
VecInit
(
if2_flush
,
if3_flush
,
if4_flush
)
bpu
.
io
.
in
.
valid
:=
if1_fire
...
...
src/main/scala/xiangshan/frontend/uBTB.scala
浏览文件 @
3c1a4495
...
...
@@ -167,11 +167,14 @@ class MicroBTB extends BasePredictor
val
update_bank
=
getBank
(
update_br_pc
)
val
update_base_bank
=
getBank
(
update_fetch_pc
)
val
update_tag
=
getTag
(
update_br_pc
)
val
update_taget_offset
=
u
.
target
.
asSInt
-
update_br_pc
.
asSInt
val
update_target
=
Mux
(
u
.
pd
.
isBr
,
u
.
brTarget
,
u
.
target
)
val
update_taget_offset
=
update_target
.
asSInt
-
update_br_pc
.
asSInt
val
update_is_BR_or_JAL
=
(
u
.
pd
.
brType
===
BrType
.
branch
)
||
(
u
.
pd
.
brType
===
BrType
.
jal
)
val
entry_write_valid
=
io
.
update
.
valid
//&& update_is_BR_or_JAL
val
meta_write_valid
=
io
.
update
.
valid
//&& update_is_BR_or_JAL
val
jalFirstEncountered
=
!
u
.
isMisPred
&&
!
u
.
brInfo
.
btbHitJal
&&
(
u
.
pd
.
brType
===
BrType
.
jal
)
val
entry_write_valid
=
io
.
update
.
valid
&&
(
u
.
isMisPred
||
jalFirstEncountered
)
//io.update.valid //&& update_is_BR_or_JAL
val
meta_write_valid
=
io
.
update
.
valid
&&
(
u
.
isMisPred
||
jalFirstEncountered
)
//io.update.valid //&& update_is_BR_or_JAL
//write btb target when miss prediction
when
(
entry_write_valid
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录