Не дополняется знаком в операции AND в firtl

Я попробовал простой тест, как показано ниже, в 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 в проверяющем тесте.

В качестве другого способа я добавляю Wire(SInt(32.W)) в качестве моста между io.b и операндом AND, как в следующем коде, и это работает хорошо.

val node = Wire(SInt(32.W))
node := io.b
io.out := io.a & node 

Мои вопросы: «Разве firtl не поддерживает операции с расширенным знаком?» и «Должен ли я ставить мосты, как указано выше, когда я хочу использовать операнды, расширенные знаком?».

Ниже приведен модуль Test на firtl.

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]

person BitMaPT    schedule 14.01.2019    source источник


Ответы (1)


Это похоже на ошибку в первом интерпретаторе. Задний конец педали, кажется, работает правильно, поэтому, если возможно, я бы посоветовал использовать его пока. Treadle — более современный симулятор на основе scala.

Я создал ошибку интерпретатора 145, чтобы исправить это.

person Chick Markley    schedule 14.01.2019
comment
Я думаю, что может быть дополнительная ошибка в самих тестировщиках. 1-битный SInt не может представлять 1, он может представлять только 0 и -1, поэтому странно, что тесты принимают это. Кроме того, если вы измените его на poke с -1, серверная часть Verilator также выйдет из строя; Я не уверен, почему. Примечательно, что если вы управляете входными данными с помощью кода Chisel и управляете с помощью 31.S и -1.S, серверная часть verilator делает правильные вещи, но интерпретатор все равно дает сбой. - person Jack Koenig; 14.01.2019
comment
@Chick Markley Спасибо за ответ и добавление проблемы в github. На данный момент я пытаюсь использовать Mux() вместо этого. - person BitMaPT; 15.01.2019