Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
0851457f
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 搜索 >>
提交
0851457f
编写于
6月 27, 2020
作者:
L
LinJiawei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename: map arch reg to phy reg 0-31 initially
上级
ff899225
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
45 addition
and
12 deletion
+45
-12
src/main/scala/xiangshan/Bundle.scala
src/main/scala/xiangshan/Bundle.scala
+3
-2
src/main/scala/xiangshan/backend/issue/IssueQueue.scala
src/main/scala/xiangshan/backend/issue/IssueQueue.scala
+2
-1
src/main/scala/xiangshan/backend/rename/FreeList.scala
src/main/scala/xiangshan/backend/rename/FreeList.scala
+40
-9
未找到文件。
src/main/scala/xiangshan/Bundle.scala
浏览文件 @
0851457f
...
...
@@ -3,6 +3,7 @@ package xiangshan
import
chisel3._
import
chisel3.util._
import
bus.simplebus._
import
xiangshan.backend.rename.FreeListPtr
// Fetch FetchWidth x 32-bit insts from Icache
class
FetchPacket
extends
XSBundle
{
...
...
@@ -49,7 +50,7 @@ class MicroOp extends CfCtrl {
val
psrc1
,
psrc2
,
psrc3
,
pdest
,
old_pdest
=
UInt
(
PhyRegIdxWidth
.
W
)
val
src1State
,
src2State
,
src3State
=
SrcState
()
val
freelistAllocPtr
=
UInt
(
PhyRegIdxWidth
.
W
)
val
freelistAllocPtr
=
new
FreeListPtr
val
roqIdx
=
UInt
(
RoqIdxWidth
.
W
)
}
...
...
@@ -58,7 +59,7 @@ class Redirect extends XSBundle {
val
brTag
=
UInt
(
BrTagWidth
.
W
)
val
isException
=
Bool
()
val
roqIdx
=
UInt
(
ExtendedRoqIdxWidth
.
W
)
val
freelistAllocPtr
=
UInt
((
PhyRegIdxWidth
+
1
).
W
)
val
freelistAllocPtr
=
new
FreeListPtr
}
class
Dp1ToDp2IO
extends
XSBundle
{
...
...
src/main/scala/xiangshan/backend/issue/IssueQueue.scala
浏览文件 @
0851457f
...
...
@@ -3,6 +3,7 @@ package xiangshan.backend.issue
import
chisel3._
import
chisel3.util._
import
xiangshan._
import
xiangshan.backend.rename.FreeListPtr
import
xiangshan.utils._
trait
IQConst
{
...
...
@@ -119,7 +120,7 @@ class IssueQueue(val fuTypeInt: BigInt, val wakeupCnt: Int, val bypassCnt: Int =
val
prfSrc3
=
Reg
(
Vec
(
iqSize
,
UInt
(
PhyRegIdxWidth
.
W
)))
val
prfDest
=
Reg
(
Vec
(
iqSize
,
UInt
(
PhyRegIdxWidth
.
W
)))
val
oldPDest
=
Reg
(
Vec
(
iqSize
,
UInt
(
PhyRegIdxWidth
.
W
)))
val
freelistAllocPtr
=
Reg
(
Vec
(
iqSize
,
UInt
(
PhyRegIdxWidth
.
W
)
))
val
freelistAllocPtr
=
Reg
(
Vec
(
iqSize
,
new
FreeListPtr
))
val
roqIdx
=
Reg
(
Vec
(
iqSize
,
UInt
(
RoqIdxWidth
.
W
)))
val
instRdy
=
WireInit
(
VecInit
(
List
.
tabulate
(
iqSize
)(
i
=>
src1Rdy
(
i
)
&&
src2Rdy
(
i
)
&&
src3Rdy
(
i
)&&
valid
(
i
))))
...
...
src/main/scala/xiangshan/backend/rename/FreeList.scala
浏览文件 @
0851457f
...
...
@@ -4,14 +4,45 @@ import chisel3._
import
chisel3.util._
import
xiangshan._
class
FreeList
extends
XSModule
{
trait
HasFreeListConsts
extends
HasXSParameter
{
def
FL_SIZE
:
Int
=
NRPhyRegs
-
32
def
PTR_WIDTH
=
log2Up
(
FL_SIZE
)
}
class
FreeListPtr
extends
Bundle
with
HasFreeListConsts
{
val
flag
=
Bool
()
val
value
=
UInt
(
PTR_WIDTH
.
W
)
final
def
+
(
inc
:
Bool
)
:
FreeListPtr
=
{
Mux
(
inc
&&
(
value
===
(
FL_SIZE
-
1
).
U
),
FreeListPtr
(!
flag
,
0.
U
),
FreeListPtr
(
flag
,
value
+
inc
)
)
}
final
def
===
(
that
:
FreeListPtr
)
:
Bool
=
{
(
this
.
value
===
that
.
value
)
&&
(
this
.
flag
===
that
.
flag
)
}
}
object
FreeListPtr
{
def
apply
(
f
:
Bool
,
v
:
UInt
)
:
FreeListPtr
=
{
val
ptr
=
Wire
(
new
FreeListPtr
)
ptr
.
flag
:=
f
ptr
.
value
:=
v
ptr
}
}
class
FreeList
extends
XSModule
with
HasFreeListConsts
{
val
io
=
IO
(
new
Bundle
()
{
val
redirect
=
Flipped
(
ValidIO
(
new
Redirect
))
// alloc new phy regs
val
allocReqs
=
Input
(
Vec
(
RenameWidth
,
Bool
()))
val
pdests
=
Output
(
Vec
(
RenameWidth
,
UInt
(
PhyRegIdxWidth
.
W
)))
val
allocPtrs
=
Output
(
Vec
(
RenameWidth
,
UInt
(
PhyRegIdxWidth
.
W
)
))
val
allocPtrs
=
Output
(
Vec
(
RenameWidth
,
new
FreeListPtr
))
val
canAlloc
=
Output
(
Vec
(
RenameWidth
,
Bool
()))
// dealloc phy regs
...
...
@@ -19,18 +50,18 @@ class FreeList extends XSModule {
val
deallocPregs
=
Input
(
Vec
(
CommitWidth
,
UInt
(
PhyRegIdxWidth
.
W
)))
})
val
freeList
=
RegInit
(
VecInit
(
Seq
.
tabulate
(
NRPhyRegs
-
1
)(
i
=>
(
i
+
1
).
U
(
PhyRegIdxWidth
.
W
))))
val
headPtr
=
RegInit
(
0.
U
((
PhyRegIdxWidth
+
1
).
W
))
val
tailPtr
=
RegInit
((
1
<<
PhyRegIdxWidth
).
U
((
PhyRegIdxWidth
+
1
).
W
))
// init: [32, 127]
val
freeList
=
RegInit
(
VecInit
(
Seq
.
tabulate
(
FL_SIZE
)(
i
=>
(
i
+
32
).
U
(
PhyRegIdxWidth
.
W
))))
val
headPtr
=
RegInit
(
FreeListPtr
(
false
.
B
,
0.
U
))
val
tailPtr
=
RegInit
(
FreeListPtr
(
true
.
B
,
0.
U
))
def
ptrToIndex
(
ptr
:
UInt
)
:
UInt
=
ptr
.
tail
(
1
)
def
isEmpty
(
ptr1
:
UInt
,
ptr2
:
UInt
)
:
Bool
=
ptr1
===
ptr2
def
isEmpty
(
ptr1
:
FreeListPtr
,
ptr2
:
FreeListPtr
)
:
Bool
=
ptr1
===
ptr2
// dealloc: commited instructions's 'old_pdest' enqueue
var
tailPtrNext
=
WireInit
(
tailPtr
)
for
((
deallocValid
,
deallocReg
)
<-
io
.
deallocReqs
.
zip
(
io
.
deallocPregs
)){
when
(
deallocValid
){
freeList
(
ptrToIndex
(
tailPtrNext
)
)
:=
deallocReg
freeList
(
tailPtrNext
.
value
)
:=
deallocReg
}
tailPtrNext
=
tailPtrNext
+
deallocValid
}
...
...
@@ -43,7 +74,7 @@ class FreeList extends XSModule {
(((
allocReq
,
canAlloc
),
pdest
),
allocPtr
)
<-
io
.
allocReqs
.
zip
(
io
.
canAlloc
).
zip
(
io
.
pdests
).
zip
(
io
.
allocPtrs
)
){
canAlloc
:=
!
empty
pdest
:=
freeList
(
ptrToIndex
(
headPtrNext
)
)
pdest
:=
freeList
(
headPtrNext
.
value
)
allocPtr
:=
headPtrNext
headPtrNext
=
headPtrNext
+
(
allocReq
&&
canAlloc
)
empty
=
isEmpty
(
headPtrNext
,
tailPtr
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录