未在 firrtl 中的 AND 操作中进行符号扩展
Not sign-extended in AND operation in firrtl
我在 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
AND 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
我的问题是"Does firrtl not support operations with sign-extended?"和"Do I have to put bridges like above when I want to use sign-extended operands?"。
以下是 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]
这看起来像是第一个解释器中的错误。踏板后端似乎工作正常,所以如果可能的话,我建议同时使用它。 Treadle 是更现代的基于 scala 的模拟器。
我已创建 Interpreter Issue 145 来修复此问题
我在 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
AND 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
我的问题是"Does firrtl not support operations with sign-extended?"和"Do I have to put bridges like above when I want to use sign-extended operands?"。
以下是 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]
这看起来像是第一个解释器中的错误。踏板后端似乎工作正常,所以如果可能的话,我建议同时使用它。 Treadle 是更现代的基于 scala 的模拟器。
我已创建 Interpreter Issue 145 来修复此问题