我在下面的chisel3中尝试了一个简单的测试。
import chisel3.iotesters.{ChiselFlatSpec, Driver, PeekPokeTester}
import chisel3._
class TestTesterUnit(c: Test) extends PeekPokeTester(c) {
val value = 31
poke(c.io.a, value)
poke(c.io.b, 1)
step(1)
expect(c.io.out, value)
}
class TestTester extends ChiselFlatSpec {
for (backendName <- backends) {
"Test" should s"should sign-extended AND operation (with $backendName)" in {
Driver(() => new Test, backendName) {
c => new TestTesterUnit(c)
} should be (true)
}
}
}
class Test extends Module {
val io = IO(new Bundle {
val a = Input(SInt(32.W))
val b = Input(SInt(1.W))
val out = Output(SInt(32.W))
})
io.out := io.a & io.b
}
我认为Test
模块使用符号扩展来计算io.a
和io.b
,而io.out
收到31。但是,在firrtl测试中,io.out
收到1,而io.out
在验证程序测试中得到31。
以另一种方式,我将Wire(SInt(32.W))添加为io.b
和AND操作数之间的桥梁,就像下面的代码一样,
val node = Wire(SInt(32.W))
node := io.b
io.out := io.a & node
我的问题是“ firrtl不支持带符号扩展的操作吗?”和“当我想使用带符号扩展的操作数时是否必须像上面那样放置桥?”
firrtl上的Test
模块如下。
circuit Test :
module Test :
input clock : Clock
input reset : UInt<1>
output io : {flip a : SInt<32>, flip b : SInt<1>, out : SInt<32>}
node _T_11 = and(io.a, io.b) @[Multiple.scala 16:18]
node _T_12 = asSInt(_T_11) @[Multiple.scala 16:18]
io.out <= _T_12 @[Multiple.scala 16:10]
答案 0 :(得分:2)
这看起来像是firrt解释器中的错误。踏板后端似乎正常工作,因此,如果可能的话,我建议同时使用它。 Treadle是更现代的基于Scala的模拟器。
我创建了Interpreter Issue 145来解决此问题