Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
7b4fb03a
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,发现更多精彩内容 >>
提交
7b4fb03a
编写于
11月 23, 2019
作者:
Z
zhangzifei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
when store/load page-fault, delay one cycle
上级
621e2da2
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
23 addition
and
14 deletion
+23
-14
src/main/scala/noop/TLB.scala
src/main/scala/noop/TLB.scala
+22
-13
src/main/scala/utils/Debug.scala
src/main/scala/utils/Debug.scala
+1
-1
未找到文件。
src/main/scala/noop/TLB.scala
浏览文件 @
7b4fb03a
...
...
@@ -382,6 +382,9 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
val
victimWaymask
=
if
(
NTLB
>
1
)
(
1.
U
<<
LFSR64
()(
log2Up
(
NTLB
)-
1
,
0
))
else
"b1"
.
U
val
waymask
=
Mux
(
hit
,
hitVec
,
victimWaymask
)
val
loadPF
=
WireInit
(
false
.
B
)
val
storePF
=
WireInit
(
false
.
B
)
// hit
val
hitMeta
=
Mux1H
(
waymask
,
metas
).
asTypeOf
(
metaBundle
)
val
hitData
=
Mux1H
(
waymask
,
datas
).
asTypeOf
(
dataBundle
)
...
...
@@ -389,7 +392,7 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
val
hitMask
=
hitMeta
.
mask
// hit write back pte.flag
val
hitinstrPF
=
WireInit
(
false
.
B
)
val
hitWB
=
hit
&&
(!
hitFlag
.
a
||
!
hitFlag
.
d
&&
req
.
isWrite
())
&&
!
hitinstrPF
&&
!
io
.
pf
.
isPF
(
)
val
hitWB
=
hit
&&
(!
hitFlag
.
a
||
!
hitFlag
.
d
&&
req
.
isWrite
())
&&
!
hitinstrPF
&&
!
(
loadPF
||
storePF
||
io
.
pf
.
isPF
()
)
val
hitRefillFlag
=
Cat
(
req
.
isWrite
().
asUInt
,
1.
U
(
1.
W
),
0.
U
(
6.
W
))
|
hitFlag
.
asUInt
val
hitWBStore
=
RegEnable
(
Cat
(
0.
U
(
10.
W
),
hitData
.
ppn
,
0.
U
(
2.
W
),
hitRefillFlag
),
hitWB
)
...
...
@@ -407,15 +410,17 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
io
.
pf
.
loadPF
:=
false
.
B
io
.
pf
.
storePF
:=
false
.
B
io
.
pf
.
addr
:=
req
.
addr
io
.
pf
.
loadPF
:=
RegNext
(
loadPF
,
init
=
false
.
B
)
io
.
pf
.
storePF
:=
RegNext
(
storePF
,
init
=
false
.
B
)
if
(
tlbname
==
"itlb"
)
{
hitinstrPF
:=
!
hitExec
&&
hit
}
if
(
tlbname
==
"dtlb"
)
{
pf
.
loadPF
:=
!
hitLoad
&&
req
.
isRead
()
&&
hit
&&
!
isAMO
pf
.
storePF
:=
(!
hitStore
&&
req
.
isWrite
()
&&
hit
)
||
(!
hitLoad
&&
req
.
isRead
()
&&
hit
&&
isAMO
)
loadPF
:=
!
hitLoad
&&
req
.
isRead
()
&&
hit
&&
!
isAMO
storePF
:=
(!
hitStore
&&
req
.
isWrite
()
&&
hit
)
||
(!
hitLoad
&&
req
.
isRead
()
&&
hit
&&
isAMO
)
}
// miss
val
s_idle
::
s_memReadReq
::
s_memReadResp
::
s_write_pte
::
s_wait_resp
::
Nil
=
Enum
(
5
)
val
s_idle
::
s_memReadReq
::
s_memReadResp
::
s_write_pte
::
s_wait_resp
::
s_miss_slpf
::
Nil
=
Enum
(
6
)
val
state
=
RegInit
(
s_idle
)
val
level
=
RegInit
(
Level
.
U
(
log2Up
(
Level
).
W
))
...
...
@@ -468,11 +473,11 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
needFlush
:=
false
.
B
}.
elsewhen
(!(
missflag
.
r
||
missflag
.
x
)
&&
(
level
===
3.
U
||
level
===
2.
U
))
{
when
(!
missflag
.
v
||
(!
missflag
.
r
&&
missflag
.
w
))
{
//TODO: fix needflush
if
(
tlbname
==
"itlb"
)
{
state
:=
s_wait_resp
}
else
{
state
:=
s_
idle
}
if
(
tlbname
==
"itlb"
)
{
state
:=
s_wait_resp
}
else
{
state
:=
s_
miss_slpf
}
if
(
tlbname
==
"itlb"
)
{
missIPF
:=
true
.
B
}
if
(
tlbname
==
"dtlb"
)
{
pf
.
loadPF
:=
req
.
isRead
()
&&
!
isAMO
pf
.
storePF
:=
req
.
isWrite
()
||
isAMO
loadPF
:=
req
.
isRead
()
&&
!
isAMO
storePF
:=
req
.
isWrite
()
||
isAMO
}
Debug
()
{
if
(
debug
)
{
...
...
@@ -504,9 +509,9 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
}
if
(
tlbname
==
"dtlb"
)
{
when
((!
permLoad
&&
req
.
isRead
())
||
(!
permStore
&&
req
.
isWrite
()))
{
state
:=
s_
idle
pf
.
loadPF
:=
req
.
isRead
()
&&
!
isAMO
pf
.
storePF
:=
req
.
isWrite
()
||
isAMO
state
:=
s_
miss_slpf
loadPF
:=
req
.
isRead
()
&&
!
isAMO
storePF
:=
req
.
isWrite
()
||
isAMO
}.
otherwise
{
state
:=
Mux
(
updateAD
,
s_write_pte
,
s_wait_resp
)
missMetaRefill
:=
true
.
B
...
...
@@ -531,6 +536,10 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
missIPF
:=
false
.
B
alreadyOutFire
:=
false
.
B
}}
is
(
s_miss_slpf
)
{
state
:=
s_idle
}
}
// mem
...
...
@@ -557,9 +566,9 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
// io
io
.
out
.
bits
:=
req
io
.
out
.
bits
.
addr
:=
Mux
(
hit
,
maskPaddr
(
hitData
.
ppn
,
req
.
addr
(
PAddrBits
-
1
,
0
),
hitMask
),
maskPaddr
(
memRespStore
.
asTypeOf
(
pteBundle
).
ppn
,
req
.
addr
(
PAddrBits
-
1
,
0
),
missMaskStore
))
io
.
out
.
valid
:=
io
.
in
.
valid
&&
Mux
(
hit
&&
!
hitWB
,
!
io
.
pf
.
isPF
()
,
state
===
s_wait_resp
)
// && !alreadyOutFire
io
.
out
.
valid
:=
io
.
in
.
valid
&&
Mux
(
hit
&&
!
hitWB
,
!
(
io
.
pf
.
isPF
()
||
loadPF
||
storePF
)
,
state
===
s_wait_resp
)
// && !alreadyOutFire
io
.
in
.
ready
:=
io
.
out
.
ready
&&
(
state
===
s_idle
)
&&
!
miss
&&
!
hitWB
&&
metasTLB
.
io
.
ready
//maybe be optimized
io
.
in
.
ready
:=
io
.
out
.
ready
&&
(
state
===
s_idle
)
&&
!
miss
&&
!
hitWB
&&
metasTLB
.
io
.
ready
&&
(!
io
.
pf
.
isPF
()
&&
!
loadPF
&&
!
storePF
)
//maybe be optimized
io
.
ipf
:=
Mux
(
hit
,
hitinstrPF
,
missIPF
)
io
.
isFinish
:=
io
.
out
.
fire
()
||
io
.
pf
.
isPF
()
...
...
@@ -575,7 +584,7 @@ class TLBExec(implicit val tlbConfig: TLBConfig) extends TlbModule{
printf
(
"[TLBExec-"
+
tlbname
+
"]: meta: wen:%d dest:%x vpn:%x asid:%x mask:%x flag:%x asid:%x\n"
,
metasTLB
.
io
.
write
.
wen
,
metasTLB
.
io
.
write
.
dest
,
metasTLB
.
io
.
write
.
vpn
,
metasTLB
.
io
.
write
.
asid
,
metasTLB
.
io
.
write
.
mask
,
metasTLB
.
io
.
write
.
flag
,
metasTLB
.
io
.
write
.
asid
)
printf
(
"[TLBExec-"
+
tlbname
+
"]: data: wen:%d dest:%x ppn:%x pteaddr:%x\n"
,
datasTLB
.
io
.
write
.
wen
,
datasTLB
.
io
.
write
.
dest
,
datasTLB
.
io
.
write
.
ppn
,
datasTLB
.
io
.
write
.
pteaddr
)
printf
(
"[TLBExec-"
+
tlbname
+
"]: MemReq(%d, %d) MemResp(%d, %d) addr:%x cmd:%d rdata:%x cmd:%d\n"
,
io
.
mem
.
req
.
valid
,
io
.
mem
.
req
.
ready
,
io
.
mem
.
resp
.
valid
,
io
.
mem
.
resp
.
ready
,
io
.
mem
.
req
.
bits
.
addr
,
io
.
mem
.
req
.
bits
.
cmd
,
io
.
mem
.
resp
.
bits
.
rdata
,
io
.
mem
.
resp
.
bits
.
cmd
)
printf
(
"[TLBExec-"
+
tlbname
+
"]: io.ipf:%d hitinstrPF:%d missIPF:%d
loadPF:%d storePF:%d\n"
,
io
.
ipf
,
hitinstrPF
,
missIPF
,
io
.
pf
.
loadPF
,
io
.
pf
.
storePF
)
printf
(
"[TLBExec-"
+
tlbname
+
"]: io.ipf:%d hitinstrPF:%d missIPF:%d
pf.loadPF:%d pf.storePF:%d loadPF:%d storePF:%d\n"
,
io
.
ipf
,
hitinstrPF
,
missIPF
,
io
.
pf
.
loadPF
,
io
.
pf
.
storePF
,
loadPF
,
storePF
)
}
}
}
...
...
src/main/scala/utils/Debug.scala
浏览文件 @
7b4fb03a
...
...
@@ -7,7 +7,7 @@ import noop.NOOPConfig
object
Debug
{
def
apply
(
flag
:
Boolean
=
NOOPConfig
().
EnableDebug
,
cond
:
Bool
=
true
.
B
)(
body
:
=>
Unit
)
:
Any
=
if
(
flag
)
{
when
(
cond
&&
(
GTimer
()
>
17711010
0.
U
))
{
body
}
}
if
(
flag
)
{
when
(
cond
&&
(
GTimer
()
>
60258600.
U
&&
GTimer
()
<
6025885
0.
U
))
{
body
}
}
}
object
ShowType
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录