【发布时间】:2017-11-15 22:47:59
【问题描述】:
时钟门控对于降低功耗很重要。我们如何在 Chisel 中指定时钟门控?
时钟门控是逻辑信号确定特定寄存器的时钟是否被切换的地方。当逻辑信号无效时,时钟保持稳定,不变。只有当使能有效时,时钟信号才会切换,进而将输入锁存到触发器中。
后端工具处理插入此实现,但它们需要 RTL 来指示启用信号。
【问题讨论】:
时钟门控对于降低功耗很重要。我们如何在 Chisel 中指定时钟门控?
时钟门控是逻辑信号确定特定寄存器的时钟是否被切换的地方。当逻辑信号无效时,时钟保持稳定,不变。只有当使能有效时,时钟信号才会切换,进而将输入锁存到触发器中。
后端工具处理插入此实现,但它们需要 RTL 来指示启用信号。
【问题讨论】:
根据我的经验,后端工具在推断时钟门启用方面做得很好(即我的 Chisel SoC 中 95% 以上的寄存器是时钟门控的)。
因此,我发现自己不需要按照您的要求做,但如果您只需要指定寄存器的启用,这很容易使用RegEnable。
【讨论】:
以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 后端或其他东西来正确测试它。
【讨论】: