时钟门控对于降低功耗非常重要。我们如何在Chisel中指定时钟门控?
时钟门控是逻辑信号确定特定寄存器的时钟是否被切换的地方。当逻辑信号无效时,时钟保持稳定,不变。只有当使能有效时,时钟信号才会切换,从而将输入锁存到触发器中。
后端工具处理插入此实现,但是他们需要RTL来指示启用信号。
答案 0 :(得分:4)
根据我的经验,后端工具可以很好地推断时钟门控使能(即我的Chisel SoC中95%以上的寄存器都是时钟门控的。)
因此,我发现自己不需要按照自己的要求行事,但如果只需要指定启用寄存器,RegEnable就可以轻松完成。
答案 1 :(得分:3)
以Chisel3 MultiClock test为例。我认为这与你正在寻找的非常接近。
import chisel3._
import chisel3.experimental.withClock
class GatedCounter extends Module {
val io = IO(new Bundle {
val count = Output(UInt(32.W))
})
val counter = RegInit(0.U(32.W))
counter := counter + 1.U
io.count := counter
}
class HasGatedCounter extends Module {
val io = IO(new Bundle {
val enable = Input(Bool())
val count = Output(UInt(32.W))
})
val clock2 = (clock.asUInt()(0) & io.enable).asClock()
withClock(clock2) {
val counterModule = Module(new GatedCounter)
io.count := counterModule.io.count
}
}
注意:这似乎不适用于firrtl-interpreter后端,因此您必须使用verilator后端或其他方法对其进行正确测试。