Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
56788a33
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
大约 1 年 前同步成功
通知
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,发现更多精彩内容 >>
提交
56788a33
编写于
1月 18, 2022
作者:
J
JinYue
提交者:
Lingrui98
1月 22, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Frontend <timing>: add additional PMP checker
上级
71e336ff
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
24 addition
and
32 deletion
+24
-32
src/main/scala/xiangshan/frontend/Frontend.scala
src/main/scala/xiangshan/frontend/Frontend.scala
+10
-8
src/main/scala/xiangshan/frontend/IFU.scala
src/main/scala/xiangshan/frontend/IFU.scala
+7
-6
src/main/scala/xiangshan/frontend/icache/ICache.scala
src/main/scala/xiangshan/frontend/icache/ICache.scala
+4
-10
src/main/scala/xiangshan/frontend/icache/IPrefetch.scala
src/main/scala/xiangshan/frontend/icache/IPrefetch.scala
+3
-8
未找到文件。
src/main/scala/xiangshan/frontend/Frontend.scala
浏览文件 @
56788a33
...
...
@@ -73,21 +73,23 @@ class FrontendImp (outer: Frontend) extends LazyModuleImp(outer)
val
triggerEn
=
csrCtrl
.
trigger_enable
ifu
.
io
.
csrTriggerEnable
:=
VecInit
(
triggerEn
(
0
),
triggerEn
(
1
),
triggerEn
(
6
),
triggerEn
(
8
))
// pmp
// pmp
val
pmp
=
Module
(
new
PMP
())
val
pmp_check
=
VecInit
(
Seq
.
fill
(
2
)(
Module
(
new
PMPChecker
(
3
,
sameCycle
=
true
)).
io
))
val
pmp_check
=
VecInit
(
Seq
.
fill
(
4
)(
Module
(
new
PMPChecker
(
3
,
sameCycle
=
true
)).
io
))
pmp
.
io
.
distribute_csr
:=
csrCtrl
.
distribute_csr
val
pmp_req_vec
=
Wire
(
Vec
(
2
,
Valid
(
new
PMPReqBundle
())))
val
pmp_req_vec
=
Wire
(
Vec
(
4
,
Valid
(
new
PMPReqBundle
())))
pmp_req_vec
(
0
)
<>
icache
.
io
.
pmp
(
0
).
req
pmp_req_vec
(
1
).
valid
:=
icache
.
io
.
pmp
(
1
).
req
.
valid
||
ifu
.
io
.
pmp
.
req
.
valid
pmp_req_vec
(
1
).
bits
:=
Mux
(
ifu
.
io
.
pmp
.
req
.
valid
,
ifu
.
io
.
pmp
.
req
.
bits
,
icache
.
io
.
pmp
(
1
).
req
.
bits
)
pmp_req_vec
(
1
)
<>
icache
.
io
.
pmp
(
1
).
req
pmp_req_vec
(
2
)
<>
icache
.
io
.
pmp
(
2
).
req
pmp_req_vec
(
3
)
<>
ifu
.
io
.
pmp
.
req
for
(
i
<-
pmp_check
.
indices
)
{
pmp_check
(
i
).
apply
(
tlbCsr
.
priv
.
imode
,
pmp
.
io
.
pmp
,
pmp
.
io
.
pma
,
pmp_req_vec
(
i
))
icache
.
io
.
pmp
(
i
).
resp
<>
pmp_check
(
i
).
resp
}
ifu
.
io
.
pmp
.
resp
<>
pmp_check
(
1
).
resp
ifu
.
io
.
pmp
.
req
.
ready
:=
false
.
B
icache
.
io
.
pmp
(
0
).
resp
<>
pmp_check
(
0
).
resp
icache
.
io
.
pmp
(
1
).
resp
<>
pmp_check
(
1
).
resp
icache
.
io
.
pmp
(
2
).
resp
<>
pmp_check
(
2
).
resp
ifu
.
io
.
pmp
.
resp
<>
pmp_check
(
3
).
resp
val
tlb_req_arb
=
Module
(
new
Arbiter
(
new
TlbReq
,
2
))
tlb_req_arb
.
io
.
in
(
0
)
<>
ifu
.
io
.
iTLBInter
.
req
...
...
src/main/scala/xiangshan/frontend/IFU.scala
浏览文件 @
56788a33
...
...
@@ -66,7 +66,7 @@ class NewIFUIO(implicit p: Parameters) extends XSBundle {
val
csrTriggerEnable
=
Input
(
Vec
(
4
,
Bool
()))
val
rob_commits
=
Flipped
(
Vec
(
CommitWidth
,
Valid
(
new
RobCommitInfo
)))
val
iTLBInter
=
new
BlockTlbRequestIO
val
pmp
=
new
I
Prefetch
PMPBundle
val
pmp
=
new
I
Cache
PMPBundle
}
// record the situation in which fallThruAddr falls into
...
...
@@ -368,10 +368,11 @@ class NewIFU(implicit p: Parameters) extends XSModule
val
f3_mmio_to_commit_next
=
RegNext
(
f3_mmio_to_commit
)
val
f3_mmio_can_go
=
f3_mmio_to_commit
&&
!
f3_mmio_to_commit_next
val
f3_ftq_flush_self
=
fromFtq
.
redirect
.
valid
&&
RedirectLevel
.
flushItself
(
fromFtq
.
redirect
.
bits
.
level
)
val
f3_ftq_flush_by_older
=
fromFtq
.
redirect
.
valid
&&
isBefore
(
fromFtq
.
redirect
.
bits
.
ftqIdx
,
f3_ftq_req
.
ftqIdx
)
val
fromFtqRedirectReg
=
RegNext
(
fromFtq
.
redirect
)
val
f3_ftq_flush_self
=
fromFtqRedirectReg
.
valid
&&
RedirectLevel
.
flushItself
(
fromFtqRedirectReg
.
bits
.
level
)
val
f3_ftq_flush_by_older
=
fromFtqRedirectReg
.
valid
&&
isBefore
(
fromFtqRedirectReg
.
bits
.
ftqIdx
,
f3_ftq_req
.
ftqIdx
)
val
f3_need_not_flush
=
f3_req_is_mmio
&&
fromFtq
.
redirect
.
valid
&&
!
f3_ftq_flush_self
&&
!
f3_ftq_flush_by_older
val
f3_need_not_flush
=
f3_req_is_mmio
&&
fromFtq
RedirectReg
.
valid
&&
!
f3_ftq_flush_self
&&
!
f3_ftq_flush_by_older
when
(
f3_flush
&&
!
f3_need_not_flush
)
{
f3_valid
:=
false
.
B
}
.
elsewhen
(
f2_fire
&&
!
f2_flush
)
{
f3_valid
:=
true
.
B
}
...
...
@@ -380,8 +381,8 @@ class NewIFU(implicit p: Parameters) extends XSModule
val
f3_mmio_use_seq_pc
=
RegInit
(
false
.
B
)
val
(
redirect_ftqIdx
,
redirect_ftqOffset
)
=
(
fromFtq
.
redirect
.
bits
.
ftqIdx
,
fromFtq
.
redirect
.
bits
.
ftqOffset
)
val
redirect_mmio_req
=
fromFtq
.
redirect
.
valid
&&
redirect_ftqIdx
===
f3_ftq_req
.
ftqIdx
&&
redirect_ftqOffset
===
0.
U
val
(
redirect_ftqIdx
,
redirect_ftqOffset
)
=
(
fromFtq
RedirectReg
.
bits
.
ftqIdx
,
fromFtqRedirectReg
.
bits
.
ftqOffset
)
val
redirect_mmio_req
=
fromFtq
RedirectReg
.
valid
&&
redirect_ftqIdx
===
f3_ftq_req
.
ftqIdx
&&
redirect_ftqOffset
===
0.
U
when
(
RegNext
(
f2_fire
&&
!
f2_flush
)
&&
f3_req_is_mmio
)
{
f3_mmio_use_seq_pc
:=
true
.
B
}
.
elsewhen
(
redirect_mmio_req
)
{
f3_mmio_use_seq_pc
:=
false
.
B
}
...
...
src/main/scala/xiangshan/frontend/icache/ICache.scala
浏览文件 @
56788a33
...
...
@@ -434,7 +434,7 @@ class ICacheIO(implicit p: Parameters) extends ICacheBundle
val
prefetch
=
Flipped
(
new
FtqPrefechBundle
)
val
stop
=
Input
(
Bool
())
val
fetch
=
Vec
(
PortNumber
,
new
ICacheMainPipeBundle
)
val
pmp
=
Vec
(
PortNumber
,
new
ICachePMPBundle
)
val
pmp
=
Vec
(
PortNumber
+
1
,
new
ICachePMPBundle
)
val
itlb
=
Vec
(
PortNumber
,
new
BlockTlbRequestIO
)
val
perfInfo
=
Output
(
new
ICachePerfInfo
)
val
error
=
new
L1CacheErrorInfo
...
...
@@ -529,19 +529,13 @@ class ICacheImp(outer: ICache) extends LazyModuleImp(outer) with HasICacheParame
prefetchPipe
.
io
.
fromFtq
<>
DontCare
}
io
.
pmp
(
0
).
req
.
valid
:=
mainPipe
.
io
.
pmp
(
0
).
req
.
valid
||
prefetchPipe
.
io
.
pmp
.
req
.
valid
io
.
pmp
(
0
).
req
.
bits
:=
Mux
(
mainPipe
.
io
.
pmp
(
0
).
req
.
valid
,
mainPipe
.
io
.
pmp
(
0
).
req
.
bits
,
prefetchPipe
.
io
.
pmp
.
req
.
bits
)
prefetchPipe
.
io
.
pmp
.
req
.
ready
:=
!
mainPipe
.
io
.
pmp
(
0
).
req
.
valid
mainPipe
.
io
.
pmp
(
0
).
resp
<>
io
.
pmp
(
0
).
resp
prefetchPipe
.
io
.
pmp
.
resp
<>
io
.
pmp
(
0
).
resp
io
.
pmp
(
0
)
<>
mainPipe
.
io
.
pmp
(
0
)
io
.
pmp
(
1
)
<>
mainPipe
.
io
.
pmp
(
1
)
io
.
pmp
(
2
)
<>
prefetchPipe
.
io
.
pmp
prefetchPipe
.
io
.
prefetchEnable
:=
mainPipe
.
io
.
prefetchEnable
prefetchPipe
.
io
.
prefetchDisable
:=
mainPipe
.
io
.
prefetchDisable
io
.
pmp
(
1
)
<>
mainPipe
.
io
.
pmp
(
1
)
when
(
mainPipe
.
io
.
pmp
(
0
).
req
.
valid
&&
prefetchPipe
.
io
.
pmp
.
req
.
valid
)
{
assert
(
false
.
B
,
"Both mainPipe PMP and prefetchPipe PMP valid!"
)
...
...
src/main/scala/xiangshan/frontend/icache/IPrefetch.scala
浏览文件 @
56788a33
...
...
@@ -34,11 +34,6 @@ class PIQReq(implicit p: Parameters) extends IPrefetchBundle {
val
paddr
=
UInt
(
PAddrBits
.
W
)
}
class
IPrefetchPMPBundle
(
implicit
p
:
Parameters
)
extends
ICacheBundle
{
val
req
=
DecoupledIO
(
new
PMPReqBundle
())
val
resp
=
Input
(
new
PMPRespBundle
())
}
class
IPrefetchToMissUnit
(
implicit
p
:
Parameters
)
extends
IPrefetchBundle
{
val
enqReq
=
DecoupledIO
(
new
PIQReq
)
...
...
@@ -47,7 +42,7 @@ class IPrefetchToMissUnit(implicit p: Parameters) extends IPrefetchBundle{
class
IPredfetchIO
(
implicit
p
:
Parameters
)
extends
IPrefetchBundle
{
val
fromFtq
=
Flipped
(
new
FtqPrefechBundle
)
val
iTLBInter
=
new
BlockTlbRequestIO
val
pmp
=
new
I
Prefetch
PMPBundle
val
pmp
=
new
I
Cache
PMPBundle
val
toIMeta
=
Decoupled
(
new
ICacheReadBundle
)
val
fromIMeta
=
Input
(
new
ICacheMetaRespBundle
)
val
toMissUnit
=
new
IPrefetchToMissUnit
...
...
@@ -151,7 +146,7 @@ class IPrefetchPipe(implicit p: Parameters) extends IPrefetchModule
/** Prefetch Stage 2: filtered req PIQ enqueue */
val
p2_valid
=
generatePipeControl
(
lastFire
=
p1_fire
,
thisFire
=
p2_fire
||
p2_discard
,
thisFlush
=
false
.
B
,
lastFlush
=
false
.
B
)
val
p2_pmp_fire
=
p2_valid
&&
io
.
pmp
.
req
.
ready
val
p2_pmp_fire
=
p2_valid
val
pmpExcpAF
=
fromPMP
.
instr
val
p2_paddr
=
RegEnable
(
next
=
tlb_resp_paddr
,
enable
=
p1_fire
)
...
...
@@ -169,7 +164,7 @@ class IPrefetchPipe(implicit p: Parameters) extends IPrefetchModule
p2_ready
:=
p2_fire
||
p2_discard
||
!
p2_valid
p2_fire
:=
p2_valid
&&
!
p2_exception
&&
p3_ready
&&
p2_pmp_fire
p2_discard
:=
p2_valid
&&
(
(
p2_exception
&&
p2_pmp_fire
)
||
!
io
.
pmp
.
req
.
ready
)
p2_discard
:=
p2_valid
&&
(
p2_exception
&&
p2_pmp_fire
)
/** Prefetch Stage 2: filtered req PIQ enqueue */
val
p3_valid
=
generatePipeControl
(
lastFire
=
p2_fire
,
thisFire
=
p3_fire
||
p3_discard
,
thisFlush
=
false
.
B
,
lastFlush
=
false
.
B
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录