Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
df5b4b8e
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 搜索 >>
未验证
提交
df5b4b8e
编写于
12月 18, 2021
作者:
Y
Yinan Xu
提交者:
GitHub
12月 18, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
csr: optimize exception and trapTarget timing (#1372)
上级
5b7ef044
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
49 addition
and
35 deletion
+49
-35
src/main/scala/xiangshan/backend/CtrlBlock.scala
src/main/scala/xiangshan/backend/CtrlBlock.scala
+22
-13
src/main/scala/xiangshan/backend/exu/ExeUnit.scala
src/main/scala/xiangshan/backend/exu/ExeUnit.scala
+2
-0
src/main/scala/xiangshan/backend/fu/CSR.scala
src/main/scala/xiangshan/backend/fu/CSR.scala
+8
-5
src/main/scala/xiangshan/frontend/Frontend.scala
src/main/scala/xiangshan/frontend/Frontend.scala
+1
-1
src/main/scala/xiangshan/frontend/NewFtq.scala
src/main/scala/xiangshan/frontend/NewFtq.scala
+16
-16
未找到文件。
src/main/scala/xiangshan/backend/CtrlBlock.scala
浏览文件 @
df5b4b8e
...
...
@@ -33,7 +33,7 @@ import xiangshan.mem.mdp.{LFST, SSIT, WaitTable}
class
CtrlToFtqIO
(
implicit
p
:
Parameters
)
extends
XSBundle
{
val
rob_commits
=
Vec
(
CommitWidth
,
Valid
(
new
RobCommitInfo
))
val
stage2R
edirect
=
Valid
(
new
Redirect
)
val
r
edirect
=
Valid
(
new
Redirect
)
}
class
RedirectGenerator
(
implicit
p
:
Parameters
)
extends
XSModule
...
...
@@ -267,13 +267,6 @@ class CtrlBlockImp(outer: CtrlBlock)(implicit p: Parameters) extends LazyModuleI
val
flushRedirect
=
Wire
(
Valid
(
new
Redirect
))
flushRedirect
.
valid
:=
RegNext
(
rob
.
io
.
flushOut
.
valid
)
flushRedirect
.
bits
:=
RegEnable
(
rob
.
io
.
flushOut
.
bits
,
rob
.
io
.
flushOut
.
valid
)
flushRedirect
.
bits
.
cfiUpdate
.
target
:=
Mux
(
io
.
robio
.
toCSR
.
isXRet
||
rob
.
io
.
exception
.
valid
,
io
.
robio
.
toCSR
.
trapTarget
,
Mux
(
flushRedirect
.
bits
.
flushItself
(),
flushPC
,
// replay inst
flushPC
+
4.
U
// flush pipe
)
)
val
flushRedirectReg
=
Wire
(
Valid
(
new
Redirect
))
flushRedirectReg
.
valid
:=
RegNext
(
flushRedirect
.
valid
,
init
=
false
.
B
)
...
...
@@ -303,7 +296,8 @@ class CtrlBlockImp(outer: CtrlBlock)(implicit p: Parameters) extends LazyModuleI
redirectGen
.
io
.
loadReplay
<>
loadReplay
redirectGen
.
io
.
flush
:=
flushRedirect
.
valid
val
frontendFlush
=
DelayN
(
flushRedirect
,
5
)
val
frontendFlushValid
=
DelayN
(
flushRedirect
.
valid
,
5
)
val
frontendFlushBits
=
RegEnable
(
flushRedirect
.
bits
,
flushRedirect
.
valid
)
// When ROB commits an instruction with a flush, we notify the frontend of the flush without the commit.
// Flushes to frontend may be delayed by some cycles and commit before flush causes errors.
// Thus, we make all flush reasons to behave the same as exceptions for frontend.
...
...
@@ -312,14 +306,29 @@ class CtrlBlockImp(outer: CtrlBlock)(implicit p: Parameters) extends LazyModuleI
io
.
frontend
.
toFtq
.
rob_commits
(
i
).
valid
:=
RegNext
(
is_commit
)
io
.
frontend
.
toFtq
.
rob_commits
(
i
).
bits
:=
RegEnable
(
rob
.
io
.
commits
.
info
(
i
),
is_commit
)
}
io
.
frontend
.
toFtq
.
stage2Redirect
:=
Mux
(
frontendFlush
.
valid
,
frontendFlush
,
redirectGen
.
io
.
stage2Redirect
)
when
(
frontendFlush
.
valid
)
{
io
.
frontend
.
toFtq
.
stage2Redirect
.
bits
.
level
:=
RedirectLevel
.
flush
io
.
frontend
.
toFtq
.
redirect
.
valid
:=
frontendFlushValid
||
redirectGen
.
io
.
stage2Redirect
.
valid
io
.
frontend
.
toFtq
.
redirect
.
bits
:=
Mux
(
frontendFlushValid
,
frontendFlushBits
,
redirectGen
.
io
.
stage2Redirect
.
bits
)
when
(
frontendFlushValid
)
{
io
.
frontend
.
toFtq
.
redirect
.
bits
.
level
:=
RedirectLevel
.
flush
// Be careful here:
// T0: flushRedirect.valid, exception.valid
// T1: csr.redirect.valid
// T2: csr.exception.valid
// T3: csr.trapTarget
// T4: ctrlBlock.trapTarget
// T5: io.frontend.toFtq.stage2Redirect.valid
val
pc_from_csr
=
io
.
robio
.
toCSR
.
isXRet
||
DelayN
(
rob
.
io
.
exception
.
valid
,
4
)
val
rob_flush_pc
=
RegEnable
(
Mux
(
flushRedirect
.
bits
.
flushItself
(),
flushPC
,
// replay inst
flushPC
+
4.
U
// flush pipe
),
flushRedirect
.
valid
)
val
flushTarget
=
Mux
(
pc_from_csr
,
io
.
robio
.
toCSR
.
trapTarget
,
rob_flush_pc
)
io
.
frontend
.
toFtq
.
redirect
.
bits
.
cfiUpdate
.
target
:=
RegNext
(
flushTarget
)
}
val
pendingRedirect
=
RegInit
(
false
.
B
)
when
(
stage2Redirect
.
valid
)
{
pendingRedirect
:=
true
.
B
}.
elsewhen
(
RegNext
(
io
.
frontend
.
toFtq
.
stage2R
edirect
.
valid
))
{
}.
elsewhen
(
RegNext
(
io
.
frontend
.
toFtq
.
r
edirect
.
valid
))
{
pendingRedirect
:=
false
.
B
}
...
...
src/main/scala/xiangshan/backend/exu/ExeUnit.scala
浏览文件 @
df5b4b8e
...
...
@@ -53,6 +53,8 @@ class ExeUnit(config: ExuConfig)(implicit p: Parameters) extends Exu(config) {
csr
.
csrio
<>
csrio
.
get
csrio
.
get
.
tlb
:=
DelayN
(
csr
.
csrio
.
tlb
,
2
)
csrio
.
get
.
customCtrl
:=
DelayN
(
csr
.
csrio
.
customCtrl
,
2
)
csrio
.
get
.
trapTarget
:=
RegNext
(
csr
.
csrio
.
trapTarget
)
csr
.
csrio
.
exception
:=
DelayN
(
csrio
.
get
.
exception
,
2
)
disableSfence
:=
csr
.
csrio
.
disableSfence
csr_frm
:=
csr
.
csrio
.
fpu
.
frm
// setup skip for hpm CSR read
...
...
src/main/scala/xiangshan/backend/fu/CSR.scala
浏览文件 @
df5b4b8e
...
...
@@ -1001,17 +1001,20 @@ class CSR(implicit p: Parameters) extends FunctionUnit with HasCSRConst with PMP
// ctrl block will use theses later for flush
val
isXRetFlag
=
RegInit
(
false
.
B
)
val
retTargetReg
=
Reg
(
retTarget
.
cloneType
)
when
(
io
.
redirectIn
.
valid
)
{
when
(
DelayN
(
io
.
redirectIn
.
valid
,
5
))
{
isXRetFlag
:=
false
.
B
}.
elsewhen
(
isXRet
)
{
isXRetFlag
:=
true
.
B
retTargetReg
:=
retTarget
}
csrio
.
isXRet
:=
isXRetFlag
val
retTargetReg
=
RegEnable
(
retTarget
,
isXRet
)
val
tvec
=
Mux
(
delegS
,
stvec
,
mtvec
)
val
tvecBase
=
tvec
(
VAddrBits
-
1
,
2
)
csrio
.
trapTarget
:=
Mux
(
isXRetFlag
,
// XRet sends redirect instead of Flush and isXRetFlag is true.B before redirect.valid.
// ROB sends exception at T0 while CSR receives at T2.
// We add a RegNext here and trapTarget is valid at T3.
csrio
.
trapTarget
:=
RegEnable
(
Mux
(
isXRetFlag
,
retTargetReg
,
Mux
(
raiseDebugExceptionIntr
||
ebreakEnterParkLoop
,
debugTrapTarget
,
// When MODE=Vectored, all synchronous exceptions into M/S mode
...
...
@@ -1019,7 +1022,7 @@ class CSR(implicit p: Parameters) extends FunctionUnit with HasCSRConst with PMP
// interrupts cause the pc to be set to the address in the BASE field
// plus four times the interrupt cause number.
Cat
(
tvecBase
+
Mux
(
tvec
(
0
)
&&
raiseIntr
,
causeNO
(
3
,
0
),
0.
U
),
0.
U
(
2.
W
))
))
))
,
isXRetFlag
||
csrio
.
exception
.
valid
)
when
(
raiseExceptionIntr
)
{
val
mstatusOld
=
WireInit
(
mstatus
.
asTypeOf
(
new
MstatusStruct
))
...
...
src/main/scala/xiangshan/frontend/Frontend.scala
浏览文件 @
df5b4b8e
...
...
@@ -93,7 +93,7 @@ class FrontendImp (outer: Frontend) extends LazyModuleImp(outer)
icache
.
io
.
fencei
:=
RegNext
(
io
.
fencei
)
val
needFlush
=
RegNext
(
io
.
backend
.
toFtq
.
stage2R
edirect
.
valid
)
val
needFlush
=
RegNext
(
io
.
backend
.
toFtq
.
r
edirect
.
valid
)
//IFU-Ftq
ifu
.
io
.
ftqInter
.
fromFtq
<>
ftq
.
io
.
toIfu
...
...
src/main/scala/xiangshan/frontend/NewFtq.scala
浏览文件 @
df5b4b8e
...
...
@@ -458,10 +458,10 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
})
io
.
bpuInfo
:=
DontCare
val
stage2Redirect
=
io
.
fromBackend
.
stage2R
edirect
val
stage3Redirect
=
RegNext
(
io
.
fromBackend
.
stage2R
edirect
)
val
backendRedirect
=
io
.
fromBackend
.
r
edirect
val
backendRedirectReg
=
RegNext
(
io
.
fromBackend
.
r
edirect
)
val
stage2Flush
=
stage2
Redirect
.
valid
val
stage2Flush
=
backend
Redirect
.
valid
val
backendFlush
=
stage2Flush
||
RegNext
(
stage2Flush
)
val
ifuFlush
=
Wire
(
Bool
())
...
...
@@ -469,8 +469,8 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
val
allowBpuIn
,
allowToIfu
=
WireInit
(
false
.
B
)
val
flushToIfu
=
!
allowToIfu
allowBpuIn
:=
!
ifuFlush
&&
!
stage2Redirect
.
valid
&&
!
stage3Redirect
.
valid
allowToIfu
:=
!
ifuFlush
&&
!
stage2Redirect
.
valid
&&
!
stage3Redirect
.
valid
allowBpuIn
:=
!
ifuFlush
&&
!
backendRedirect
.
valid
&&
!
backendRedirectReg
.
valid
allowToIfu
:=
!
ifuFlush
&&
!
backendRedirect
.
valid
&&
!
backendRedirectReg
.
valid
val
bpuPtr
,
ifuPtr
,
ifuWbPtr
,
commPtr
=
RegInit
(
FtqPtr
(
false
.
B
,
0.
U
))
val
validEntries
=
distanceBetween
(
bpuPtr
,
commPtr
)
...
...
@@ -673,7 +673,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
}.
reduce
(
_
||
_
)
||
(
shareTailSlot
.
B
&&
tailSlot
.
valid
&&
pred_ftb_entry
.
tailSlot
.
sharing
&&
!(
pd_reg
(
tailSlot
.
offset
).
valid
&&
pd_reg
(
tailSlot
.
offset
).
isBr
))
val
jmpOffset
=
tailSlot
.
offset
val
jmp_pd
=
pd_reg
(
jmpOffset
)
val
jal_false_hit
=
pred_ftb_entry
.
jmpValid
&&
...
...
@@ -711,13 +711,13 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
// *******************************************************************************
// redirect read cfiInfo, couples to redirectGen s2
ftq_redirect_sram
.
io
.
ren
.
init
.
last
:=
io
.
fromBackend
.
stage2R
edirect
.
valid
ftq_redirect_sram
.
io
.
raddr
.
init
.
last
:=
io
.
fromBackend
.
stage2R
edirect
.
bits
.
ftqIdx
.
value
ftq_redirect_sram
.
io
.
ren
.
init
.
last
:=
io
.
fromBackend
.
r
edirect
.
valid
ftq_redirect_sram
.
io
.
raddr
.
init
.
last
:=
io
.
fromBackend
.
r
edirect
.
bits
.
ftqIdx
.
value
ftb_entry_mem
.
io
.
raddr
.
init
.
last
:=
io
.
fromBackend
.
stage2R
edirect
.
bits
.
ftqIdx
.
value
ftb_entry_mem
.
io
.
raddr
.
init
.
last
:=
io
.
fromBackend
.
r
edirect
.
bits
.
ftqIdx
.
value
val
stage3CfiInfo
=
ftq_redirect_sram
.
io
.
rdata
.
init
.
last
val
fromBackendRedirect
=
WireInit
(
stage3Redirect
)
val
fromBackendRedirect
=
WireInit
(
backendRedirectReg
)
val
backendRedirectCfi
=
fromBackendRedirect
.
bits
.
cfiUpdate
backendRedirectCfi
.
fromFtqRedirectSram
(
stage3CfiInfo
)
...
...
@@ -783,7 +783,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
// fix mispredict entry
val
lastIsMispredict
=
RegNext
(
stage2Redirect
.
valid
&&
stage2
Redirect
.
bits
.
level
===
RedirectLevel
.
flushAfter
,
init
=
false
.
B
backendRedirect
.
valid
&&
backend
Redirect
.
bits
.
level
===
RedirectLevel
.
flushAfter
,
init
=
false
.
B
)
def
updateCfiInfo
(
redirect
:
Valid
[
Redirect
],
isBackend
:
Boolean
=
true
)
=
{
...
...
@@ -802,8 +802,8 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
}
}
when
(
stage3Redirect
.
valid
&&
lastIsMispredict
)
{
updateCfiInfo
(
stage3Redirect
)
when
(
backendRedirectReg
.
valid
&&
lastIsMispredict
)
{
updateCfiInfo
(
backendRedirectReg
)
}.
elsewhen
(
ifuRedirectToBpu
.
valid
)
{
updateCfiInfo
(
ifuRedirectToBpu
,
isBackend
=
false
)
}
...
...
@@ -812,7 +812,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
// **************************** flush ptr and state queue ****************************
// ***********************************************************************************
val
redirectVec
=
VecInit
(
stage2
Redirect
,
fromIfuRedirect
)
val
redirectVec
=
VecInit
(
backend
Redirect
,
fromIfuRedirect
)
// when redirect, we should reset ptrs and status queues
when
(
redirectVec
.
map
(
r
=>
r
.
valid
).
reduce
(
_
||
_
)){
...
...
@@ -833,7 +833,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
}
// only the valid bit is actually needed
io
.
toIfu
.
redirect
.
bits
:=
stage2
Redirect
.
bits
io
.
toIfu
.
redirect
.
bits
:=
backend
Redirect
.
bits
io
.
toIfu
.
redirect
.
valid
:=
stage2Flush
// commit
...
...
@@ -976,7 +976,7 @@ class Ftq(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelpe
}
val
enq
=
io
.
fromBpu
.
resp
val
perf_redirect
=
io
.
fromBackend
.
stage2R
edirect
val
perf_redirect
=
io
.
fromBackend
.
r
edirect
XSPerfAccumulate
(
"entry"
,
validEntries
)
XSPerfAccumulate
(
"bpu_to_ftq_stall"
,
enq
.
valid
&&
!
enq
.
ready
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录