访问regmap RegFields

问题描述

我正在尝试寻找一种干净的方法来访问与regmap一起使用的*RegisterNode,以创建文档和测试文件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方法,类似于TLRegisterNode当前的工作方式。因此,用户可以添加任意数字,而您仍然可以使用regmap调用

背景知识(不是问题的直接组成部分):

多年来,我已经建立了一个统一的注册脚本,在该脚本中我描述了特定IP的寄存器。它的工作原理与RegField / node.regmap非常相似,除了它显然不了解外交等方面。它将生成Verilog,但也将生成用于DV的各种文件(基本的“定义简单的Verilog模拟和更复杂的uvm_reg_block定义)还具有描述子系统的多个IP的能力,一直到SoC级)。它还将打印出SW和Sphinx reStructuredText的C头文件,以备文档使用。

外交实际上解决了我一直在处理的主要问题之一,因此我显然正在设法将我的大多数较新的设计推向Chisel / Diplo。

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...