Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
2ae18a2d
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,发现更多精彩内容 >>
提交
2ae18a2d
编写于
11月 03, 2020
作者:
Z
ZhangZifei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
PTW: [WIP] add excp check of superpage unalign
上级
eae43642
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
17 addition
and
9 deletion
+17
-9
.gitignore
.gitignore
+1
-0
src/main/scala/xiangshan/cache/ptw.scala
src/main/scala/xiangshan/cache/ptw.scala
+16
-9
未找到文件。
.gitignore
浏览文件 @
2ae18a2d
...
...
@@ -348,3 +348,4 @@ mill.rdiB
stale_outputs_checked
*.snapshot
src/main/scala/xiangshan/cache/ptw.scala
浏览文件 @
2ae18a2d
...
...
@@ -41,12 +41,19 @@ class PteBundle extends PtwBundle{
val
v
=
Bool
()
}
def
isPf
()
=
{
!
perm
.
v
||
(!
perm
.
r
&&
perm
.
w
)
def
unaligned
(
level
:
UInt
)
=
{
assert
(
level
=/=
3.
U
)
isLeaf
()
&&
!(
level
===
2.
U
||
level
===
1.
U
&&
ppn
(
vpnnLen
-
1
,
0
)
===
0.
U
||
level
===
0.
U
&&
ppn
(
vpnnLen
*
2
-
1
,
0
)
===
0.
U
)
}
def
isPf
(
level
:
UInt
)
=
{
!
perm
.
v
||
(!
perm
.
r
&&
perm
.
w
)
||
unaligned
(
level
)
}
def
isLeaf
()
=
{
!
isPf
()
&&
(
perm
.
r
||
perm
.
x
)
perm
.
r
||
perm
.
x
||
perm
.
w
}
override
def
toPrintable
:
Printable
=
{
...
...
@@ -280,7 +287,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
state
:=
state_wait_ready
}
}
.
elsewhen
(
l1Hit
&&
level
===
0.
U
||
l2Hit
&&
level
===
1.
U
)
{
level
:=
levelNext
// TODO: consider superpage
level
:=
levelNext
}
.
elsewhen
(
memReqReady
&&
!
sfenceLatch
)
{
state
:=
state_wait_resp
}
...
...
@@ -288,13 +295,13 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
is
(
state_wait_resp
)
{
when
(
memRespFire
)
{
when
(
memPte
.
isLeaf
()
||
memPte
.
isPf
())
{
when
(
memPte
.
isLeaf
()
||
memPte
.
isPf
(
level
))
{
when
(
resp
(
arbChosen
).
ready
)
{
state
:=
state_idle
}.
otherwise
{
state
:=
state_wait_ready
latch
.
entry
:=
new
TlbEntry
().
genTlbEntry
(
memRdata
,
level
,
req
.
vpn
)
latch
.
pf
:=
memPte
.
isPf
()
latch
.
pf
:=
memPte
.
isPf
(
level
)
}
}.
otherwise
{
level
:=
levelNext
...
...
@@ -343,12 +350,12 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
/*
* resp
*/
val
ptwFinish
=
(
state
===
state_req
&&
tlbHit
&&
level
===
0.
U
)
||
((
memPte
.
isLeaf
()
||
memPte
.
isPf
()
||
(!
memPte
.
isLeaf
()
&&
level
===
2.
U
))
&&
memRespFire
&&
!
sfenceLatch
)
||
state
===
state_wait_ready
val
ptwFinish
=
(
state
===
state_req
&&
tlbHit
&&
level
===
0.
U
)
||
((
memPte
.
isLeaf
()
||
memPte
.
isPf
(
level
)
||
(!
memPte
.
isLeaf
()
&&
level
===
2.
U
))
&&
memRespFire
&&
!
sfenceLatch
)
||
state
===
state_wait_ready
for
(
i
<-
0
until
PtwWidth
)
{
resp
(
i
).
valid
:=
valid
&&
arbChosen
===
i
.
U
&&
ptwFinish
// TODO: add resp valid logic
resp
(
i
).
bits
.
entry
:=
Mux
(
tlbHit
,
tlbHitData
,
Mux
(
state
===
state_wait_ready
,
latch
.
entry
,
new
TlbEntry
().
genTlbEntry
(
memRdata
,
Mux
(
level
===
3.
U
,
2.
U
,
level
),
req
.
vpn
)))
resp
(
i
).
bits
.
pf
:=
Mux
(
level
===
3.
U
||
notFound
,
true
.
B
,
Mux
(
tlbHit
,
false
.
B
,
Mux
(
state
===
state_wait_ready
,
latch
.
pf
,
memPte
.
isPf
())))
resp
(
i
).
bits
.
pf
:=
Mux
(
level
===
3.
U
||
notFound
,
true
.
B
,
Mux
(
tlbHit
,
false
.
B
,
Mux
(
state
===
state_wait_ready
,
latch
.
pf
,
memPte
.
isPf
(
level
))))
// TODO: the pf must not be correct, check it
}
...
...
@@ -360,7 +367,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
ptwl2
.
io
.
w
.
req
.
valid
:=
false
.
B
tlbl2
.
io
.
w
.
req
.
valid
:=
false
.
B
assert
(!
memRespFire
||
(
state
===
state_wait_resp
||
sfenceLatch
))
when
(
memRespFire
&&
!
memPte
.
isPf
()
&&
!
sfenceLatch
)
{
when
(
memRespFire
&&
!
memPte
.
isPf
(
level
)
&&
!
sfenceLatch
)
{
when
(
level
===
0.
U
&&
!
memPte
.
isLeaf
)
{
val
refillIdx
=
LFSR64
()(
log2Up
(
PtwL1EntrySize
)-
1
,
0
)
// TODO: may be LRU
ptwl1
(
refillIdx
).
refill
(
l1addr
,
memRdata
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录