Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
0780c9f5
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,发现更多精彩内容 >>
提交
0780c9f5
编写于
12月 17, 2020
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
DispatchQueue: use Vec for deqPtr to reduce delay
上级
4c187f5b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
20 addition
and
11 deletion
+20
-11
src/main/scala/xiangshan/backend/dispatch/DispatchQueue.scala
...main/scala/xiangshan/backend/dispatch/DispatchQueue.scala
+20
-11
未找到文件。
src/main/scala/xiangshan/backend/dispatch/DispatchQueue.scala
浏览文件 @
0780c9f5
...
...
@@ -30,16 +30,15 @@ class DispatchQueue(size: Int, enqnum: Int, deqnum: Int) extends XSModule with H
val
headPtr
=
RegInit
(
0.
U
.
asTypeOf
(
new
CircularQueuePtr
(
size
)))
val
headPtrMask
=
UIntToMask
(
headPtr
.
value
,
size
)
// tail: first invalid entry (free entry)
val
tailPtr
=
RegInit
(
0.
U
.
asTypeOf
(
new
CircularQueuePtr
(
size
)))
val
tailPtrMask
=
UIntToMask
(
tailPtr
.
value
,
size
)
val
tailPtr
=
RegInit
(
VecInit
((
0
until
deqnum
).
map
(
_
.
U
.
asTypeOf
(
new
CircularQueuePtr
(
size
))
)))
val
tailPtrMask
=
UIntToMask
(
tailPtr
(
0
)
.
value
,
size
)
// TODO: make ptr a vector to reduce latency?
// deq: starting from head ptr
val
deqIndex
=
(
0
until
deqnum
).
map
(
i
=>
headPtr
+
i
.
U
).
map
(
_
.
value
)
// enq: starting from tail ptr
val
enqIndex
=
(
0
until
enqnum
).
map
(
i
=>
tailPtr
+
i
.
U
).
map
(
_
.
value
)
val
validEntries
=
distanceBetween
(
tailPtr
,
headPtr
)
val
validEntries
=
distanceBetween
(
tailPtr
(
0
)
,
headPtr
)
val
isTrueEmpty
=
~
Cat
((
0
until
size
).
map
(
i
=>
stateEntries
(
i
)
===
s_valid
)).
orR
val
canEnqueue
=
validEntries
<=
(
size
-
enqnum
).
U
val
canActualEnqueue
=
canEnqueue
&&
!(
io
.
redirect
.
valid
/*&& !io.redirect.bits.isReplay*/
)
...
...
@@ -60,8 +59,8 @@ class DispatchQueue(size: Int, enqnum: Int, deqnum: Int) extends XSModule with H
io
.
enqReady
:=
canEnqueue
for
(
i
<-
0
until
enqnum
)
{
when
(
io
.
enq
(
i
).
valid
&&
canActualEnqueue
)
{
uopEntries
(
enqIndex
(
i
)
)
:=
io
.
enq
(
i
).
bits
stateEntries
(
enqIndex
(
i
)
)
:=
s_valid
uopEntries
(
tailPtr
(
i
).
value
)
:=
io
.
enq
(
i
).
bits
stateEntries
(
tailPtr
(
i
).
value
)
:=
s_valid
}
}
...
...
@@ -130,12 +129,22 @@ class DispatchQueue(size: Int, enqnum: Int, deqnum: Int) extends XSModule with H
// enqueue
val
numEnq
=
Mux
(
canActualEnqueue
,
PriorityEncoder
(
io
.
enq
.
map
(!
_
.
valid
)
:+
true
.
B
),
0.
U
)
XSError
(
numEnq
=/=
0.
U
&&
(
mispredictionValid
||
exceptionValid
),
"should not enqueue when redirect\n"
)
tailPtr
:=
Mux
(
exceptionValid
,
tailPtr
(
0
)
:=
Mux
(
exceptionValid
,
0.
U
.
asTypeOf
(
new
CircularQueuePtr
(
size
)),
Mux
(
lastCycleMisprediction
,
Mux
(
isTrueEmpty
,
headPtr
,
walkedTailPtr
),
tailPtr
+
numEnq
)
tailPtr
(
0
)
+
numEnq
)
)
val
lastCycleException
=
RegNext
(
exceptionValid
)
val
lastLastCycleMisprediction
=
RegNext
(
lastCycleMisprediction
)
for
(
i
<-
1
until
deqnum
)
{
tailPtr
(
i
)
:=
Mux
(
exceptionValid
,
i
.
U
.
asTypeOf
(
new
CircularQueuePtr
(
size
)),
Mux
(
lastLastCycleMisprediction
,
tailPtr
(
0
)
+
i
.
U
,
tailPtr
(
i
)
+
numEnq
)
)
}
/**
...
...
@@ -149,7 +158,7 @@ class DispatchQueue(size: Int, enqnum: Int, deqnum: Int) extends XSModule with H
}
// debug: dump dispatch queue states
XSDebug
(
p
"head: $headPtr, tail: $
tailPtr
\n"
)
XSDebug
(
p
"head: $headPtr, tail: $
{tailPtr(0)}
\n"
)
XSDebug
(
p
"state: "
)
stateEntries
.
reverse
.
foreach
{
s
=>
XSDebug
(
false
,
s
===
s_invalid
,
"-"
)
...
...
@@ -158,11 +167,11 @@ class DispatchQueue(size: Int, enqnum: Int, deqnum: Int) extends XSModule with H
XSDebug
(
false
,
true
.
B
,
"\n"
)
XSDebug
(
p
"ptr: "
)
(
0
until
size
).
reverse
.
foreach
{
i
=>
val
isPtr
=
i
.
U
===
headPtr
.
value
||
i
.
U
===
tailPtr
.
value
val
isPtr
=
i
.
U
===
headPtr
.
value
||
i
.
U
===
tailPtr
(
0
)
.
value
XSDebug
(
false
,
isPtr
,
"^"
)
XSDebug
(
false
,
!
isPtr
,
" "
)
}
XSDebug
(
false
,
true
.
B
,
"\n"
)
XSError
(
isAfter
(
headPtr
,
tailPtr
),
p
"assert greaterOrEqualThan(tailPtr: $tailPtr
, headPtr: $headPtr) failed\n"
)
XSError
(
isAfter
(
headPtr
,
tailPtr
(
0
)),
p
"assert greaterOrEqualThan(tailPtr: ${tailPtr(0)}
, headPtr: $headPtr) failed\n"
)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录