Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
76e02f07
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
10 个月 前同步成功
通知
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,体验更适合开发者的 AI 搜索 >>
提交
76e02f07
编写于
12月 10, 2021
作者:
L
Lingrui98
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wrbypass: use CAM to store idx and tag and use Mem to store data
上级
d71e9942
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
35 addition
and
25 deletion
+35
-25
src/main/scala/xiangshan/cache/mmu/MMUBundle.scala
src/main/scala/xiangshan/cache/mmu/MMUBundle.scala
+1
-1
src/main/scala/xiangshan/frontend/WrBypass.scala
src/main/scala/xiangshan/frontend/WrBypass.scala
+34
-24
未找到文件。
src/main/scala/xiangshan/cache/mmu/MMUBundle.scala
浏览文件 @
76e02f07
...
...
@@ -92,7 +92,7 @@ class CAMTemplate[T <: Data](val gen: T, val set: Int, val readWidth: Int)(impli
}
when
(
io
.
w
.
valid
)
{
array
(
io
.
w
.
bits
.
index
)
:=
io
.
w
.
bits
.
data
array
(
io
.
w
.
bits
.
index
)
:=
io
.
w
.
bits
.
data
.
asUInt
}
}
...
...
src/main/scala/xiangshan/frontend/WrBypass.scala
浏览文件 @
76e02f07
...
...
@@ -21,6 +21,7 @@ import chisel3.util._
import
xiangshan._
import
utils._
import
chisel3.experimental.chiselName
import
xiangshan.cache.mmu.CAMTemplate
class
WrBypass
[
T
<:
Data
](
gen
:
T
,
val
numEntries
:
Int
,
val
idxWidth
:
Int
,
val
numWays
:
Int
=
1
,
val
tagWidth
:
Int
=
0
)(
implicit
p
:
Parameters
)
extends
XSModule
{
...
...
@@ -45,54 +46,63 @@ class WrBypass[T <: Data](gen: T, val numEntries: Int, val idxWidth: Int,
override
def
cloneType
=
(
new
WrBypassPtr
).
asInstanceOf
[
this.
type
]
}
class
Idx_Tag
extends
Bundle
{
val
idx
=
UInt
(
idxWidth
.
W
)
val
tag
=
if
(
hasTag
)
Some
(
UInt
(
tagWidth
.
W
))
else
None
def
apply
(
idx
:
UInt
,
tag
:
UInt
)
=
{
this
.
idx
:=
idx
this
.
tag
.
map
(
_
:=
tag
)
}
}
val
idx_tag_cam
=
Module
(
new
CAMTemplate
(
new
Idx_Tag
,
numEntries
,
1
))
val
data_mem
=
Mem
(
numEntries
,
Vec
(
numWays
,
gen
))
val
tags
=
RegInit
(
0.
U
.
asTypeOf
((
Vec
(
numEntries
,
UInt
(
tagWidth
.
W
)))))
val
idxes
=
RegInit
(
0.
U
.
asTypeOf
((
Vec
(
numEntries
,
UInt
(
idxWidth
.
W
)))))
val
datas
=
RegInit
(
0.
U
.
asTypeOf
(
Vec
(
numEntries
,
Vec
(
numWays
,
gen
))))
val
valids
=
RegInit
(
0.
U
.
asTypeOf
(
Vec
(
numEntries
,
Vec
(
numWays
,
Bool
()))))
val
enq_ptr
=
RegInit
(
0.
U
.
asTypeOf
(
new
WrBypassPtr
))
val
enq_idx
=
enq_ptr
.
value
val
hits
=
VecInit
((
0
until
numEntries
).
map
{
i
=>
idxes
(
i
)
===
io
.
write_idx
&&
tags
(
i
)
===
io
.
write_tag
.
getOrElse
(
0.
U
)
})
val
hit
=
hits
.
reduce
(
_
||
_
)
val
hit_idx
=
ParallelPriorityEncoder
(
hits
)
idx_tag_cam
.
io
.
r
.
req
(
0
)(
io
.
write_idx
,
io
.
write_tag
.
getOrElse
(
0.
U
))
val
hits_oh
=
idx_tag_cam
.
io
.
r
.
resp
(
0
)
val
hit_idx
=
OHToUInt
(
hits_oh
)
val
hit
=
hits_oh
.
reduce
(
_
||
_
)
io
.
hit
:=
hit
for
(
i
<-
0
until
numWays
)
{
io
.
hit_data
(
i
).
valid
:=
valids
(
hit_idx
)(
i
)
io
.
hit_data
(
i
).
bits
:=
data
s
(
hit_idx
)(
i
)
io
.
hit_data
(
i
).
valid
:=
Mux1H
(
hits_oh
,
valids
)(
i
)
io
.
hit_data
(
i
).
bits
:=
data
_mem
.
read
(
hit_idx
)(
i
)
}
val
full_mask
=
Fill
(
numWays
,
1.
U
(
1.
W
)).
asTypeOf
(
Vec
(
numWays
,
Bool
()))
val
update_way_mask
=
io
.
write_way_mask
.
getOrElse
(
full_mask
)
// write data on every request
when
(
io
.
wen
)
{
val
data_write_idx
=
Mux
(
hit
,
hit_idx
,
enq_idx
)
data_mem
.
write
(
data_write_idx
,
io
.
write_data
,
update_way_mask
)
}
// update valids
for
(
i
<-
0
until
numWays
)
{
when
(
io
.
wen
)
{
val
full_mask
=
Fill
(
numWays
,
1.
U
(
1.
W
)).
asTypeOf
(
Vec
(
numWays
,
Bool
()))
val
update_this_way
=
io
.
write_way_mask
.
getOrElse
(
full_mask
)(
i
)
when
(
hit
)
{
when
(
update_this_way
)
{
datas
(
hit_idx
)(
i
)
:=
io
.
write_data
(
i
)
when
(
update_way_mask
(
i
))
{
valids
(
hit_idx
)(
i
)
:=
true
.
B
}
}.
otherwise
{
valids
(
enq_idx
)(
i
)
:=
false
.
B
when
(
update_
this_way
)
{
when
(
update_
way_mask
(
i
)
)
{
valids
(
enq_idx
)(
i
)
:=
true
.
B
datas
(
enq_idx
)(
i
)
:=
io
.
write_data
(
i
)
}
}
}
}
when
(
io
.
wen
&&
!
hit
)
{
idxes
(
enq_idx
)
:=
io
.
write_idx
tags
(
enq_idx
)
:=
io
.
write_tag
.
getOrElse
(
0.
U
)
enq_ptr
:=
enq_ptr
+
1.
U
}
val
enq_en
=
io
.
wen
&&
!
hit
idx_tag_cam
.
io
.
w
.
valid
:=
enq_en
idx_tag_cam
.
io
.
w
.
bits
.
index
:=
enq_idx
idx_tag_cam
.
io
.
w
.
bits
.
data
(
io
.
write_idx
,
io
.
write_tag
.
getOrElse
(
0.
U
))
enq_ptr
:=
enq_ptr
+
enq_en
XSPerfAccumulate
(
"wrbypass_hit"
,
io
.
wen
&&
hit
)
XSPerfAccumulate
(
"wrbypass_miss"
,
io
.
wen
&&
!
hit
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录