Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
fabcb6f8
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,发现更多精彩内容 >>
提交
fabcb6f8
编写于
2月 21, 2021
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ibuffer: use wire for validEntries
上级
2e548fed
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
50 addition
and
78 deletion
+50
-78
src/main/scala/xiangshan/frontend/Ibuffer.scala
src/main/scala/xiangshan/frontend/Ibuffer.scala
+50
-78
未找到文件。
src/main/scala/xiangshan/frontend/Ibuffer.scala
浏览文件 @
fabcb6f8
...
...
@@ -56,23 +56,18 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
// val ibuf = Reg(Vec(IBufSize, new IBufEntry))
val
ibuf
=
Module
(
new
SyncDataModuleTemplate
(
new
IBufEntry
,
IBufSize
,
DecodeWidth
,
PredictWidth
))
ibuf
.
io
.
wdata
.
map
(
w
=>
dontTouch
(
w
.
ftqOffset
))
val
head_ptr
=
RegInit
(
IbufPtr
(
false
.
B
,
0.
U
))
val
next_head_ptr
=
WireInit
(
head_ptr
)
val
head_vec
=
RegInit
(
VecInit
((
0
until
DecodeWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
))))
val
tail_vec
=
RegInit
(
VecInit
((
0
until
PredictWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
))))
val
head_ptr
=
head_vec
(
0
)
val
tail_ptr
=
tail_vec
(
0
)
// val validEntries = distanceBetween(tail_ptr, head_ptr) // valid entries
val
validEntries
=
RegInit
(
0.
U
(
log2Up
(
IBufSize
+
1
).
W
))
// valid entries
val
validEntries
=
distanceBetween
(
tail_ptr
,
head_ptr
)
val
allowEnq
=
RegInit
(
true
.
B
)
// 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
)
val
numDeq
=
PopCount
(
io
.
out
.
map
(
_
.
fire
)
)
validEntries
:=
validEntries
+
numEnq
-
numDeq
allowEnq
:=
(
IBufSize
.
U
-
PredictWidth
.
U
)
>=
(
validEntries
+
numEnq
)
allowEnq
:=
(
IBufSize
-
PredictWidth
).
U
>=
validEntries
+&
numEnq
// Enque
io
.
in
.
ready
:=
allowEnq
...
...
@@ -86,76 +81,56 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
}
}
when
(
io
.
in
.
fire
&&
!
io
.
flush
)
{
for
(
i
<-
0
until
PredictWidth
)
{
val
inWire
=
Wire
(
new
IBufEntry
)
inWire
:=
DontCare
when
(
io
.
in
.
bits
.
mask
(
i
))
{
inWire
.
inst
:=
io
.
in
.
bits
.
instrs
(
i
)
inWire
.
pc
:=
io
.
in
.
bits
.
pc
(
i
)
inWire
.
pd
:=
io
.
in
.
bits
.
pd
(
i
)
inWire
.
ipf
:=
io
.
in
.
bits
.
ipf
inWire
.
acf
:=
io
.
in
.
bits
.
acf
inWire
.
crossPageIPFFix
:=
io
.
in
.
bits
.
crossPageIPFFix
inWire
.
pred_taken
:=
io
.
in
.
bits
.
pred_taken
(
i
)
inWire
.
ftqPtr
:=
io
.
in
.
bits
.
ftqPtr
inWire
.
ftqOffset
:=
i
.
U
// ibuf(tail_vec(offset(i)).value) := inWire
}
ibuf
.
io
.
waddr
(
i
)
:=
tail_vec
(
offset
(
i
)).
value
ibuf
.
io
.
wdata
(
i
)
:=
inWire
ibuf
.
io
.
wen
(
i
)
:=
io
.
in
.
bits
.
mask
(
i
)
}
for
(
i
<-
0
until
PredictWidth
)
{
val
inWire
=
Wire
(
new
IBufEntry
)
inWire
.
inst
:=
io
.
in
.
bits
.
instrs
(
i
)
inWire
.
pc
:=
io
.
in
.
bits
.
pc
(
i
)
inWire
.
pd
:=
io
.
in
.
bits
.
pd
(
i
)
inWire
.
ipf
:=
io
.
in
.
bits
.
ipf
inWire
.
acf
:=
io
.
in
.
bits
.
acf
inWire
.
crossPageIPFFix
:=
io
.
in
.
bits
.
crossPageIPFFix
inWire
.
pred_taken
:=
io
.
in
.
bits
.
pred_taken
(
i
)
inWire
.
ftqPtr
:=
io
.
in
.
bits
.
ftqPtr
inWire
.
ftqOffset
:=
i
.
U
ibuf
.
io
.
waddr
(
i
)
:=
tail_vec
(
offset
(
i
)).
value
ibuf
.
io
.
wdata
(
i
)
:=
inWire
ibuf
.
io
.
wen
(
i
)
:=
io
.
in
.
bits
.
mask
(
i
)
&&
io
.
in
.
fire
&&
!
io
.
flush
}
when
(
io
.
in
.
fire
&&
!
io
.
flush
)
{
tail_vec
:=
VecInit
(
tail_vec
.
map
(
_
+
PopCount
(
io
.
in
.
bits
.
mask
)))
}.
otherwise
{
ibuf
.
io
.
wen
.
foreach
(
_
:=
false
.
B
)
ibuf
.
io
.
waddr
:=
DontCare
ibuf
.
io
.
wdata
:=
DontCare
}
// Deque
when
(
deqValid
)
{
val
validVec
=
UIntToMask
(
Mux
(
validEntries
>=
DecodeWidth
.
U
,
DecodeWidth
.
U
,
validEntries
),
DecodeWidth
)
io
.
out
.
zipWithIndex
.
foreach
{
case
(
e
,
i
)
=>
e
.
valid
:=
validVec
(
i
)}
next_head_ptr
:=
head_ptr
+
PopCount
(
io
.
out
.
map
(
_
.
fire
))
for
(
i
<-
0
until
DecodeWidth
)
{
val
outWire
=
ibuf
.
io
.
rdata
(
i
)
io
.
out
(
i
).
bits
.
instr
:=
outWire
.
inst
io
.
out
(
i
).
bits
.
pc
:=
outWire
.
pc
// io.out(i).bits.exceptionVec := Mux(outWire.ipf, UIntToOH(instrPageFault.U), 0.U)
io
.
out
(
i
).
bits
.
exceptionVec
:=
0.
U
.
asTypeOf
(
Vec
(
16
,
Bool
()))
io
.
out
(
i
).
bits
.
exceptionVec
(
instrPageFault
)
:=
outWire
.
ipf
io
.
out
(
i
).
bits
.
exceptionVec
(
instrAccessFault
)
:=
outWire
.
acf
// io.out(i).bits.brUpdate := outWire.brInfo
io
.
out
(
i
).
bits
.
pd
:=
outWire
.
pd
io
.
out
(
i
).
bits
.
pred_taken
:=
outWire
.
pred_taken
io
.
out
(
i
).
bits
.
ftqPtr
:=
outWire
.
ftqPtr
io
.
out
(
i
).
bits
.
ftqOffset
:=
outWire
.
ftqOffset
io
.
out
(
i
).
bits
.
crossPageIPFFix
:=
outWire
.
crossPageIPFFix
val
head_wire
=
next_head_ptr
.
value
+
i
.
U
ibuf
.
io
.
raddr
(
i
)
:=
head_wire
}
head_ptr
:=
next_head_ptr
}.
otherwise
{
ibuf
.
io
.
raddr
:=
DontCare
io
.
out
.
foreach
(
_
.
valid
:=
false
.
B
)
io
.
out
.
foreach
(
_
.
bits
<>
DontCare
)
// Dequeue
val
validVec
=
Mux
(
validEntries
>=
DecodeWidth
.
U
,
((
1
<<
DecodeWidth
)
-
1
).
U
,
UIntToMask
(
validEntries
,
DecodeWidth
))
for
(
i
<-
0
until
DecodeWidth
)
{
io
.
out
(
i
).
valid
:=
validVec
(
i
)
val
outWire
=
ibuf
.
io
.
rdata
(
i
)
io
.
out
(
i
).
bits
.
instr
:=
outWire
.
inst
io
.
out
(
i
).
bits
.
pc
:=
outWire
.
pc
// io.out(i).bits.exceptionVec := Mux(outWire.ipf, UIntToOH(instrPageFault.U), 0.U)
io
.
out
(
i
).
bits
.
exceptionVec
:=
0.
U
.
asTypeOf
(
Vec
(
16
,
Bool
()))
io
.
out
(
i
).
bits
.
exceptionVec
(
instrPageFault
)
:=
outWire
.
ipf
io
.
out
(
i
).
bits
.
exceptionVec
(
instrAccessFault
)
:=
outWire
.
acf
// io.out(i).bits.brUpdate := outWire.brInfo
io
.
out
(
i
).
bits
.
pd
:=
outWire
.
pd
io
.
out
(
i
).
bits
.
pred_taken
:=
outWire
.
pred_taken
io
.
out
(
i
).
bits
.
ftqPtr
:=
outWire
.
ftqPtr
io
.
out
(
i
).
bits
.
ftqOffset
:=
outWire
.
ftqOffset
io
.
out
(
i
).
bits
.
crossPageIPFFix
:=
outWire
.
crossPageIPFFix
}
val
next_head_vec
=
VecInit
(
head_vec
.
map
(
_
+
numDeq
))
ibuf
.
io
.
raddr
:=
VecInit
(
next_head_vec
.
map
(
_
.
value
))
head_vec
:=
next_head_vec
// Flush
when
(
io
.
flush
)
{
validEntries
:=
0.
U
when
(
io
.
flush
)
{
allowEnq
:=
true
.
B
head_ptr
.
value
:=
0.
U
head_ptr
.
flag
:=
false
.
B
head_vec
:=
VecInit
((
0
until
DecodeWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
)))
tail_vec
:=
VecInit
((
0
until
PredictWidth
).
map
(
_
.
U
.
asTypeOf
(
new
IbufPtr
)))
}
...
...
@@ -170,12 +145,9 @@ class Ibuffer extends XSModule with HasCircularQueuePtrHelper {
}
}
when
(
deqValid
)
{
XSDebug
(
"Deque:\n"
)
for
(
i
<-
0
until
DecodeWidth
){
XSDebug
(
p
"${Hexadecimal(io.out(i).bits.instr)} PC=${Hexadecimal(io.out(i).bits.pc)} v=${io.out(i).valid} r=${io.out(i).ready} "
+
p
"excpVec=${Binary(io.out(i).bits.exceptionVec.asUInt)} crossPageIPF=${io.out(i).bits.crossPageIPFFix}\n"
)
}
for
(
i
<-
0
until
DecodeWidth
)
{
XSDebug
(
io
.
out
(
i
).
fire
(),
p
"deq: ${Hexadecimal(io.out(i).bits.instr)} PC=${Hexadecimal(io.out(i).bits.pc)} v=${io.out(i).valid} r=${io.out(i).ready} "
+
p
"excpVec=${Binary(io.out(i).bits.exceptionVec.asUInt)} crossPageIPF=${io.out(i).bits.crossPageIPFFix}\n"
)
}
XSDebug
(
p
"ValidEntries: ${validEntries}\n"
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录