Chisel 和 FIRRTL 有一个相当健壮的注释系统来处理这些元数据。这是一个积极开发的领域,注释实例(而不是模块)的处理在即将发布的 Chisel 3.4.0 / FIRRTL 1.4.0 中得到了改进。话虽如此,我可以提供一个简单的例子来说明它是如何工作的
基本上,FIRRTL 有一个Annotation的概念,它可以与零个、一个或多个Targets相关联。目标是硬件组件(如寄存器或电线)或模块的名称。这正是 Chisel 的dontTouch
实现方式
import chisel3._
import chisel3.stage._
import firrtl.annotations.JsonProtocol
import firrtl.transforms.DontTouchAnnotation
class Foo extends Module {
val io = IO(new Bundle {
val in = Input(Bool())
val out = Output(Bool())
})
dontTouch(io)
io.out := ~io.in
}
val resultAnnos = (new ChiselStage).run(ChiselGeneratorAnnotation(() => new Foo) :: Nil)
val dontTouches = resultAnnos.collect { case dt: DontTouchAnnotation => dt }
println(JsonProtocol.serialize(dontTouches))
/* Prints:
[
{
"class":"firrtl.transforms.DontTouchAnnotation",
"target":"~Foo|Foo>io_in"
},
{
"class":"firrtl.transforms.DontTouchAnnotation",
"target":"~Foo|Foo>io_out"
}
]
*/
请注意,这是完全可扩展的,定义您自己的“dontTouch-like”API 相当简单(尽管没有详细记录)。不幸的是,这个流程没有 Chisel API 那么多的文档,但整体结构已经存在,并且在 FireSim ( https://fires.im/ ) 等项目中大量使用。
注释的常见用途是将某些元数据与注释(如物理设计信息)相关联,通过编译传播它,然后以任何格式发出文件以挂钩到后续流程。
Chisel 3.4 中任何令人兴奋的功能都有助于实现这一点,那就是新的“CustomFileEmission”API。在编写自定义注解时,可以告诉 FIRRTL 如何发出注解,例如,您可以有一些带有物理设计信息的注解并发出 TCL 文件。