Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
f698fe9c
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,发现更多精彩内容 >>
提交
f698fe9c
编写于
12月 17, 2020
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dtlb: don't select refill entry when ptw.resp.fire
上级
25c195c7
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
28 addition
and
17 deletion
+28
-17
src/main/scala/xiangshan/cache/dtlb.scala
src/main/scala/xiangshan/cache/dtlb.scala
+28
-17
未找到文件。
src/main/scala/xiangshan/cache/dtlb.scala
浏览文件 @
f698fe9c
...
...
@@ -273,8 +273,32 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
val
entry
=
Reg
(
Vec
(
TlbEntrySize
,
new
TlbEntry
))
val
g
=
VecInit
(
entry
.
map
(
_
.
perm
.
g
)).
asUInt
// TODO: need check if reverse is needed
/**
* PTW refill
*/
val
refill
=
ptw
.
resp
.
fire
()
val
randIdx
=
LFSR64
()(
log2Up
(
TlbEntrySize
)-
1
,
0
)
val
priorIdx
=
PriorityEncoder
(~(
v
|
pf
))
val
tlbfull
=
ParallelAND
((
v
|
pf
).
asBools
)
val
refillIdx
=
Mux
(
tlbfull
,
randIdx
,
priorIdx
)
val
refillIdxOH
=
UIntToOH
(
refillIdx
)
when
(
refill
)
{
v
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
v
&
~
refillIdxOH
,
v
|
refillIdxOH
)
entry
(
refillIdx
)
:=
ptw
.
resp
.
bits
.
entry
XSDebug
(
p
"Refill: idx:${refillIdx} entry:${ptw.resp.bits.entry}\n"
)
}
/**
* L1 TLB read
*/
val
tlb_read_mask
=
Mux
(
refill
,
refillIdxOH
,
0.
U
(
TlbEntrySize
.
W
))
def
TLBRead
(
i
:
Int
)
=
{
val
entryHitVec
=
VecInit
(
entry
.
map
(
_
.
hit
(
reqAddr
(
i
).
vpn
/*, satp.asid*/
)))
val
entryHitVec
=
(
if
(
isDtlb
)
VecInit
((
tlb_read_mask
.
asBools
zip
entry
).
map
{
case
(
r
,
e
)
=>
!
r
&&
e
.
hit
(
reqAddr
(
i
).
vpn
/*, satp.asid*/
)})
else
VecInit
(
entry
.
map
(
_
.
hit
(
reqAddr
(
i
).
vpn
/*, satp.asid*/
)))
)
val
reqAddrReg
=
if
(
isDtlb
)
RegNext
(
reqAddr
(
i
))
else
reqAddr
(
i
)
val
cmdReg
=
if
(
isDtlb
)
RegNext
(
cmd
(
i
))
else
cmd
(
i
)
...
...
@@ -364,25 +388,12 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
val
pfHitReset
=
ParallelOR
(
widthMap
{
i
=>
Mux
(
resp
(
i
).
fire
(),
VecInit
(
pfHitVecVec
(
i
)).
asUInt
,
0.
U
)
})
val
pfHitRefill
=
ParallelOR
(
pfHitReset
.
asBools
)
// refill
val
refill
=
ptw
.
resp
.
fire
()
val
randIdx
=
LFSR64
()(
log2Up
(
TlbEntrySize
)-
1
,
0
)
val
priorIdx
=
PriorityEncoder
(~(
v
|
pf
))
val
tlbfull
=
ParallelAND
((
v
|
pf
).
asBools
)
val
refillIdx
=
Mux
(
tlbfull
,
randIdx
,
priorIdx
)
val
re2OH
=
UIntToOH
(
refillIdx
)
when
(
refill
)
{
v
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
v
&
~
re2OH
,
v
|
re2OH
)
entry
(
refillIdx
)
:=
ptw
.
resp
.
bits
.
entry
XSDebug
(
p
"Refill: idx:${refillIdx} entry:${ptw.resp.bits.entry}\n"
)
}
// pf update
when
(
refill
)
{
when
(
pfHitRefill
)
{
pf
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
pf
|
re
2OH
,
pf
&
~
re2
OH
)
&
~
pfHitReset
pf
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
pf
|
re
fillIdxOH
,
pf
&
~
refillIdx
OH
)
&
~
pfHitReset
}
.
otherwise
{
pf
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
pf
|
re
2OH
,
pf
&
~
re2
OH
)
pf
:=
Mux
(
ptw
.
resp
.
bits
.
pf
,
pf
|
re
fillIdxOH
,
pf
&
~
refillIdx
OH
)
}
}
.
otherwise
{
when
(
pfHitRefill
)
{
...
...
@@ -390,7 +401,7 @@ class TLB(Width: Int, isDtlb: Boolean) extends TlbModule with HasCSRConst{
}
}
when
(
PopCount
(
pf
)
>
10.
U
)
{
// when too much pf, just clear
pf
:=
Mux
(
refill
&&
ptw
.
resp
.
bits
.
pf
,
re
2
OH
,
0.
U
)
pf
:=
Mux
(
refill
&&
ptw
.
resp
.
bits
.
pf
,
re
fillIdx
OH
,
0.
U
)
}
// sfence (flush)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录