如标题所述,我希望轻松地使设计中的任何内部信号可用于 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的答案可以解决我的部分问题?
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 属性。