Chisel 访问regmap RegFields

Chisel 访问regmap RegFields,chisel,rocket-chip,Chisel,Rocket Chip,我试图找到一种干净的方法来访问regmap,它与*RegisterNode一起使用,用于创建文档和测试文件。TLRegisterNode具有通过一些注释生成json的方法。这些都是在regmap方法中完成的,方法是将它们添加到对象中。其他协议似乎没有这些注释 在精化后或精化过程中,是否仍要迭代“regmap”寄存器字段? 我不能只访问regmap,因为它实际上不是val/var,因为它是一个方法。我不太清楚这些信息存储在哪里。我真的不相信它实际上在“存储”任何信息,而只是创建硬件将指定的逻辑附加

我试图找到一种干净的方法来访问
regmap
,它与
*RegisterNode一起使用,用于创建文档和测试文件。
TLRegisterNode
具有通过一些
注释生成json的方法。这些都是在
regmap
方法中完成的,方法是将它们添加到
对象中。其他协议似乎没有这些注释

在精化后或精化过程中,是否仍要迭代“
regmap
”寄存器字段?

我不能只访问regmap,因为它实际上不是val/var,因为它是一个方法。我不太清楚这些信息存储在哪里。我真的不相信它实际上在“存储”任何信息,而只是创建硬件将指定的逻辑附加到基于RegisterNode的逻辑

JSON输出实际上对我来说很好,因为我可以编写一个后处理脚本来将JSON转换为我所需的格式,但我想知道是否可以访问这些信息,或者是否可以在最后添加一个自定义函数调用。我无法扩展
case class*RegisterNode
,但我不确定是否可以添加自定义函数以在
regmap
方法末尾运行

下面是我快速拼凑的一些东西:

//在*registerOuter.scala中
def customregmap(customFunc:(RegField.Map*)=>单位,映射:RegField.Map*)={
regmap(映射:*)
customFunc(映射:*)
}
def regmap(映射:RegField.Map*)={
//普通的东西
}
然后,用户可以创建一个自定义函数来运行并将其传递给regmap或registerOuter

def myFunc(映射:RegField.Map*):单位={
println(“我正在为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的文档


外交实际上解决了我一直在处理的一个主要问题,所以我显然在努力推动我的大多数新设计去凿/挖。

我最终解决了这个问题,创建了我自己的
注册节点
,它与rocketchip注册节点相同,只是我使用了不同的精化工件来获取信息和数据把它储存起来,待会儿用