Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
f01f8323
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,发现更多精彩内容 >>
提交
f01f8323
编写于
7月 29, 2020
作者:
Y
Yinan Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dispatch2: add ls logic
上级
250b716d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
107 addition
and
5 deletion
+107
-5
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
+16
-5
src/main/scala/xiangshan/backend/dispatch/Dispatch2Ls.scala
src/main/scala/xiangshan/backend/dispatch/Dispatch2Ls.scala
+91
-0
未找到文件。
src/main/scala/xiangshan/backend/dispatch/Dispatch2Int.scala
浏览文件 @
f01f8323
...
...
@@ -44,7 +44,18 @@ class Dispatch2Int extends XSModule {
val
validVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
valid
)).
reduceLeft
(
_
++
_
)
val
indexVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
val
rsValidVec
=
allIndexGen
.
map
(
_
.
io
.
reverseMapping
.
map
(
_
.
valid
)).
reduceLeft
(
_
++
_
)
val
rsIndexVec
=
allIndexGen
.
map
(
_
.
io
.
reverseMapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
val
rsIndexVecRaw
=
allIndexGen
.
map
(
_
.
io
.
reverseMapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
val
rsIndexVec
=
rsIndexVecRaw
.
zipWithIndex
.
map
{
case
(
index
,
i
)
=>
(
if
(
i
>=
exuParameters
.
JmpCnt
+
exuParameters
.
AluCnt
)
{
index
+
exuParameters
.
JmpCnt
.
U
+
exuParameters
.
AluCnt
.
U
}
else
if
(
i
>=
exuParameters
.
JmpCnt
)
{
index
+
exuParameters
.
JmpCnt
.
U
}
else
{
index
})
}
/**
* Part 2: assign regfile read ports
...
...
@@ -73,10 +84,10 @@ class Dispatch2Int extends XSModule {
enq
.
valid
:=
validVec
(
i
)
enq
.
bits
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
enq
.
bits
.
src1State
:=
io
.
regRdy
(
readPortIndex
(
i
))
enq
.
bits
.
src
1
State
:=
io
.
regRdy
(
readPortIndex
(
i
)
+
1.
U
)
enq
.
bits
.
src
2
State
:=
io
.
regRdy
(
readPortIndex
(
i
)
+
1.
U
)
XSInfo
(
enq
.
fire
(),
p
"pc 0x${Hexadecimal(enq.bits.cf.pc)} with type ${enq.bits.ctrl.fuType}"
+
p
"srcState(${enq.bits.src1State} ${enq.bits.src2State}
${enq.bits.src3State})
"
+
XSInfo
(
enq
.
fire
(),
p
"pc 0x${Hexadecimal(enq.bits.cf.pc)} with type ${enq.bits.ctrl.fuType}
"
+
p
"srcState(${enq.bits.src1State} ${enq.bits.src2State}
)
"
+
p
"enters reservation station $i from ${indexVec(i)}\n"
)
}
...
...
@@ -89,7 +100,7 @@ class Dispatch2Int extends XSModule {
XSInfo
(
io
.
fromDq
(
i
).
fire
(),
p
"pc 0x${Hexadecimal(io.fromDq(i).bits.cf.pc)} leaves Int dispatch queue $i with nroq ${io.fromDq(i).bits.roqIdx}\n"
)
XSDebug
(
io
.
fromDq
(
i
).
valid
&&
!
io
.
fromDq
(
i
).
ready
,
p
"pc 0x${Hexadecimal(io.fromDq(i).bits.cf.pc)} waits at Int dispatch queue with index
%d
\n"
)
p
"pc 0x${Hexadecimal(io.fromDq(i).bits.cf.pc)} waits at Int dispatch queue with index
$i
\n"
)
}
/**
...
...
src/main/scala/xiangshan/backend/dispatch/Dispatch2Ls.scala
0 → 100644
浏览文件 @
f01f8323
package
xiangshan.backend.dispatch
import
chisel3._
import
chisel3.util._
import
xiangshan._
import
utils._
import
xiangshan.backend.regfile.RfReadPort
import
xiangshan.backend.exu._
class
Dispatch2Ls
extends
XSModule
{
val
io
=
IO
(
new
Bundle
()
{
val
fromDq
=
Flipped
(
Vec
(
dpParams
.
LsDqDeqWidth
,
DecoupledIO
(
new
MicroOp
)))
val
intRegAddr
=
Vec
(
NRMemReadPorts
,
Output
(
UInt
(
PhyRegIdxWidth
.
W
)))
val
fpRegAddr
=
Vec
(
exuParameters
.
StuCnt
,
Output
(
UInt
(
PhyRegIdxWidth
.
W
)))
val
intRegRdy
=
Vec
(
NRMemReadPorts
,
Input
(
Bool
()))
val
fpRegRdy
=
Vec
(
exuParameters
.
StuCnt
,
Input
(
Bool
()))
val
numExist
=
Input
(
Vec
(
exuParameters
.
LsExuCnt
,
UInt
(
log2Ceil
(
IssQueSize
).
W
)))
val
enqIQCtrl
=
Vec
(
exuParameters
.
LsExuCnt
,
DecoupledIO
(
new
MicroOp
))
})
/**
* Part 1: generate indexes for reservation stations
*/
val
loadIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
LsDqDeqWidth
,
exuParameters
.
LduCnt
,
true
))
val
storeIndexGen
=
Module
(
new
IndexMapping
(
dpParams
.
LsDqDeqWidth
,
exuParameters
.
StuCnt
,
true
))
val
loadPriority
=
PriorityGen
((
0
until
exuParameters
.
LduCnt
).
map
(
i
=>
io
.
numExist
(
i
)))
val
storePriority
=
PriorityGen
((
0
until
exuParameters
.
StuCnt
).
map
(
i
=>
io
.
numExist
(
i
+
exuParameters
.
LduCnt
)))
for
(
i
<-
0
until
dpParams
.
LsDqDeqWidth
)
{
loadIndexGen
.
io
.
validBits
(
i
)
:=
Exu
.
ldExeUnitCfg
.
canAccept
(
io
.
fromDq
(
i
).
bits
.
ctrl
.
fuType
)
storeIndexGen
.
io
.
validBits
(
i
)
:=
Exu
.
stExeUnitCfg
.
canAccept
(
io
.
fromDq
(
i
).
bits
.
ctrl
.
fuType
)
XSDebug
(
io
.
fromDq
(
i
).
valid
,
p
"ls dp queue $i: ${Hexadecimal(io.fromDq(i).bits.cf.pc)} type ${Binary(io.fromDq(i).bits.ctrl.fuType)}\n"
)
}
for
(
i
<-
0
until
exuParameters
.
LduCnt
)
{
loadIndexGen
.
io
.
priority
(
i
)
:=
loadPriority
(
i
)
}
for
(
i
<-
0
until
exuParameters
.
StuCnt
)
{
storeIndexGen
.
io
.
priority
(
i
)
:=
storePriority
(
i
)
}
val
allIndexGen
=
Seq
(
loadIndexGen
,
storeIndexGen
)
val
validVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
valid
)).
reduceLeft
(
_
++
_
)
val
indexVec
=
allIndexGen
.
map
(
_
.
io
.
mapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
val
rsValidVec
=
allIndexGen
.
map
(
_
.
io
.
reverseMapping
.
map
(
_
.
valid
)).
reduceLeft
(
_
++
_
)
val
rsIndexVec
=
allIndexGen
.
map
(
_
.
io
.
reverseMapping
.
map
(
_
.
bits
)).
reduceLeft
(
_
++
_
)
/**
* Part 2: assign regfile read ports (actually only reg states from rename)
*
* The four load/store issue queue
*/
assert
(
exuParameters
.
LduCnt
==
2
)
assert
(
exuParameters
.
StuCnt
==
2
)
val
readPort
=
Seq
(
0
,
1
,
2
,
4
)
for
(
i
<-
0
until
exuParameters
.
LsExuCnt
)
{
if
(
i
<
exuParameters
.
LduCnt
)
{
io
.
intRegAddr
(
readPort
(
i
))
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
.
psrc1
}
else
{
io
.
intRegAddr
(
readPort
(
i
))
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
.
psrc1
io
.
intRegAddr
(
readPort
(
i
)
+
1
)
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
.
psrc2
}
}
/**
* Part 3: dispatch to reservation stations
*/
for
(
i
<-
0
until
exuParameters
.
LsExuCnt
)
{
val
enq
=
io
.
enqIQCtrl
(
i
)
enq
.
valid
:=
validVec
(
i
)
enq
.
bits
:=
io
.
fromDq
(
indexVec
(
i
)).
bits
enq
.
bits
.
src1State
:=
io
.
intRegRdy
(
readPort
(
i
))
enq
.
bits
.
src2State
:=
io
.
intRegRdy
(
readPort
(
i
)
+
1
)
XSInfo
(
enq
.
fire
(),
p
"pc 0x${Hexadecimal(enq.bits.cf.pc)} with type ${enq.bits.ctrl.fuType}"
+
p
"srcState(${enq.bits.src1State} ${enq.bits.src2State})"
+
p
"enters reservation station $i from ${indexVec(i)}\n"
)
}
/**
* Part 4: response to dispatch queue
*/
for
(
i
<-
0
until
dpParams
.
LsDqDeqWidth
)
{
io
.
fromDq
(
i
).
ready
:=
rsValidVec
(
i
)
&&
io
.
enqIQCtrl
(
rsIndexVec
(
i
)).
ready
XSInfo
(
io
.
fromDq
(
i
).
fire
(),
p
"pc 0x${Hexadecimal(io.fromDq(i).bits.cf.pc)} leaves Int dispatch queue $i with nroq ${io.fromDq(i).bits.roqIdx}\n"
)
XSDebug
(
io
.
fromDq
(
i
).
valid
&&
!
io
.
fromDq
(
i
).
ready
,
p
"pc 0x${Hexadecimal(io.fromDq(i).bits.cf.pc)} waits at Int dispatch queue with index %d\n"
)
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录