Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
818ec9f9
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 搜索 >>
提交
818ec9f9
编写于
12月 19, 2020
作者:
L
Lingrui98
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ifu, bundle: try to simplify logic to meet timing constraints
上级
7f93b3aa
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
14 addition
and
13 deletion
+14
-13
src/main/scala/xiangshan/Bundle.scala
src/main/scala/xiangshan/Bundle.scala
+7
-9
src/main/scala/xiangshan/frontend/IFU.scala
src/main/scala/xiangshan/frontend/IFU.scala
+7
-4
未找到文件。
src/main/scala/xiangshan/Bundle.scala
浏览文件 @
818ec9f9
...
...
@@ -82,15 +82,12 @@ class BranchPrediction extends XSBundle with HasIFUConst {
val
firstBankHasHalfRVI
=
Bool
()
val
lastBankHasHalfRVI
=
Bool
()
def
lastHalfRVIMask
=
Mux
(
firstBankHasHalfRVI
,
UIntToOH
((
bankWidth
-
1
).
U
),
Mux
(
lastBankHasHalfRVI
,
UIntToOH
((
PredictWidth
-
1
).
U
),
0.
U
(
PredictWidth
.
W
)
)
)
// assumes that only one of the two conditions could be true
def
lastHalfRVIMask
=
Cat
(
lastBankHasHalfRVI
.
asUInt
,
0.
U
(
7.
W
),
firstBankHasHalfRVI
.
asUInt
,
0.
U
(
7.
W
))
def
lastHalfRVIClearMask
=
~
lastHalfRVIMask
// is taken from half RVI
def
lastHalfRVITaken
=
ParallelORR
(
takens
&
lastHalfRVIMask
)
def
lastHalfRVITaken
=
(
takens
(
bankWidth
-
1
)
&&
firstBankHasHalfRVI
)
||
(
takens
(
PredictWidth
-
1
)
&&
lastBankHasHalfRVI
)
def
lastHalfRVIIdx
=
Mux
(
firstBankHasHalfRVI
,
(
bankWidth
-
1
).
U
,
(
PredictWidth
-
1
).
U
)
// should not be used if not lastHalfRVITaken
...
...
@@ -100,13 +97,14 @@ class BranchPrediction extends XSBundle with HasIFUConst {
def
realBrMask
=
brMask
&
lastHalfRVIClearMask
def
realJalMask
=
jalMask
&
lastHalfRVIClearMask
def
brNotTakens
=
~
realT
akens
&
realBrMask
def
brNotTakens
=
~
t
akens
&
realBrMask
def
sawNotTakenBr
=
VecInit
((
0
until
PredictWidth
).
map
(
i
=>
(
if
(
i
==
0
)
false
.
B
else
ParallelORR
(
brNotTakens
(
i
-
1
,
0
)))))
// def hasNotTakenBrs = (brNotTakens & LowerMaskFromLowest(realTakens)).orR
def
unmaskedJmpIdx
=
ParallelPriorityEncoder
(
takens
)
def
saveHalfRVI
=
(
firstBankHasHalfRVI
&&
(
unmaskedJmpIdx
===
(
bankWidth
-
1
).
U
||
!(
ParallelORR
(
takens
))))
||
(
lastBankHasHalfRVI
&&
unmaskedJmpIdx
===
(
PredictWidth
-
1
).
U
)
// if not taken before the half RVI inst
def
saveHalfRVI
=
(
firstBankHasHalfRVI
&&
!(
ParallelORR
(
takens
(
bankWidth
-
2
,
0
))))
||
(
lastBankHasHalfRVI
&&
!(
ParallelORR
(
takens
(
PredictWidth
-
2
,
0
))))
// could get PredictWidth-1 when only the first bank is valid
def
jmpIdx
=
ParallelPriorityEncoder
(
realTakens
)
// only used when taken
...
...
src/main/scala/xiangshan/frontend/IFU.scala
浏览文件 @
818ec9f9
...
...
@@ -461,10 +461,13 @@ class IFU extends XSModule with HasIFUConst
loopBufPar
.
noTakenMask
:=
if4_pd
.
mask
fetchPacketWire
.
pc
:=
if4_pd
.
pc
(
0
until
PredictWidth
).
foreach
(
i
=>
fetchPacketWire
.
pnpc
(
i
)
:=
if4_pd
.
pc
(
i
)
+
Mux
(
if4_pd
.
pd
(
i
).
isRVC
,
2.
U
,
4.
U
))
when
(
if4_bp
.
taken
)
{
fetchPacketWire
.
pnpc
(
if4_bp
.
jmpIdx
)
:=
if4_bp
.
target
}
(
0
until
PredictWidth
).
foreach
(
i
=>
fetchPacketWire
.
pnpc
(
i
)
:=
Mux
(
if4_bp
.
taken
&&
if4_bp
.
jmpIdx
===
i
.
U
,
if4_bp
.
target
,
Mux
(
if4_pendingPrevHalfInstr
,
(
if
(
i
==
0
)
Cat
(
bankAligned
(
if4_pd
.
pc
(
1
))(
VAddrBits
-
1
,
bankBytes
),
2.
U
(
bankBytes
.
W
))
else
Cat
(
bankAligned
(
if4_pd
.
pc
(
1
))(
VAddrBits
-
1
,
bankBytes
),
(
i
<<
1
).
U
(
bankBytes
.
W
)
+
Mux
(
if4_pd
.
pd
(
i
).
isRVC
,
2.
U
,
4.
U
))),
Cat
(
bankAligned
(
if4_pd
.
pc
(
0
))(
VAddrBits
-
1
,
bankBytes
),
(
i
<<
1
).
U
(
bankBytes
.
W
)
+
Mux
(
if4_pd
.
pd
(
i
).
isRVC
,
2.
U
,
4.
U
)))))
fetchPacketWire
.
brInfo
:=
bpu
.
io
.
branchInfo
(
0
until
PredictWidth
).
foreach
(
i
=>
fetchPacketWire
.
brInfo
(
i
).
hist
:=
final_gh
)
(
0
until
PredictWidth
).
foreach
(
i
=>
fetchPacketWire
.
brInfo
(
i
).
predHist
:=
if4_predHist
.
asTypeOf
(
new
GlobalHistory
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录