Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
71f01585
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
9 个月 前同步成功
通知
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 搜索 >>
提交
71f01585
编写于
7月 30, 2021
作者:
L
Lingrui98
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ftq: calculate fall through address from pftAddr
上级
ccdbfeb0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
17 addition
and
9 deletion
+17
-9
src/main/scala/xiangshan/decoupled-frontend/NewFtq.scala
src/main/scala/xiangshan/decoupled-frontend/NewFtq.scala
+17
-9
未找到文件。
src/main/scala/xiangshan/decoupled-frontend/NewFtq.scala
浏览文件 @
71f01585
...
...
@@ -68,12 +68,17 @@ class Ftq_RF_Components(implicit p: Parameters) extends XSBundle {
val
pftAddr
=
UInt
(
VAddrBits
.
W
)
val
isNextMask
=
Vec
(
PredictWidth
,
Bool
())
val
oversize
=
Bool
()
val
carry
=
Bool
()
def
getPc
(
offset
:
UInt
)
=
{
def
getHigher
(
pc
:
UInt
)
=
pc
(
VAddrBits
-
1
,
log2Ceil
(
PredictWidth
)+
instOffsetBits
)
def
getOffset
(
pc
:
UInt
)
=
pc
(
log2Ceil
(
PredictWidth
)+
instOffsetBits
-
1
,
instOffsetBits
)
Cat
(
getHigher
(
Mux
(
isNextMask
(
offset
),
nextRangeAddr
,
startAddr
)),
getOffset
(
startAddr
)+
offset
,
0.
U
(
instOffsetBits
.
W
))
}
def
getFallThrough
(
start
:
UInt
=
startAddr
,
carry
:
Bool
=
carry
,
pft
:
UInt
=
pftAddr
)
=
{
val
higher
=
start
.
head
(
VAddrBits
-
log2Ceil
(
PredictWidth
)-
instOffsetBits
)
Cat
(
Mux
(
carry
,
higher
+
1.
U
,
higher
),
pft
)
}
}
class
Ftq_pd_Entry
(
implicit
p
:
Parameters
)
extends
XSBundle
{
...
...
@@ -213,6 +218,7 @@ class FTBEntryGen(implicit p: Parameters) extends XSModule with HasBackendRedire
val
cfi_is_jal
=
io
.
cfiIndex
.
bits
===
pd
.
jmpOffset
&&
new_jmp_is_jal
val
cfi_is_jalr
=
io
.
cfiIndex
.
bits
===
pd
.
jmpOffset
&&
new_jmp_is_jalr
def
getLower
(
pc
:
UInt
)
=
pc
(
log2Ceil
(
PredictWidth
)+
instOffsetBits
-
1
,
instOffsetBits
)
// if not hit, establish a new entry
init_entry
.
valid
:=
true
.
B
// tag is left for ftb to assign
...
...
@@ -222,10 +228,9 @@ class FTBEntryGen(implicit p: Parameters) extends XSModule with HasBackendRedire
init_entry
.
jmpOffset
:=
pd
.
jmpOffset
init_entry
.
jmpValid
:=
new_jmp_is_jal
||
new_jmp_is_jalr
init_entry
.
jmpTarget
:=
Mux
(!
cfi_is_jal
,
pd
.
jalTarget
,
io
.
target
)
init_entry
.
pftAddr
:=
Mux
(
entry_has_jmp
,
io
.
start_addr
+
(
pd
.
jmpOffset
<<
instOffsetBits
)
+
Mux
(
pd
.
rvcMask
(
pd
.
jmpOffset
),
2.
U
,
4.
U
),
io
.
start_addr
+
Mux
(
last_br_rvi
,
(
FetchWidth
*
4
+
2
).
U
,
(
FetchWidth
*
4
).
U
)
)
val
jmpPft
=
getLower
(
io
.
start_addr
)
+&
pd
.
jmpOffset
+&
Mux
(
pd
.
rvcMask
(
pd
.
jmpOffset
),
1.
U
,
2.
U
)
init_entry
.
pftAddr
:=
Mux
(
entry_has_jmp
,
jmpPft
,
getLower
(
io
.
start_addr
)
+
Mux
(
last_br_rvi
,
1.
U
,
0.
U
))
init_entry
.
carry
:=
Mux
(
entry_has_jmp
,
jmpPft
(
log2Ceil
(
PredictWidth
)+
instOffsetBits
).
asBool
,
true
.
B
)
// TODO: carry bit is currently ignored
init_entry
.
isJalr
:=
new_jmp_is_jalr
init_entry
.
isCall
:=
new_jmp_is_call
...
...
@@ -269,8 +274,9 @@ class FTBEntryGen(implicit p: Parameters) extends XSModule with HasBackendRedire
// it should either be the given last br or the new br
when
(
pft_need_to_change
)
{
val
new_pft_offset
=
Mux
(
new_br_insert_onehot
.
asUInt
.
orR
,
oe
.
brOffset
.
last
,
new_br_offset
)
old_entry_modified
.
pftAddr
:=
io
.
start_addr
+
(
new_pft_offset
<<
instOffsetBits
)
old_entry_modified
.
last_is_rvc
:=
pd
.
rvcMask
(
new_pft_offset
-
1.
U
)
old_entry_modified
.
pftAddr
:=
getLower
(
io
.
start_addr
)
+
new_pft_offset
old_entry_modified
.
last_is_rvc
:=
pd
.
rvcMask
(
new_pft_offset
-
1.
U
)
// TODO: fix this
old_entry_modified
.
carry
:=
(
getLower
(
io
.
start_addr
)
+&
new_pft_offset
).
head
(
1
).
asBool
old_entry_modified
.
oversize
:=
false
.
B
old_entry_modified
.
jmpValid
:=
false
.
B
}
...
...
@@ -300,7 +306,7 @@ class FTBEntryGen(implicit p: Parameters) extends XSModule with HasBackendRedire
io
.
is_old_entry
:=
hit
&&
!
is_new_br
&&
!
jalr_mispredicted
io
.
is_new_br
:=
hit
&&
is_new_br
io
.
is_jalr_target_modified
:=
hit
&&
jalr_mispredicted
io
.
is_br_full
:=
hit
&&
is_new_br
&&
br_full
io
.
is_br_full
:=
hit
&&
is_new_br
&&
br_full
}
class
Ftq
(
implicit
p
:
Parameters
)
extends
XSModule
with
HasCircularQueuePtrHelper
with
HasBackendRedirectInfo
{
...
...
@@ -359,6 +365,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
(
io
.
fromBpu
.
resp
.
bits
.
pc
(
log2Ceil
(
PredictWidth
),
1
)
+&
i
.
U
)(
log2Ceil
(
PredictWidth
)).
asBool
()
))
ftq_pc_mem
.
io
.
wdata
(
0
).
oversize
:=
io
.
fromBpu
.
resp
.
bits
.
ftb_entry
.
oversize
ftq_pc_mem
.
io
.
wdata
(
0
).
carry
:=
io
.
fromBpu
.
resp
.
bits
.
ftb_entry
.
carry
// read ports: redirects + ifuRedirect + commit
val
ftq_hist_mem
=
Module
(
new
SyncDataModuleTemplate
(
new
GlobalHistory
,
FtqSize
,
numRedirect
+
1
+
1
,
1
))
...
...
@@ -540,9 +547,10 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
loadReplayOffset
.
valid
:=
false
.
B
}
}
when
(
RegNext
(
to_buf_fire
))
{
ifu_req_buf
.
bits
.
startAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
startAddr
ifu_req_buf
.
bits
.
fallThruAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
pftAddr
ifu_req_buf
.
bits
.
fallThruAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
getFallThrough
()
ifu_req_buf
.
bits
.
oversize
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
oversize
}
...
...
@@ -551,7 +559,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
io
.
toIfu
.
req
.
bits
:=
ifu_req_buf
.
bits
when
(
last_cycle_to_buf_fire
)
{
io
.
toIfu
.
req
.
bits
.
startAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
startAddr
io
.
toIfu
.
req
.
bits
.
fallThruAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
pftAddr
io
.
toIfu
.
req
.
bits
.
fallThruAddr
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
getFallThrough
()
io
.
toIfu
.
req
.
bits
.
oversize
:=
ftq_pc_mem
.
io
.
rdata
.
init
.
last
.
oversize
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录