在Chisel3中,如何在输出SystemVerilog文件中的内部信号中添加`mark_debug = "true"`属性?

问题描述 投票:0回答:1

如标题所述,我希望轻松地使设计中的任何内部信号可用于 Vivado 中的调试(主要是 ILA)。在版本 3.5.3 中,我可以使用片段来完成此操作,但是在更新的版本(例如 6.6.0)中,似乎整个 HDL 代码生成已被修改,现在我找不到方法来做到这一点。仅供参考,这是片段:

object markDebug {
  /** Mark a signal as debug to Chisel and FIRRTL, and avoid optimization if specified.
   */
  def apply[T <: Data](data: T, markDontTouch: Boolean = false): T = {
    annotate(new ChiselAnnotation { def toFirrtl = AttributeAnnotation(data.toNamed, "mark_debug = \"true\"") })
    if (markDontTouch) dontTouch(data) else data
  }
}

我尝试查看 Chisel 的源代码,但大多数与 firrtl 相关的内容都消失了。我想https://stackoverflow.com/a/76223005/8777949的答案可以解决我的部分问题?

chisel firrtl
1个回答
0
投票

在chisel 7.x中,您可以使用

addAttribute

chisel3.util.addAttribute(data, "mark_debug = \"true\""`)

它还没有被向后移植到 6.x 分支(我不知道为什么),但是

firtool
后端一直支持它,所以你只需要在代码中定义具有正确名称的注释:


package firrtl {
  import firrtl.annotations._

  /** used by [[addAttribute]] to add SystemVerilog attributes to a [[Target]].
    *
    * The class name `firrtl.AttributeAnnotation` is recognized by firtool
    *
    * @param target
    * @param description
    */
  case class AttributeAnnotation(target: Target, description: String) extends SingleTargetAnnotation[Target] {
    def targets = Seq(target)
    def duplicate(n: Target) = this.copy(n, description)

    override def serialize: String = s"AttributeAnnotation(${target.serialize}, $description)"
  }
}

并且:


object addAttribute { // scalastyle:ignore object.name
    def apply[T <: chisel3.InstanceId](instance: T, attributes: (String, Any)*): T = {

      for ((attr, value) <- attributes) {
        apply(instance, attr, value)
      }
      instance
    }

    def apply[T <: InstanceId](inst: T, attribute: String, value: Any): T = {
      chisel3.experimental.annotate(
        new chisel3.experimental.ChiselAnnotation {
          val valueStr = value match {
            case _: String => s"\"$value\""
            case _ => value.toString
          }
          override def toFirrtl = new firrtl.AttributeAnnotation(inst.toTarget, s"$attribute = $valueStr")

        }
      )
      inst
    }
  }

请注意,firtool 不支持处理 ATM 端口上的 SV 属性。

© www.soinside.com 2019 - 2024. All rights reserved.