我正在尝试找到一种干净的方法来访问regmap
用于*RegisterNode
创建文档和测试文件的方法。TLRegisterNode
具有通过 some 生成 json的方法Annotations
。这些是在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
,类似于TLRegisterNode
当前的工作方式。因此,用户可以添加任意号码,而您仍然可以使用该regmap
呼叫。
背景(不是问题的直接部分):
我有一个多年来构建的统一注册脚本,用于描述特定 IP 的注册。它的工作方式与 RegField/node.regmap 非常相似,只是它显然不了解外交等。它将生成 Verilog,以及用于 DV 的各种文件(用于简单 Verilog 模拟的基本定义和更复杂uvm_reg_block
的定义,还具有描述子系统直至 SoC 级别的多个 IP 的能力)。它还将为 SW 和 Sphinx reStructuredText 打印出 C 头文件以用于文档。
外交实际上解决了我一直在处理的主要问题之一,所以我显然试图将我的大部分新设计推向 Chisel/Diplo。