【发布时间】:2020-09-25 15:08:16
【问题描述】:
我正在尝试找到一种干净的方法来访问与*RegisterNode 一起使用的regmap,以创建文档和测试文件。 TLRegisterNode 具有通过一些 Annotations 生成 json 的方法。这些是在regmap 方法中通过将它们添加到ElaborationArtefacts 对象来完成的。其他协议似乎没有这些注释。
是否有在详细说明后或期间迭代“regmap”注册字段?
我不能只访问 regmap,因为它不是真正的 val/var,因为它是一种方法。我不太清楚这些信息存储在哪里。我真的不相信它实际上是在“存储”任何信息,因为它只是创建硬件以将指定的逻辑附加到基于 RegisterNode 的逻辑。
JSON 输出实际上对我来说很好,因为我可以编写一个后处理脚本来将 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 方法的末尾运行,类似于@ 987654335@ 目前有效。因此,用户可以添加任意数字,而您仍然使用 regmap 调用。
背景(不是问题的直接部分):
我有一个多年来构建的统一注册脚本,用于描述特定 IP 的注册。它的工作方式与 RegField/node.regmap 非常相似,只是它显然不了解外交等。它将生成 Verilog,以及用于 DV 的各种文件(基本`定义用于简单的 verilog 模拟和更复杂的 uvm_reg_block 定义还具有描述子系统的多个 IP 的能力,一直到 SoC 级别)。它还将为 SW 和 Sphinx reStructuredText 打印出 C 头文件以用于文档。
外交实际上解决了我一直在处理的主要问题之一,所以我显然试图将我的大部分新设计推向 Chisel/Diplo。
【问题讨论】:
标签: chisel rocket-chip