我在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在verilator测试中接收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]发布于 2019-01-15 01:54:34
这看起来像是第一个解释器中的错误。踏板后端似乎工作正常,所以如果可能的话,我建议在此期间使用它。Treadle是更现代的基于scala的模拟器。
我已经创建了Interpreter Issue 145来解决这个问题
https://stackoverflow.com/questions/54178041
复制相似问题