Я попробовал простой тест, как показано ниже в 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 в результате. Однако в первом тесте io.out
получает 1, а io.out
получает 31 в тесте verilator.
В качестве другого способа я добавляю Wire (SInt (32.W)) в качестве моста между io.b
и операндом AND, как в следующем коде, и это хорошо работает.
val node = Wire(SInt(32.W))
node := io.b
io.out := io.a & node
У меня такие вопросы: «Не поддерживает ли 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]