Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
b5b78226
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
9 个月 前同步成功
通知
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 搜索 >>
提交
b5b78226
编写于
1月 29, 2021
作者:
W
William Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
LoadQueueData: wrap data in LQData8Module
上级
c2a48752
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
79 addition
and
26 deletion
+79
-26
src/main/scala/xiangshan/mem/lsqueue/LSQWrapper.scala
src/main/scala/xiangshan/mem/lsqueue/LSQWrapper.scala
+2
-2
src/main/scala/xiangshan/mem/lsqueue/LoadQueueData.scala
src/main/scala/xiangshan/mem/lsqueue/LoadQueueData.scala
+4
-4
src/main/scala/xiangshan/mem/lsqueue/StoreQueueData.scala
src/main/scala/xiangshan/mem/lsqueue/StoreQueueData.scala
+73
-20
未找到文件。
src/main/scala/xiangshan/mem/lsqueue/LSQWrapper.scala
浏览文件 @
b5b78226
...
...
@@ -17,8 +17,8 @@ class ExceptionAddrIO extends XSBundle {
}
class
FwdEntry
extends
XSBundle
{
val
mask
=
Vec
(
8
,
Bool
()
)
val
data
=
Vec
(
8
,
UInt
(
8.
W
)
)
val
valid
=
Bool
(
)
val
data
=
UInt
(
8.
W
)
}
// inflight miss block reqs
...
...
src/main/scala/xiangshan/mem/lsqueue/LoadQueueData.scala
浏览文件 @
b5b78226
...
...
@@ -20,7 +20,7 @@ class LQDataEntry extends XSBundle {
// Data module define
// These data modules are like SyncDataModuleTemplate, but support cam-like ops
class
PaddrModule
(
numEntries
:
Int
,
numRead
:
Int
,
numWrite
:
Int
)
extends
XSModule
with
HasDCacheParameters
{
class
LQ
PaddrModule
(
numEntries
:
Int
,
numRead
:
Int
,
numWrite
:
Int
)
extends
XSModule
with
HasDCacheParameters
{
val
io
=
IO
(
new
Bundle
{
val
raddr
=
Input
(
Vec
(
numRead
,
UInt
(
log2Up
(
numEntries
).
W
)))
val
rdata
=
Output
(
Vec
(
numRead
,
UInt
((
PAddrBits
).
W
)))
...
...
@@ -106,7 +106,7 @@ class MaskModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule
}
}
class
Data8Module
(
numEntries
:
Int
,
numRead
:
Int
,
numWrite
:
Int
)
extends
XSModule
with
HasDCacheParameters
{
class
LQ
Data8Module
(
numEntries
:
Int
,
numRead
:
Int
,
numWrite
:
Int
)
extends
XSModule
with
HasDCacheParameters
{
val
io
=
IO
(
new
Bundle
{
// read
val
raddr
=
Input
(
Vec
(
numRead
,
UInt
(
log2Up
(
numEntries
).
W
)))
...
...
@@ -177,7 +177,7 @@ class CoredataModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSMod
val
paddrWen
=
Input
(
Vec
(
numWrite
,
Bool
()))
})
val
data8
=
Seq
.
fill
(
8
)(
Module
(
new
Data8Module
(
numEntries
,
numRead
,
numWrite
)))
val
data8
=
Seq
.
fill
(
8
)(
Module
(
new
LQ
Data8Module
(
numEntries
,
numRead
,
numWrite
)))
val
fwdMask
=
Reg
(
Vec
(
numEntries
,
UInt
(
8.
W
)))
val
wordIndex
=
Reg
(
Vec
(
numEntries
,
UInt
((
blockOffBits
-
wordOffBits
).
W
)))
...
...
@@ -287,7 +287,7 @@ class LoadQueueData(size: Int, wbNumRead: Int, wbNumWrite: Int) extends XSModule
// val data = Reg(Vec(size, new LQDataEntry))
// data module
val
paddrModule
=
Module
(
new
PaddrModule
(
size
,
numRead
=
3
,
numWrite
=
2
))
val
paddrModule
=
Module
(
new
LQ
PaddrModule
(
size
,
numRead
=
3
,
numWrite
=
2
))
val
maskModule
=
Module
(
new
MaskModule
(
size
,
numRead
=
3
,
numWrite
=
2
))
val
coredataModule
=
Module
(
new
CoredataModule
(
size
,
numRead
=
3
,
numWrite
=
3
))
...
...
src/main/scala/xiangshan/mem/lsqueue/StoreQueueData.scala
浏览文件 @
b5b78226
...
...
@@ -53,29 +53,28 @@ class SQPaddrModule(numEntries: Int, numRead: Int, numWrite: Int, numForward: In
}
}
class
SQDataEntry
extends
XSBundle
{
class
SQData
8
Entry
extends
XSBundle
{
// val paddr = UInt(PAddrBits.W)
val
mask
=
UInt
(
8.
W
)
val
data
=
UInt
(
XLEN
.
W
)
val
valid
=
Bool
(
)
val
data
=
UInt
(
(
XLEN
/
8
)
.
W
)
}
class
S
toreQueueData
(
size
:
Int
,
numRead
:
Int
,
numWrite
:
Int
,
numForward
:
Int
)
extends
XSModule
with
HasDCacheParameters
with
HasCircularQueuePtrHelper
{
class
S
QData8Module
(
size
:
Int
,
numRead
:
Int
,
numWrite
:
Int
,
numForward
:
Int
)
extends
XSModule
with
HasDCacheParameters
with
HasCircularQueuePtrHelper
{
val
io
=
IO
(
new
Bundle
()
{
val
raddr
=
Vec
(
numRead
,
Input
(
UInt
(
log2Up
(
size
).
W
)))
val
rdata
=
Vec
(
numRead
,
Output
(
new
SQDataEntry
))
val
rdata
=
Vec
(
numRead
,
Output
(
new
SQData
8
Entry
))
val
wen
=
Vec
(
numWrite
,
Input
(
Bool
()))
val
waddr
=
Vec
(
numWrite
,
Input
(
UInt
(
log2Up
(
size
).
W
)))
val
wdata
=
Vec
(
numWrite
,
Input
(
new
SQDataEntry
))
val
debug
=
Vec
(
size
,
Output
(
new
SQDataEntry
))
val
wdata
=
Vec
(
numWrite
,
Input
(
new
SQData8Entry
))
val
needForward
=
Input
(
Vec
(
numForward
,
Vec
(
2
,
UInt
(
size
.
W
))))
val
forward
Mask
=
Vec
(
numForward
,
Output
(
Vec
(
8
,
Bool
()
)))
val
forwardData
=
Vec
(
numForward
,
Output
(
Vec
(
8
,
UInt
(
8.
W
)
)))
val
forward
Valid
=
Vec
(
numForward
,
Output
(
Bool
(
)))
val
forwardData
=
Vec
(
numForward
,
Output
(
UInt
(
8.
W
)))
})
io
:=
DontCare
val
data
=
Reg
(
Vec
(
size
,
new
SQDataEntry
))
val
data
=
Reg
(
Vec
(
size
,
new
SQData
8
Entry
))
// writeback to lq/sq
(
0
until
numWrite
).
map
(
i
=>
{
...
...
@@ -115,10 +114,8 @@ class StoreQueueData(size: Int, numRead: Int, numWrite: Int, numForward: Int) ex
val
l
=
a
.
asTypeOf
(
new
FwdEntry
)
val
r
=
b
.
asTypeOf
(
new
FwdEntry
)
val
res
=
Wire
(
new
FwdEntry
)
(
0
until
8
).
map
(
p
=>
{
res
.
mask
(
p
)
:=
l
.
mask
(
p
)
||
r
.
mask
(
p
)
res
.
data
(
p
)
:=
Mux
(
r
.
mask
(
p
),
r
.
data
(
p
),
l
.
data
(
p
))
})
res
.
valid
:=
l
.
valid
||
r
.
valid
res
.
data
:=
Mux
(
r
.
valid
,
r
.
data
,
l
.
data
)
res
})
}
...
...
@@ -132,19 +129,75 @@ class StoreQueueData(size: Int, numRead: Int, numWrite: Int, numForward: Int) ex
val
needCheck0
=
RegNext
(
io
.
needForward
(
i
)(
0
)(
j
))
val
needCheck1
=
RegNext
(
io
.
needForward
(
i
)(
1
)(
j
))
(
0
until
XLEN
/
8
).
foreach
(
k
=>
{
matchResultVec
(
j
).
mask
(
k
)
:=
needCheck0
&&
data
(
j
).
mask
(
k
)
matchResultVec
(
j
).
data
(
k
)
:=
data
(
j
).
data
(
8
*
(
k
+
1
)
-
1
,
8
*
k
)
matchResultVec
(
size
+
j
).
mask
(
k
)
:=
needCheck1
&&
data
(
j
).
mask
(
k
)
matchResultVec
(
size
+
j
).
data
(
k
)
:=
data
(
j
).
data
(
8
*
(
k
+
1
)
-
1
,
8
*
k
)
matchResultVec
(
j
).
valid
:=
needCheck0
&&
data
(
j
).
valid
matchResultVec
(
j
).
data
:=
data
(
j
).
data
matchResultVec
(
size
+
j
).
valid
:=
needCheck1
&&
data
(
j
).
valid
matchResultVec
(
size
+
j
).
data
:=
data
(
j
).
data
})
}
val
parallelFwdResult
=
parallelFwd
(
matchResultVec
).
asTypeOf
(
new
FwdEntry
)
io
.
forward
Mask
(
i
)
:=
parallelFwdResult
.
mask
io
.
forward
Valid
(
i
)
:=
parallelFwdResult
.
valid
io
.
forwardData
(
i
)
:=
parallelFwdResult
.
data
})
}
class
SQDataEntry
extends
XSBundle
{
// val paddr = UInt(PAddrBits.W)
val
mask
=
UInt
(
8.
W
)
val
data
=
UInt
(
XLEN
.
W
)
}
class
StoreQueueData
(
size
:
Int
,
numRead
:
Int
,
numWrite
:
Int
,
numForward
:
Int
)
extends
XSModule
with
HasDCacheParameters
with
HasCircularQueuePtrHelper
{
val
io
=
IO
(
new
Bundle
()
{
val
raddr
=
Vec
(
numRead
,
Input
(
UInt
(
log2Up
(
size
).
W
)))
val
rdata
=
Vec
(
numRead
,
Output
(
new
SQDataEntry
))
val
wen
=
Vec
(
numWrite
,
Input
(
Bool
()))
val
waddr
=
Vec
(
numWrite
,
Input
(
UInt
(
log2Up
(
size
).
W
)))
val
wdata
=
Vec
(
numWrite
,
Input
(
new
SQDataEntry
))
val
needForward
=
Input
(
Vec
(
numForward
,
Vec
(
2
,
UInt
(
size
.
W
))))
val
forwardMask
=
Vec
(
numForward
,
Output
(
Vec
(
8
,
Bool
())))
val
forwardData
=
Vec
(
numForward
,
Output
(
Vec
(
8
,
UInt
(
8.
W
))))
})
val
data8
=
Seq
.
fill
(
8
)(
Module
(
new
SQData8Module
(
size
,
numRead
,
numWrite
,
numForward
)))
io
.
debug
:=
data
// writeback to lq/sq
for
(
i
<-
0
until
numWrite
)
{
// write to data8
for
(
j
<-
0
until
8
)
{
data8
(
j
).
io
.
waddr
(
i
)
:=
io
.
waddr
(
i
)
data8
(
j
).
io
.
wdata
(
i
).
valid
:=
io
.
wdata
(
i
).
mask
(
j
)
data8
(
j
).
io
.
wdata
(
i
).
data
:=
io
.
wdata
(
i
).
data
(
8
*(
j
+
1
)-
1
,
8
*
j
)
data8
(
j
).
io
.
wen
(
i
)
:=
io
.
wen
(
i
)
}
}
// destorequeue read data
for
(
i
<-
0
until
numRead
)
{
for
(
j
<-
0
until
8
)
{
data8
(
j
).
io
.
raddr
(
i
)
:=
io
.
raddr
(
i
)
}
io
.
rdata
(
i
).
mask
:=
VecInit
((
0
until
8
).
map
(
j
=>
data8
(
j
).
io
.
rdata
(
i
).
valid
)).
asUInt
io
.
rdata
(
i
).
data
:=
VecInit
((
0
until
8
).
map
(
j
=>
data8
(
j
).
io
.
rdata
(
i
).
data
)).
asUInt
}
// DataModuleTemplate should not be used when there're any write conflicts
for
(
i
<-
0
until
numWrite
)
{
for
(
j
<-
i
+
1
until
numWrite
)
{
assert
(!(
io
.
wen
(
i
)
&&
io
.
wen
(
j
)
&&
io
.
waddr
(
i
)
===
io
.
waddr
(
j
)))
}
}
(
0
until
numForward
).
map
(
i
=>
{
// parallel fwd logic
for
(
j
<-
0
until
8
)
{
data8
(
j
).
io
.
needForward
(
i
)
<>
io
.
needForward
(
i
)
io
.
forwardMask
(
i
)
:=
VecInit
((
0
until
8
).
map
(
j
=>
data8
(
j
).
io
.
forwardValid
(
i
)))
io
.
forwardData
(
i
)
:=
VecInit
((
0
until
8
).
map
(
j
=>
data8
(
j
).
io
.
forwardData
(
i
)))
}
})
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录