凿子 - 时钟门控

时间:2017-11-15 22:48:00

标签: riscv chisel

时钟门控对于降低功耗非常重要。我们如何在Chisel中指定时钟门控?

时钟门控是逻辑信号确定特定寄存器的时钟是否被切换的地方。当逻辑信号无效时,时钟保持稳定,不变。只有当使能有效时,时钟信号才会切换,从而将输入锁存到触发器中。

后端工具处理插入此实现,但是他们需要RTL来指示启用信号。

2 个答案:

答案 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后端或其他方法对其进行正确测试。