【问题标题】:chisel-firrtl combinational loop handlingchisel-firrtl 组合循环处理
【发布时间】:2019-07-27 06:43:30
【问题描述】:

我在模拟包含梳状回路的设计时遇到了一些麻烦。 Firrtl 抛出异常,如

“循环图没有有效的线性化”

verilator 后端正常并出现警告。

是否可以使用 firrtl 后端来模拟这样的设计? 我们是否可以在详细说明时不将 --no-check-comb-loops 应用于所有设计,而是应用于其中的某些部分?

此处的示例代码:

import chisel3._
import chisel3.iotesters.PeekPokeTester

import org.scalatest.{FlatSpec, Matchers}

class Xor extends core.ImplicitModule {
  val io = IO(new Bundle {
    val a = Input(UInt(4.W))
    val b = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  })

  io.out <> (io.a ^ io.b)
}

class Reverse extends core.ImplicitModule {
  val io = IO(new Bundle {
    val in = Input(UInt(4.W))
    val out = Output(UInt(4.W))
  })

  io.out <> util.Reverse(io.in)
}

class Loop extends core.ImplicitModule {
  val io = IO(new Bundle {
    val a = Input(UInt(4.W))
    val b = Input(UInt(4.W))
    val mux = Input(Bool())
    val out = Output(UInt(4.W))
  })
  val x = Module(new Xor)
  val r = Module(new Reverse)

  r.io.in <> Mux(io.mux, io.a, x.io.out)

  x.io.a <> Mux(io.mux, r.io.out, io.a)
  x.io.b <> io.b

  io.out <> Mux(io.mux, x.io.out, r.io.out)
}

class LoopBackExampleTester(cc: Loop) extends PeekPokeTester(cc) {
  poke(cc.io.mux, false)

  poke(cc.io.a, 0)
  poke(cc.io.b, 1)

  step(1)

  expect(cc.io.out, 8)
}

class LoopBackExample extends FlatSpec with Matchers {
  behavior of "Loop"

  it should "work" in {
    chisel3.iotesters.Driver.execute(Array("--no-check-comb-loops", "--fr-allow-cycles"), () => new Loop) { cc =>
      new LoopBackExampleTester(cc)
    } should be(true)
  }
}

【问题讨论】:

  • 组合回路以何种方式有助于该电路的工作。图中存在依赖关系,因此 x.io.a 依赖于 x.io.a 而没有干预寄存器。 x.io_a -&gt; r._T_4 -&gt; r._T_5 -&gt; r._T_7 -&gt; -&gt; r._T_8 -&gt; r.io_out -&gt; _T_1 -&gt; x.io_a Chisel 没有明确支持这一点。通常会有另一个建筑。您是否有一个测试向量可以更充分地说明您需要该电路演示的属性
  • 其实不是,它只是一个可重构的组合逻辑。梳循环只会出现在多路复用器信号不一致的情况下,我不知道如何向 chisel-firrtl 解释它

标签: chisel


【解决方案1】:

首先我要指出,Chisel 旨在使同步、基于 flop 的数字设计更容易、更灵活。它旨在代表所有可能的数字电路。从根本上说,Chisel 的存在是为了让大多数事情变得更容易,同时将那些往往与实现技术(如模拟)更紧密耦合的事情留给 Verilog 或其他语言。

Chisel(以及 FIRRTL)不支持这种明显的组合循环,即使它可能表明由于多路复用器选择上的实际值而不会发生循环。这样的循环会破坏综合中的时序分析,并可能难以创建合理的电路。此外,循环“不会发生”并不是真的。除非在这里进行了仔细的物理设计,否则可能会在短时间内(时钟周期的一小部分)出现短路,这可能会导致 ASIC 出现严重问题。除非您正在构建类似环形振荡器的东西,否则大多数物理设计团队都会要求您不要这样做。在必要的情况下,这些设计通常与实现技术(使用标准单元手工设计)密切相关,因此实际上并不属于 Chisel 的领域。

如果您需要这样的循环,您可以在 Verilog 中表达它并将设计实例化为您的 Chisel 中的 BlackBox。

【讨论】:

  • 如何在模拟器中断开所有电线和 MUX,就好像每个都有一个 D 触发器一样,并允许手动创建高级循环。我知道它会导致不确定的模拟和非常慢的高级时钟周期。但这是现实的,许多现代电路,而不仅仅是环形振荡器,确实实现了惊人的功能。宣传您的“标准”EDA 意见可阻止开放社区构建类似 Cerbras 的异步尖峰网络芯片。
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多