【问题标题】:Chisel -- clock gating凿子——时钟门控
【发布时间】:2017-11-15 22:47:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: riscv chisel


    【解决方案1】:

    根据我的经验,后端工具在推断时钟门启用方面做得很好(即我的 Chisel SoC 中 95% 以上的寄存器是时钟门控的)。

    因此,我发现自己不需要按照您的要求做,但如果您只需要指定寄存器的启用,这很容易使用RegEnable

    【讨论】:

    • 谢谢,正在调查这个 :-)
    • 对我们来说,后端工具确实会在大多数设备上插入时钟门,但它们往往没有帮助:-) 我们使用的是 Synopsys,它们会使用重置作为启用。他们似乎没有很好地确定何时可以有效地关闭时钟。您是否正在做任何特别的事情来提供提示或帮助工具?
    【解决方案2】:

    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 后端或其他东西来正确测试它。

    【讨论】:

    • 在四处询问这个问题时,普遍的共识是你不应该采用这种方法。正如@colins 所说,有更简单的方法可以做到这一点。但我将把它留在这里作为参考和设置时钟的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多