2

我正在尝试找到一种干净的方法来访问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。

4

1 回答 1

0

我最终通过创建自己的方法解决了这个问题,RegisterNode它与火箭芯片 RegisterNodes 相同,只是我使用不同的精化工件来获取信息并将其存储以备后用。

于 2021-05-20T18:35:51.923 回答