Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
e9577ee5
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
8 个月 前同步成功
通知
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 搜索 >>
提交
e9577ee5
编写于
12月 26, 2020
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
roq: wrap enqPtr in separate module
上级
f280170c
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
60 addition
and
10 deletion
+60
-10
src/main/scala/xiangshan/backend/roq/Roq.scala
src/main/scala/xiangshan/backend/roq/Roq.scala
+60
-10
未找到文件。
src/main/scala/xiangshan/backend/roq/Roq.scala
浏览文件 @
e9577ee5
...
...
@@ -117,6 +117,50 @@ class RoqDeqPtrWrapper extends XSModule with HasCircularQueuePtrHelper {
}
class
RoqEnqPtrWrapper
extends
XSModule
with
HasCircularQueuePtrHelper
{
val
io
=
IO
(
new
Bundle
{
// for exceptions and interrupts
val
state
=
Input
(
UInt
(
2.
W
))
val
deq_v
=
Input
(
Bool
())
val
deq_w
=
Input
(
Bool
())
val
deq_exceptionVec
=
Input
(
UInt
(
16.
W
))
val
deq_flushPipe
=
Input
(
Bool
())
val
intrBitSetReg
=
Input
(
Bool
())
val
hasNoSpecExec
=
Input
(
Bool
())
val
commitType
=
Input
(
CommitType
())
// for input redirect
val
redirect
=
Input
(
Valid
(
new
Redirect
))
// for enqueue
val
allowEnqueue
=
Input
(
Bool
())
val
hasBlockBackward
=
Input
(
Bool
())
val
enq
=
Vec
(
RenameWidth
,
Input
(
Bool
()))
val
out
=
Output
(
new
RoqPtr
)
})
val
enqPtr
=
RegInit
(
0.
U
.
asTypeOf
(
new
RoqPtr
))
// for exceptions (flushPipe included) and interrupts:
// only consider the first instruction
val
intrEnable
=
io
.
intrBitSetReg
&&
!
io
.
hasNoSpecExec
&&
!
CommitType
.
isLoadStore
(
io
.
commitType
)
val
exceptionEnable
=
io
.
deq_w
&&
(
io
.
deq_exceptionVec
.
orR
||
io
.
deq_flushPipe
)
val
redirectOutValid
=
io
.
state
===
0.
U
&&
io
.
deq_v
&&
(
intrEnable
||
exceptionEnable
)
// enqueue
val
canAccept
=
io
.
allowEnqueue
&&
!
io
.
hasBlockBackward
val
dispatchNum
=
Mux
(
canAccept
,
PopCount
(
io
.
enq
),
0.
U
)
when
(
redirectOutValid
)
{
enqPtr
:=
0.
U
.
asTypeOf
(
new
RoqPtr
)
}.
elsewhen
(
io
.
redirect
.
valid
)
{
enqPtr
:=
io
.
redirect
.
bits
.
roqIdx
+
Mux
(
io
.
redirect
.
bits
.
flushItself
(),
0.
U
,
1.
U
)
}.
otherwise
{
enqPtr
:=
enqPtr
+
dispatchNum
}
io
.
out
:=
enqPtr
}
class
Roq
(
numWbPorts
:
Int
)
extends
XSModule
with
HasCircularQueuePtrHelper
{
val
io
=
IO
(
new
Bundle
()
{
val
redirect
=
Input
(
Valid
(
new
Redirect
))
...
...
@@ -146,7 +190,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
// pointers
// For enqueue ptr, we don't duplicate it since only enqueue needs it.
val
enqPtr
=
RegInit
(
0.
U
.
asTypeOf
(
new
RoqPtr
)
)
val
enqPtr
=
Wire
(
new
RoqPtr
)
val
deqPtrVec
=
Wire
(
Vec
(
CommitWidth
,
new
RoqPtr
))
val
walkPtrVec
=
Reg
(
Vec
(
CommitWidth
,
new
RoqPtr
))
...
...
@@ -444,14 +488,20 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
deqPtrGenModule
.
io
.
commitType
:=
deqDispatchData
.
commitType
deqPtrVec
:=
deqPtrGenModule
.
io
.
out
val
commitCnt
=
PopCount
(
io
.
commits
.
valid
)
when
(
io
.
redirectOut
.
valid
)
{
enqPtr
:=
0.
U
.
asTypeOf
(
new
RoqPtr
)
}.
elsewhen
(
io
.
redirect
.
valid
)
{
enqPtr
:=
io
.
redirect
.
bits
.
roqIdx
+
Mux
(
io
.
redirect
.
bits
.
flushItself
(),
0.
U
,
1.
U
)
}.
otherwise
{
enqPtr
:=
enqPtr
+
dispatchNum
}
val
enqPtrGenModule
=
Module
(
new
RoqEnqPtrWrapper
)
enqPtrGenModule
.
io
.
state
:=
state
enqPtrGenModule
.
io
.
deq_v
:=
commit_v
(
0
)
enqPtrGenModule
.
io
.
deq_w
:=
commit_w
(
0
)
enqPtrGenModule
.
io
.
deq_exceptionVec
:=
deqExceptionVec
.
asUInt
enqPtrGenModule
.
io
.
deq_flushPipe
:=
writebackData
.
io
.
rdata
(
0
).
flushPipe
enqPtrGenModule
.
io
.
intrBitSetReg
:=
intrBitSetReg
enqPtrGenModule
.
io
.
hasNoSpecExec
:=
hasNoSpecExec
enqPtrGenModule
.
io
.
commitType
:=
deqDispatchData
.
commitType
enqPtrGenModule
.
io
.
redirect
:=
io
.
redirect
enqPtrGenModule
.
io
.
allowEnqueue
:=
allowEnqueue
enqPtrGenModule
.
io
.
hasBlockBackward
:=
hasBlockBackward
enqPtrGenModule
.
io
.
enq
:=
VecInit
(
io
.
enq
.
req
.
map
(
_
.
valid
))
enqPtr
:=
enqPtrGenModule
.
io
.
out
val
thisCycleWalkCount
=
Mux
(
walkFinished
,
walkCounter
,
CommitWidth
.
U
)
when
(
io
.
redirect
.
valid
&&
state
=/=
s_extrawalk
)
{
...
...
@@ -465,7 +515,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
val
lastCycleRedirect
=
RegNext
(
io
.
redirect
.
valid
)
val
trueValidCounter
=
Mux
(
lastCycleRedirect
,
distanceBetween
(
enqPtr
,
deqPtr
),
validCounter
)
val
commitCnt
=
PopCount
(
io
.
commits
.
valid
)
validCounter
:=
Mux
(
io
.
redirectOut
.
valid
,
0.
U
,
Mux
(
state
===
s_idle
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录