Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
5b4e7a96
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 搜索 >>
提交
5b4e7a96
编写于
1月 27, 2023
作者:
X
Xuan Hu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
v2backend: complete dummy issue queue
上级
bea42653
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
51 addition
and
29 deletion
+51
-29
src/main/scala/xiangshan/v2backend/issue/DeqPolicy.scala
src/main/scala/xiangshan/v2backend/issue/DeqPolicy.scala
+3
-3
src/main/scala/xiangshan/v2backend/issue/IssueQueue.scala
src/main/scala/xiangshan/v2backend/issue/IssueQueue.scala
+47
-23
src/main/scala/xiangshan/v2backend/issue/StatusArray.scala
src/main/scala/xiangshan/v2backend/issue/StatusArray.scala
+1
-3
未找到文件。
src/main/scala/xiangshan/v2backend/issue/DeqPolicy.scala
浏览文件 @
5b4e7a96
...
...
@@ -7,16 +7,16 @@ import utility.SelectOne
import
xiangshan.XSModule
class
DeqPolicyIO
(
implicit
p
:
IssueQueueParams
)
extends
Bundle
{
val
valid
=
Input
(
UInt
(
p
.
numEntries
.
W
))
val
request
=
Input
(
UInt
(
p
.
numEntries
.
W
))
val
deqSelOHVec
=
Vec
(
p
.
numDeq
,
ValidIO
(
UInt
(
p
.
numEntries
.
W
)))
}
class
DeqPolicy
(
implicit
p
:
Parameters
,
iqP
:
IssueQueueParams
)
extends
XSModule
{
val
io
=
IO
(
new
DeqPolicyIO
)
private
val
emptyVec
=
io
.
valid
.
asBools
.
map
(!
_
)
private
val
requestVec
=
VecInit
(
io
.
request
.
asBools
)
// Todo: support more policies
private
val
selVec
:
Seq
[(
Bool
,
Vec
[
Bool
])]
=
io
.
deqSelOHVec
.
indices
.
map
(
i
=>
SelectOne
(
"circ"
,
empty
Vec
,
iqP
.
numDeq
).
getNthOH
(
i
+
1
))
private
val
selVec
:
Seq
[(
Bool
,
Vec
[
Bool
])]
=
io
.
deqSelOHVec
.
indices
.
map
(
i
=>
SelectOne
(
"circ"
,
request
Vec
,
iqP
.
numDeq
).
getNthOH
(
i
+
1
))
io
.
deqSelOHVec
.
zip
(
selVec
).
foreach
{
case
(
deqOH
,
(
selValid
,
selOH
))
=>
deqOH
.
valid
:=
selValid
...
...
src/main/scala/xiangshan/v2backend/issue/IssueQueue.scala
浏览文件 @
5b4e7a96
...
...
@@ -18,11 +18,6 @@ case class IssueQueueParams(
var
numFastWakeup
:
Int
=
0
,
var
numWakeup
:
Int
=
0
,
var
allWakeup
:
Int
=
0
,
var
hasFeedback
:
Boolean
=
false
,
var
lsqFeedback
:
Boolean
=
false
,
var
fixedLatency
:
Int
=
-
1
,
var
checkWaitBit
:
Boolean
=
false
,
var
needScheduledBit
:
Boolean
=
false
,
var
hasJump
:
Boolean
=
false
,
var
hasLoad
:
Boolean
=
false
,
var
hasStore
:
Boolean
=
false
,
...
...
@@ -43,7 +38,6 @@ object DummyIQParams {
numFastWakeup
=
4
,
numWakeup
=
4
,
allWakeup
=
8
,
fixedLatency
=
0
,
)
}
}
...
...
@@ -57,7 +51,7 @@ class IssueQueue(implicit p: Parameters) extends LazyModule {
class
IssueQueueStatusBundle
(
numEnq
:
Int
)
extends
Bundle
{
val
empty
=
Output
(
Bool
())
val
full
=
Output
(
Bool
())
val
leftVec
=
Output
(
Vec
(
numEnq
,
Bool
()))
val
leftVec
=
Output
(
Vec
(
numEnq
+
1
,
Bool
()))
}
class
IssueQueueDeqRespBundle
(
implicit
p
:
Parameters
,
params
:
IssueQueueParams
)
extends
StatusArrayDeqRespBundle
...
...
@@ -71,6 +65,7 @@ class IssueQueueIO()(implicit p: Parameters, params: IssueQueueParams) extends X
val
deqResp
=
Vec
(
params
.
numDeq
,
ValidIO
(
new
IssueQueueDeqRespBundle
))
val
writeBack
=
Vec
(
params
.
numWakeup
,
Flipped
(
ValidIO
(
new
WriteBackBundle
(
params
.
dataBits
))))
val
status
=
Output
(
new
IssueQueueStatusBundle
(
params
.
numEnq
))
val
statusNext
=
Output
(
new
IssueQueueStatusBundle
(
params
.
numEnq
))
val
jump
=
if
(
params
.
hasJump
)
new
Bundle
{
val
pc
=
Input
(
UInt
(
VAddrBits
.
W
))
...
...
@@ -91,41 +86,32 @@ class IssueQueueIO()(implicit p: Parameters, params: IssueQueueParams) extends X
class
IssueQueueImp
(
outer
:
IssueQueue
)(
implicit
p
:
Parameters
,
iqParams
:
IssueQueueParams
)
extends
LazyModuleImp
(
outer
)
with
HasXSParameter
{
val
io
=
IO
(
new
IssueQueueIO
)
// Modules
val
statusArray
=
Module
(
new
StatusArray
)
val
immArray
=
Module
(
new
DataArray
(
UInt
(
XLEN
.
W
),
iqParams
.
numDeq
,
iqParams
.
numEnq
,
iqParams
.
numEntries
))
val
payloadArray
=
Module
(
new
DataArray
(
Output
(
new
DynInst
),
iqParams
.
numDeq
,
iqParams
.
numEnq
,
iqParams
.
numEntries
))
val
enqPolicy
=
Module
(
new
EnqPolicy
)
val
deqPolicy
=
Module
(
new
DeqPolicy
)
// Wires
val
enqValidVec
=
io
.
enq
.
map
(
_
.
valid
)
val
enqSelValidVec
=
Wire
(
Vec
(
iqParams
.
numEnq
,
Bool
()))
val
enqSelOHVec
=
Wire
(
Vec
(
iqParams
.
numEnq
,
UInt
(
iqParams
.
numEntries
.
W
)))
val
enqImmValidVec
=
io
.
enq
.
map
(
enq
=>
enq
.
valid
&&
enq
.
bits
.
imm
.
valid
)
val
enqImmVec
=
io
.
enq
.
map
(
_
.
bits
.
imm
.
bits
)
val
enqImmVec
=
VecInit
(
io
.
enq
.
map
(
_
.
bits
.
imm
.
bits
)
)
val
deqSelValidVec
=
Wire
(
Vec
(
iqParams
.
numDeq
,
Bool
()))
val
deqSelOHVec
=
Wire
(
Vec
(
iqParams
.
numDeq
,
UInt
(
iqParams
.
numEntries
.
W
)))
val
immArrayRdataVec
=
immArray
.
io
.
read
.
map
(
_
.
data
)
immArray
.
io
match
{
case
immArrayIO
:
DataArrayIO
[
UInt
]
=>
immArrayIO
.
write
.
zipWithIndex
.
foreach
{
case
(
w
,
i
)
=>
w
.
en
:=
enqSelValidVec
(
i
)
&&
enqImmValidVec
(
i
)
w
.
addr
:=
enqSelOHVec
(
i
)
w
.
data
:=
enqImmVec
(
i
)
}
immArrayIO
.
read
.
zipWithIndex
.
foreach
{
case
(
r
,
i
)
=>
r
.
addr
:=
Mux
(
deqSelValidVec
(
i
),
deqSelOHVec
(
i
),
0.
U
)
}
}
val
deqRespVec
=
io
.
deqResp
val
validVec
=
VecInit
(
statusArray
.
io
.
valid
.
asBools
)
val
canIssueVec
=
VecInit
(
statusArray
.
io
.
canIssue
.
asBools
)
val
clearVec
=
VecInit
(
statusArray
.
io
.
clear
.
asBools
)
val
deqFirstIssueVec
=
VecInit
(
statusArray
.
io
.
deq
.
map
(
_
.
isFirstIssue
))
statusArray
.
io
match
{
case
statusArrayIO
:
StatusArrayIO
=>
statusArrayIO
.
flush
:=
io
.
flush
statusArrayIO
.
flush
<>
io
.
flush
statusArrayIO
.
wakeup
.
zipWithIndex
.
foreach
{
case
(
wakeup
:
ValidIO
[
IssueQueueWakeUpBundle
],
i
)
=>
wakeup
.
valid
:=
io
.
writeBack
(
i
).
valid
wakeup
.
bits
:=
io
.
writeBack
(
i
).
bits
...
...
@@ -152,6 +138,18 @@ class IssueQueueImp(outer: IssueQueue)(implicit p: Parameters, iqParams: IssueQu
}
}
val
immArrayRdataVec
=
immArray
.
io
.
read
.
map
(
_
.
data
)
immArray
.
io
match
{
case
immArrayIO
:
DataArrayIO
[
UInt
]
=>
immArrayIO
.
write
.
zipWithIndex
.
foreach
{
case
(
w
,
i
)
=>
w
.
en
:=
enqSelValidVec
(
i
)
&&
enqImmValidVec
(
i
)
w
.
addr
:=
enqSelOHVec
(
i
)
w
.
data
:=
enqImmVec
(
i
)
}
immArrayIO
.
read
.
zipWithIndex
.
foreach
{
case
(
r
,
i
)
=>
r
.
addr
:=
Mux
(
deqSelValidVec
(
i
),
deqSelOHVec
(
i
),
0.
U
)
}
}
val
payloadArrayRdata
=
Wire
(
Vec
(
iqParams
.
numDeq
,
Output
(
new
DynInst
)))
payloadArray
.
io
match
{
case
payloadArrayIO
:
DataArrayIO
[
DynInst
]
=>
payloadArrayIO
.
write
.
zipWithIndex
.
foreach
{
case
(
w
,
i
)
=>
...
...
@@ -172,8 +170,34 @@ class IssueQueueImp(outer: IssueQueue)(implicit p: Parameters, iqParams: IssueQu
}
deqPolicy
match
{
case
dp
=>
dp
.
io
.
valid
:=
valid
Vec
.
asUInt
dp
.
io
.
request
:=
canIssue
Vec
.
asUInt
deqSelValidVec
:=
dp
.
io
.
deqSelOHVec
.
map
(
oh
=>
oh
.
valid
)
deqSelOHVec
:=
dp
.
io
.
deqSelOHVec
.
map
(
oh
=>
oh
.
bits
)
}
// Todo: better counter implementation
private
val
validCnt
=
PopCount
(
validVec
)
private
val
enqSelCnt
=
PopCount
(
enqSelValidVec
)
private
val
validCntNext
=
validCnt
+
enqSelCnt
io
.
status
.
full
:=
validVec
.
asUInt
.
andR
io
.
status
.
empty
:=
!
validVec
.
asUInt
.
orR
io
.
status
.
leftVec
(
0
)
:=
io
.
status
.
full
for
(
i
<-
0
until
iqParams
.
numEnq
)
{
io
.
status
.
leftVec
(
i
+
1
)
:=
validCnt
===
(
i
+
1
).
U
}
io
.
statusNext
.
full
:=
validCntNext
===
iqParams
.
numEntries
.
U
io
.
statusNext
.
empty
:=
validCntNext
===
0.
U
// always false now
io
.
statusNext
.
leftVec
(
0
)
:=
io
.
statusNext
.
full
for
(
i
<-
0
until
iqParams
.
numEnq
)
{
io
.
statusNext
.
leftVec
(
i
+
1
)
:=
validCntNext
===
(
i
+
1
).
U
}
io
.
deq
.
zipWithIndex
.
foreach
{
case
(
deq
,
i
)
=>
deq
.
valid
:=
deqSelValidVec
(
i
)
deq
.
bits
.
fuType
:=
payloadArrayRdata
(
i
).
fuType
deq
.
bits
.
fuOpType
:=
payloadArrayRdata
(
i
).
fuOpType
deq
.
bits
.
rfWen
:=
payloadArrayRdata
(
i
).
rfWen
deq
.
bits
.
fpWen
:=
payloadArrayRdata
(
i
).
fpWen
deq
.
bits
.
vecWen
:=
payloadArrayRdata
(
i
).
vecWen
}
}
src/main/scala/xiangshan/v2backend/issue/StatusArray.scala
浏览文件 @
5b4e7a96
...
...
@@ -6,7 +6,7 @@ import chisel3.util._
import
utils.XSError
import
xiangshan._
import
xiangshan.backend.rob.RobPtr
import
xiangshan.mem.
{
MemWaitUpdateReq
,
SqPtr
}
import
xiangshan.mem.
SqPtr
import
xiangshan.v2backend.Bundles.IssueQueueWakeUpBundle
class
StatusEntry
(
implicit
p
:
Parameters
,
params
:
IssueQueueParams
)
extends
Bundle
{
...
...
@@ -58,8 +58,6 @@ class StatusArrayIO(implicit p: Parameters, params: IssueQueueParams) extends XS
val
wakeup
=
Vec
(
params
.
numWakeup
,
Flipped
(
ValidIO
(
new
IssueQueueWakeUpBundle
)))
// deq
val
deq
=
Vec
(
params
.
numDeq
,
new
StatusArrayDeqBundle
)
val
stIssuePtr
=
if
(
params
.
checkWaitBit
)
Input
(
new
SqPtr
())
else
null
val
memWaitUpdateReq
=
if
(
params
.
checkWaitBit
)
Flipped
(
new
MemWaitUpdateReq
)
else
null
val
rsFeedback
=
Output
(
Vec
(
5
,
Bool
()))
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录