Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
fac40754
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(gitcode.net)2024年7月9日维护升级公告
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
fac40754
编写于
12月 25, 2020
作者:
L
Lingrui98
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/opt-ibuf' into ifu-timing
上级
90fdba2f
9aca9db7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
13 deletion
+23
-13
src/main/scala/xiangshan/frontend/Ibuffer.scala
src/main/scala/xiangshan/frontend/Ibuffer.scala
+23
-13
未找到文件。
src/main/scala/xiangshan/frontend/Ibuffer.scala
浏览文件 @
fac40754
...
...
@@ -52,24 +52,33 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
}
// Ibuffer define
val
ibuf
=
Mem
(
IBufSize
,
new
IBufEntry
)
val
ibuf
=
Reg
(
Vec
(
IBufSize
,
new
IBufEntry
)
)
val
head_ptr
=
RegInit
(
IbufPtr
(
false
.
B
,
0.
U
))
val
tail_ptr
=
RegInit
(
IbufPtr
(
false
.
B
,
0.
U
))
val
tail_vec
=
RegInit
(
VecInit
((
0
until
PredictWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
))))
val
tail_ptr
=
tail_vec
(
0
)
val
validEntries
=
distanceBetween
(
tail_ptr
,
head_ptr
)
// valid entries
// val validEntries = distanceBetween(tail_ptr, head_ptr) // valid entries
val
validEntries
=
RegInit
(
0.
U
((
log2Up
(
IBufSize
)+
1
).
W
))
// valid entries
val
allowEnq
=
RegInit
(
true
.
B
)
val
enqValid
=
IBufSize
.
U
-
PredictWidth
.
U
>=
validEntries
// val enqValid = (IBufSize.U - PredictWidth.U)
>= validEntries
val
deqValid
=
validEntries
>
0.
U
val
numEnq
=
Mux
(
io
.
in
.
fire
,
PopCount
(
io
.
in
.
bits
.
mask
),
0.
U
)
val
numDeq
=
Mux
(
deqValid
,
PopCount
(
io
.
out
.
map
(
_
.
fire
)),
0.
U
)
validEntries
:=
validEntries
+
numEnq
-
numDeq
allowEnq
:=
(
IBufSize
.
U
-
PredictWidth
.
U
)
>=
(
validEntries
+
numEnq
)
// Enque
io
.
in
.
ready
:=
enqValid
io
.
in
.
ready
:=
allowEnq
val
enq_vec
=
Wire
(
Vec
(
PredictWidth
,
UInt
(
log2Up
(
IBufSize
).
W
)))
val
offset
=
Wire
(
Vec
(
PredictWidth
,
UInt
(
log2Up
(
PredictWidth
).
W
)))
for
(
i
<-
0
until
PredictWidth
)
{
if
(
i
==
0
)
{
enq_vec
(
i
)
:=
tail_ptr
.
value
offset
(
i
)
:=
0.
U
}
else
{
enq_vec
(
i
)
:=
tail_ptr
.
value
+
PopCount
(
io
.
in
.
bits
.
pdmask
(
i
-
1
,
0
))
offset
(
i
)
:=
PopCount
(
io
.
in
.
bits
.
pdmask
(
i
-
1
,
0
))
}
}
...
...
@@ -87,11 +96,11 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
inWire
.
ipf
:=
io
.
in
.
bits
.
ipf
inWire
.
acf
:=
io
.
in
.
bits
.
acf
inWire
.
crossPageIPFFix
:=
io
.
in
.
bits
.
crossPageIPFFix
ibuf
(
enq_vec
(
i
)
)
:=
inWire
ibuf
(
tail_vec
(
offset
(
i
)).
value
)
:=
inWire
}
}
tail_
ptr
:=
tail_ptr
+
PopCount
(
io
.
in
.
bits
.
mask
)
tail_
vec
:=
VecInit
(
tail_vec
.
map
(
_
+
PopCount
(
io
.
in
.
bits
.
mask
))
)
}
// Deque
...
...
@@ -125,10 +134,11 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
// Flush
when
(
io
.
flush
)
{
validEntries
:=
0.
U
allowEnq
:=
true
.
B
head_ptr
.
value
:=
0.
U
head_ptr
.
flag
:=
false
.
B
tail_ptr
.
value
:=
0.
U
tail_ptr
.
flag
:=
false
.
B
tail_vec
:=
VecInit
((
0
until
PredictWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
)))
}
// Debug info
...
...
@@ -164,7 +174,7 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
// )
// }
XSDebug
(
p
"last_head_ptr=$head_ptr last_tail_ptr=$tail_ptr\n"
)
XSDebug
(
p
"
validEntries=$validEntries,
last_head_ptr=$head_ptr last_tail_ptr=$tail_ptr\n"
)
for
(
i
<-
0
until
IBufSize
/
8
)
{
XSDebug
(
"%x | %x | %x | %x | %x | %x | %x | %x\n"
,
ibuf
(
i
*
8
+
0
).
inst
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录