首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Chisel:在最终Verilog中获取信号名称

Chisel:在最终Verilog中获取信号名称
EN

Stack Overflow用户
提问于 2020-10-14 17:01:49
回答 1查看 175关注 0票数 1

我想尽可能多地直接从Chisel代码中自动实例化ILA。这意味着实例化一个如下所示的模块:

代码语言:javascript
运行
复制
i_ila my_ila(
.clk(clock),
.probe0(a_signal_to_monitor),
.probe1(another_signal_to_monitor),
// and so on
);

我计划将我想要监控的信号存储在一个UInt列表中,以便在模块细化结束时可以生成上面的实例化代码,然后将其复制/粘贴到最终的Verilog代码中(或者编写一个自动执行该操作的Python脚本)。

首先,有没有更好的方法来做到这一点,也许是在FIRRTL级别?

即使我采用这种半手动的方法,我也需要知道最终Verilog中信号的名称,这不一定是代码中UInt函数的名称(此外,我不知道如何在不重新键入变量名称的情况下自动获取它)。我怎样才能得到它们呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-15 02:05:25

我想提供一个更完整的例子,但我想确保至少写一些东西。这也需要在网站上作为适当的示例/教程来充实。

FIRRTL具有强大的支持跨内置和自定义转换跟踪信号的名称。这是一个基础设施都在那里的情况,但它在很大程度上是一个超级用户API。简而言之,您可以创建跟踪Targets的FIRRTL Annotations。然后,您可以发出定制的元数据文件或使用普通的FIRRTL注释文件(尝试使用CLI选项-foaf / --output-annotation-file)。

一个示例FIRRTL Annotation,它将在编译结束时发出一个自定义的元数据文件:

代码语言:javascript
运行
复制
// Example FIRRTL annotation with Custom serialization
// FIRRTL will track the name of this signal through compilation
case class MyMetadataAnno(target: ReferenceTarget)
    extends SingleTargetAnnotation[ReferenceTarget]
    with CustomFileEmission {
  def duplicate(n: ReferenceTarget) = this.copy(n)

  // API for serializing a custom metadata file
  // Note that multiple of this annotation will collide which is an error, not handled in this example
  protected def baseFileName(annotations: AnnotationSeq): String = "my_metadata"
  protected def suffix: Option[String] = Some(".txt")
  def getBytes: Iterable[Byte] =
    s"Annotated signal: ${target.serialize}".getBytes
}

case class声明和duplicate方法足以通过编译跟踪单个信号。CustomFileEmission和相关的baseFileNamesuffixgetBytes方法定义了如何序列化我的自定义元数据文件。正如注释中所提到的,正如在本例中实现的那样,我们只能有一个此MyMetadataAnno的实例,否则他们将尝试写入相同的文件,这是一个错误。这可以通过基于Target自定义文件名,或者编写一个FIRRTL转换来将多个注释聚合到一个注释中来处理。

然后,我们需要一种在Chisel中创建此注释的方法:

代码语言:javascript
运行
复制
  def markSignal[T <: Data](x: T): T = {
    annotate(new ChiselAnnotation {
      // We can't call .toTarget until end of Chisel elaboration
      // .toFirrtl is called by Chisel at the end of elaboration
      def toFirrtl = MyMetadataAnno(x.toTarget)
    })
    x
  }

现在我们需要做的就是在Chisel中使用这个简单的API

代码语言:javascript
运行
复制
// Simple example with a marked signal
class Foo extends MultiIOModule {
  val in = IO(Flipped(Decoupled(UInt(8.W))))
  val out = IO(Decoupled(UInt(8.W)))

  markSignal(out.valid)

  out <> in
}

这将导致将文件my_metadata.txt写入包含以下内容的目标目录:

代码语言:javascript
运行
复制
Annotated signal: ~Foo|Foo>out_valid

请注意,这是特殊的FIRRTL目标语法,说明out_valid是存在于模块Foo中的带注释的信号。

可执行文件示例中的完整代码:https://scastie.scala-lang.org/moEiIqZPTRCR5mLQNrV3zA

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64349930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档