访问 regmap RegFields
Accessing regmap RegFields
我正在尝试找到一种干净的方式来访问与 *RegisterNode
一起用于创建文档和测试文件的 regmap
。 TLRegisterNode
有通过一些 Annotations
生成 json 的方法。这些是在 regmap
方法中通过将它们添加到 ElaborationArtefacts
对象来完成的。其他协议好像没有这些注解。
是否有迭代“regmap
”寄存器字段 post 详细说明或期间?
我不能只访问 regmap,因为它不是真正的 val/var,因为它是一种方法。我不太清楚这些信息存储在哪里。我真的不相信它实际上是在“存储”任何信息,因为它只是在创建硬件以将指定的逻辑附加到基于 RegisterNode 的逻辑上。
JSON 输出实际上对我来说很好,因为我可以编写一个 post 处理脚本来将 JSON 转换为我需要的格式,但我想知道我是否可以访问此信息或者如果我可以在末尾添加自定义函数调用。我无法扩展 case class *RegisterNode
,但我不确定是否可以在 regmap
方法的末尾将自定义函数添加到 运行。
这是我快速拼凑的东西:
//in *RegisterRouter.scala
def customregmap(customFunc: (RegField.Map*) => Unit, mapping: RegField.Map*) = {
regmap(mapping:_*)
customFunc(mapping:_*)
}
def regmap(mapping: RegField.Map*) = {
//normal stuff
}
然后用户可以创建自定义函数 运行 并将其传递给 regmap 或 RegisterRouter
def myFunc(mapping: RegField.Map*): Unit = {
println("I'm doing my custom function for regmap!")
}
// ...
node.customregmap(myFunc,
0x0 -> coreControlRegFields,
0x4 -> fdControlRegFields,
0x8 -> fdControl2RegFields,
)
这只是我的一个简单示例。我相信更好的是,如果这样的事情是可能的,那么有一个 Seq
的函数可以添加到 RegisterNode
中 运行 在 regmap
方法,类似于 TLRegisterNode
目前的工作方式。因此,用户可以添加任意数字,而您仍然使用 regmap
调用。
背景(不是问题的直接部分):
我有一个多年来构建的统一注册脚本,我在其中描述了特定 IP 的注册。它的工作原理与 RegField/node.regmap 非常相似,除了它显然不知道外交等。它将生成 Verilog,但也为 DV 生成各种文件(基本的`定义用于简单的 Verilog 模拟和更复杂的 uvm_reg_block
定义还能够描述一个子系统的多个 IP,一直到一个SoC 级别)。它还将打印出 SW 的 C 头文件和 Sphinx reStructuredText 用于文档。
外交实际上解决了我一直在处理的主要问题之一,所以我显然试图将我的大部分新设计推向 Chisel/Diplo。
我最终通过创建自己的 RegisterNode
解决了这个问题,它与 rocketchip RegisterNodes 相同,除了我使用不同的 Elaboration Artifact 来获取信息并将其存储以备后用。
我正在尝试找到一种干净的方式来访问与 *RegisterNode
一起用于创建文档和测试文件的 regmap
。 TLRegisterNode
有通过一些 Annotations
生成 json 的方法。这些是在 regmap
方法中通过将它们添加到 ElaborationArtefacts
对象来完成的。其他协议好像没有这些注解。
是否有迭代“regmap
”寄存器字段 post 详细说明或期间?
我不能只访问 regmap,因为它不是真正的 val/var,因为它是一种方法。我不太清楚这些信息存储在哪里。我真的不相信它实际上是在“存储”任何信息,因为它只是在创建硬件以将指定的逻辑附加到基于 RegisterNode 的逻辑上。
JSON 输出实际上对我来说很好,因为我可以编写一个 post 处理脚本来将 JSON 转换为我需要的格式,但我想知道我是否可以访问此信息或者如果我可以在末尾添加自定义函数调用。我无法扩展 case class *RegisterNode
,但我不确定是否可以在 regmap
方法的末尾将自定义函数添加到 运行。
这是我快速拼凑的东西:
//in *RegisterRouter.scala
def customregmap(customFunc: (RegField.Map*) => Unit, mapping: RegField.Map*) = {
regmap(mapping:_*)
customFunc(mapping:_*)
}
def regmap(mapping: RegField.Map*) = {
//normal stuff
}
然后用户可以创建自定义函数 运行 并将其传递给 regmap 或 RegisterRouter
def myFunc(mapping: RegField.Map*): Unit = {
println("I'm doing my custom function for regmap!")
}
// ...
node.customregmap(myFunc,
0x0 -> coreControlRegFields,
0x4 -> fdControlRegFields,
0x8 -> fdControl2RegFields,
)
这只是我的一个简单示例。我相信更好的是,如果这样的事情是可能的,那么有一个 Seq
的函数可以添加到 RegisterNode
中 运行 在 regmap
方法,类似于 TLRegisterNode
目前的工作方式。因此,用户可以添加任意数字,而您仍然使用 regmap
调用。
背景(不是问题的直接部分):
我有一个多年来构建的统一注册脚本,我在其中描述了特定 IP 的注册。它的工作原理与 RegField/node.regmap 非常相似,除了它显然不知道外交等。它将生成 Verilog,但也为 DV 生成各种文件(基本的`定义用于简单的 Verilog 模拟和更复杂的 uvm_reg_block
定义还能够描述一个子系统的多个 IP,一直到一个SoC 级别)。它还将打印出 SW 的 C 头文件和 Sphinx reStructuredText 用于文档。
外交实际上解决了我一直在处理的主要问题之一,所以我显然试图将我的大部分新设计推向 Chisel/Diplo。
我最终通过创建自己的 RegisterNode
解决了这个问题,它与 rocketchip RegisterNodes 相同,除了我使用不同的 Elaboration Artifact 来获取信息并将其存储以备后用。