Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
XiangShan
提交
618fb109
X
XiangShan
项目概览
OpenXiangShan
/
XiangShan
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
618fb109
编写于
8月 14, 2020
作者:
L
linjiawei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Impl TLTimer
上级
29c0dd83
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
125 addition
and
0 deletion
+125
-0
src/main/scala/device/TLTimer.scala
src/main/scala/device/TLTimer.scala
+51
-0
src/main/scala/utils/DebugIdentityNode.scala
src/main/scala/utils/DebugIdentityNode.scala
+30
-0
src/test/scala/device/TLTimerTest.scala
src/test/scala/device/TLTimerTest.scala
+44
-0
未找到文件。
src/main/scala/device/TLTimer.scala
0 → 100644
浏览文件 @
618fb109
package
device
import
chisel3._
import
chisel3.util._
import
freechips.rocketchip.tilelink._
import
chipsalliance.rocketchip.config
import
chipsalliance.rocketchip.config._
import
chisel3.util.experimental.BoringUtils
import
freechips.rocketchip.diplomacy._
import
freechips.rocketchip.regmapper.
{
RegField
,
RegWriteFn
}
import
utils.
{
HoldUnless
,
MaskExpand
,
RegMap
}
class
TLTimer
(
address
:
Seq
[
AddressSet
],
sim
:
Boolean
)(
implicit
p
:
Parameters
)
extends
LazyModule
{
val
device
=
new
SimpleDevice
(
"clint"
,
Seq
(
"XiangShan"
,
"clint"
))
val
node
=
TLRegisterNode
(
address
,
device
,
beatBytes
=
8
)
lazy
val
module
=
new
LazyModuleImp
(
this
){
val
mtip
=
IO
(
Output
(
Bool
()))
val
mtime
=
RegInit
(
0.
U
(
64.
W
))
// unit: us
val
mtimecmp
=
RegInit
(
0.
U
(
64.
W
))
val
clk
=
(
if
(!
sim
)
40
/* 40MHz / 1000000 */
else
100
)
val
freq
=
RegInit
(
clk
.
U
(
16.
W
))
val
inc
=
RegInit
(
1000.
U
(
16.
W
))
val
cnt
=
RegInit
(
0.
U
(
16.
W
))
val
nextCnt
=
cnt
+
1.
U
cnt
:=
Mux
(
nextCnt
<
freq
,
nextCnt
,
0.
U
)
val
tick
=
(
nextCnt
===
freq
)
when
(
tick
)
{
mtime
:=
mtime
+
inc
}
if
(
sim
)
{
val
isWFI
=
WireInit
(
false
.
B
)
BoringUtils
.
addSink
(
isWFI
,
"isWFI"
)
when
(
isWFI
)
{
mtime
:=
mtime
+
100000.
U
}
}
node
.
regmap
(
mapping
=
0x4000
->
RegField
.
bytes
(
mtimecmp
),
0x8000
->
RegField
.
bytes
(
freq
),
0x8008
->
RegField
.
bytes
(
inc
),
0xbff8
->
RegField
.
bytes
(
mtime
)
)
printf
(
p
"[Timer] mtime=$mtime cnt=$cnt freq=$freq\n"
)
mtip
:=
RegNext
(
mtime
>=
mtimecmp
)
}
}
src/main/scala/utils/DebugIdentityNode.scala
0 → 100644
浏览文件 @
618fb109
package
utils
import
chisel3._
import
chipsalliance.rocketchip.config.Parameters
import
freechips.rocketchip.diplomacy.
{
LazyModule
,
LazyModuleImp
}
import
freechips.rocketchip.tilelink.
{
TLClientNode
,
TLIdentityNode
,
TLMasterParameters
,
TLMasterPortParameters
}
class
DebugIdentityNode
()(
implicit
p
:
Parameters
)
extends
LazyModule
{
val
node
=
TLIdentityNode
()
val
n
=
TLClientNode
(
Seq
(
TLMasterPortParameters
.
v1
(
Seq
(
TLMasterParameters
.
v1
(
"debug node"
)
)
)))
lazy
val
module
=
new
LazyModuleImp
(
this
){
val
(
out
,
_
)
=
node
.
out
(
0
)
val
(
in
,
_
)
=
node
.
in
(
0
)
when
(
in
.
a
.
fire
()){
printf
(
p
"[A] addr: ${Hexadecimal(in.a.bits.address)} "
+
p
"opcode: ${in.a.bits.opcode} data: ${Hexadecimal(in.a.bits.data)}\n"
)
}
when
(
in
.
d
.
fire
()){
printf
(
p
"[D] opcode: ${in.d.bits.opcode} data: ${Hexadecimal(in.d.bits.data)}\n"
)
}
}
}
src/test/scala/device/TLTimerTest.scala
0 → 100644
浏览文件 @
618fb109
package
device
import
chipsalliance.rocketchip.config._
import
chisel3._
import
chiseltest._
import
org.scalatest.
{
FlatSpec
,
Matchers
}
import
freechips.rocketchip.tilelink._
import
freechips.rocketchip.diplomacy._
import
utils.DebugIdentityNode
class
TLTimerTestTop
()(
implicit
p
:
Parameters
)
extends
LazyModule
{
val
addressSet
=
AddressSet
(
0x38000000
L
,
0x0000ffff
L
)
val
timer
=
LazyModule
(
new
TLTimer
(
Seq
(
addressSet
),
sim
=
true
))
val
ident
=
LazyModule
(
new
DebugIdentityNode
)
val
fuzz
=
LazyModule
(
new
TLFuzzer
(
nOperations
=
10
,
overrideAddress
=
Some
(
addressSet
)
))
timer
.
node
:=
ident
.
node
:=
TLDelayer
(
0.1
)
:=
fuzz
.
node
lazy
val
module
=
new
LazyModuleImp
(
this
){
val
io
=
IO
(
new
Bundle
()
{
val
finished
=
Output
(
Bool
())
})
io
.
finished
:=
fuzz
.
module
.
io
.
finished
}
}
class
TLTimerTest
extends
FlatSpec
with
ChiselScalatestTester
with
Matchers
{
it
should
"run"
in
{
implicit
val
p
=
Parameters
.
empty
test
(
LazyModule
(
new
TLTimerTestTop
()).
module
){
c
=>
while
(!
c
.
io
.
finished
.
peek
().
litToBoolean
){
c
.
clock
.
step
(
1
)
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录