Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
f7a5c579
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,发现更多精彩内容 >>
提交
f7a5c579
编写于
11月 27, 2020
作者:
Z
ZhangZifei
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fix-ptw' into ptw-sp
上级
1798f651
d3e1d243
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
17 addition
and
14 deletion
+17
-14
src/main/scala/xiangshan/cache/ptw.scala
src/main/scala/xiangshan/cache/ptw.scala
+17
-14
未找到文件。
src/main/scala/xiangshan/cache/ptw.scala
浏览文件 @
f7a5c579
...
...
@@ -64,7 +64,7 @@ class PteBundle extends PtwBundle{
class
PtwEntry
(
tagLen
:
Int
)
extends
PtwBundle
{
val
tag
=
UInt
(
tagLen
.
W
)
val
ppn
=
UInt
(
ppnLen
.
W
)
val
perm
=
new
PermBundle
//
val perm = new PermBundle
// TODO: add superpage
def
hit
(
addr
:
UInt
)
=
{
...
...
@@ -75,21 +75,22 @@ class PtwEntry(tagLen: Int) extends PtwBundle {
def
refill
(
addr
:
UInt
,
pte
:
UInt
)
{
tag
:=
addr
(
PAddrBits
-
1
,
PAddrBits
-
tagLen
)
ppn
:=
pte
.
asTypeOf
(
pteBundle
).
ppn
perm
:=
pte
.
asTypeOf
(
pteBundle
).
perm
//
perm := pte.asTypeOf(pteBundle).perm
}
def
genPtwEntry
(
addr
:
UInt
,
pte
:
UInt
)
=
{
val
e
=
Wire
(
new
PtwEntry
(
tagLen
))
e
.
tag
:=
addr
(
PAddrBits
-
1
,
PAddrBits
-
tagLen
)
e
.
ppn
:=
pte
.
asTypeOf
(
pteBundle
).
ppn
e
.
perm
:=
pte
.
asTypeOf
(
pteBundle
).
perm
//
e.perm := pte.asTypeOf(pteBundle).perm
e
}
override
def
cloneType
:
this.
type
=
(
new
PtwEntry
(
tagLen
)).
asInstanceOf
[
this.
type
]
override
def
toPrintable
:
Printable
=
{
p
"tag:0x${Hexadecimal(tag)} ppn:0x${Hexadecimal(ppn)} perm:${perm}"
// p"tag:0x${Hexadecimal(tag)} ppn:0x${Hexadecimal(ppn)} perm:${perm}"
p
"tag:0x${Hexadecimal(tag)} ppn:0x${Hexadecimal(ppn)}"
}
}
...
...
@@ -181,15 +182,16 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
// val tlbl2 = SyncReadMem(TlbL2EntrySize, new TlbEntry)
val
tlbl2
=
Module
(
new
SRAMTemplate
(
new
TlbEntry
,
set
=
TlbL2EntrySize
))
val
tlbv
=
RegInit
(
0.
U
(
TlbL2EntrySize
.
W
))
// valid
val
tlbg
=
Reg
Init
(
0.
U
(
TlbL2EntrySize
.
W
))
// global
val
tlbg
=
Reg
(
UInt
(
TlbL2EntrySize
.
W
))
// global
val
ptwl1
=
Reg
(
Vec
(
PtwL1EntrySize
,
new
PtwEntry
(
tagLen
=
tagLen1
)))
val
l1v
=
RegInit
(
0.
U
(
PtwL1EntrySize
.
W
))
// valid
val
l1g
=
VecInit
((
ptwl1
.
map
(
_
.
perm
.
g
))).
asUInt
// val l1g = VecInit((ptwl1.map(_.perm.g))).asUInt
val
l1g
=
Reg
(
UInt
(
PtwL1EntrySize
.
W
))
// val ptwl2 = SyncReadMem(PtwL2EntrySize, new PtwEntry(tagLen = tagLen2)) // NOTE: the Mem could be only single port(r&w)
val
ptwl2
=
Module
(
new
SRAMTemplate
(
new
PtwEntry
(
tagLen
=
tagLen2
),
set
=
PtwL2EntrySize
))
val
l2v
=
RegInit
(
0.
U
(
PtwL2EntrySize
.
W
))
// valid
val
l2g
=
Reg
Init
(
0.
U
(
PtwL2EntrySize
.
W
))
// global
val
l2g
=
Reg
(
UInt
(
PtwL2EntrySize
.
W
))
// global
// mem alias
// val memRdata = mem.d.bits.data
val
memRdata
=
Wire
(
UInt
(
XLEN
.
W
))
...
...
@@ -246,7 +248,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
val
(
l2Hit
,
l2HitData
)
=
{
// TODO: add excp
val
readRam
=
(
l1Hit
&&
level
===
0.
U
&&
state
===
state_req
)
||
(
memRespFire
&&
state
===
state_wait_resp
&&
level
===
0.
U
)
val
ridx
=
l2addr
(
log2Up
(
PtwL2EntrySize
)-
1
+
log2Up
(
XLEN
/
8
),
log2Up
(
XLEN
/
8
))
assert
(
ptwl2
.
io
.
r
.
req
.
ready
)
ptwl2
.
io
.
r
.
req
.
valid
:=
readRam
ptwl2
.
io
.
r
.
req
.
bits
.
apply
(
setIdx
=
ridx
)
...
...
@@ -338,7 +340,7 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
lgSize
=
log2Up
(
l1BusDataWidth
/
8
).
U
).
_2
mem
.
a
.
bits
:=
pteRead
mem
.
a
.
valid
:=
state
===
state_req
&&
mem
.
a
.
valid
:=
state
===
state_req
&&
((
level
===
0.
U
&&
!
tlbHit
&&
!
l1Hit
)
||
(
level
===
1.
U
&&
!
l2Hit
)
||
(
level
===
2.
U
))
&&
!
sfenceLatch
&&
!
sfence
.
valid
...
...
@@ -372,27 +374,28 @@ class PTWImp(outer: PTW) extends PtwModule(outer){
val
refillIdx
=
LFSR64
()(
log2Up
(
PtwL1EntrySize
)-
1
,
0
)
// TODO: may be LRU
ptwl1
(
refillIdx
).
refill
(
l1addr
,
memRdata
)
l1v
:=
l1v
|
UIntToOH
(
refillIdx
)
l1g
:=
(
l1g
&
~
UIntToOH
(
refillIdx
))
|
Mux
(
memPte
.
perm
.
g
,
UIntToOH
(
refillIdx
),
0.
U
)
}
when
(
level
===
1.
U
&&
!
memPte
.
isLeaf
)
{
val
l2addrStore
=
RegEnable
(
l2addr
,
memReqFire
&&
state
===
state_req
&&
level
===
1.
U
)
val
refillIdx
=
getVpnn
(
req
.
vpn
,
1
)(
log2Up
(
PtwL2EntrySize
)-
1
,
0
)
assert
(
ptwl2
.
io
.
w
.
req
.
ready
)
// ptwl2.io.w.req.valid := true.B
ptwl2
.
io
.
w
.
apply
(
valid
=
true
.
B
,
setIdx
=
refillIdx
,
data
=
new
PtwEntry
(
tagLen2
).
genPtwEntry
(
l2addrStore
,
memRdata
),
waymask
=
-
1.
S
.
asUInt
)
// ptwl2.write(refillIdx, new PtwEntry(tagLen2).genPtwEntry(l2addrStore, memRdata))
l2v
:=
l2v
|
UIntToOH
(
refillIdx
)
l2g
:=
l2g
|
Mux
(
memPte
.
perm
.
g
,
UIntToOH
(
refillIdx
),
0.
U
)
l2g
:=
(
l2g
&
~
UIntToOH
(
refillIdx
))
|
Mux
(
memPte
.
perm
.
g
,
UIntToOH
(
refillIdx
),
0.
U
)
}
when
(
memPte
.
isLeaf
())
{
val
refillIdx
=
getVpnn
(
req
.
vpn
,
0
)(
log2Up
(
TlbL2EntrySize
)-
1
,
0
)
assert
(
tlbl2
.
io
.
w
.
req
.
ready
)
// tlbl2.io.w.req.valid := true.B
tlbl2
.
io
.
w
.
apply
(
valid
=
true
.
B
,
setIdx
=
refillIdx
,
data
=
new
TlbEntry
().
genTlbEntry
(
memRdata
,
level
,
req
.
vpn
),
waymask
=
-
1.
S
.
asUInt
)
// tlbl2.write(refillIdx, new TlbEntry().genTlbEntry(memRdata, level, req.vpn))
tlbv
:=
tlbv
|
UIntToOH
(
refillIdx
)
tlbg
:=
tlbg
|
Mux
(
memPte
.
perm
.
g
,
UIntToOH
(
refillIdx
),
0.
U
)
tlbg
:=
(
tlbg
&
~
UIntToOH
(
refillIdx
))
|
Mux
(
memPte
.
perm
.
g
,
UIntToOH
(
refillIdx
),
0.
U
)
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录