【发布时间】: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 -> r._T_4 -> r._T_5 -> r._T_7 -> -> r._T_8 -> r.io_out -> _T_1 -> x.io_aChisel 没有明确支持这一点。通常会有另一个建筑。您是否有一个测试向量可以更充分地说明您需要该电路演示的属性 -
其实不是,它只是一个可重构的组合逻辑。梳循环只会出现在多路复用器信号不一致的情况下,我不知道如何向 chisel-firrtl 解释它
标签: chisel