Chisel: Verilog сгенерировал код для Sint и UInt

При использовании SInt и UInt для реализации сумматора я получаю тот же код Verilog, см. Коды ниже,

import Chisel._

class Unsigned_Adder extends Module{ 
  val io = new Bundle{
    val a =      UInt(INPUT, 16)
    val b =      UInt(INPUT, 16)
    val out =    UInt(OUTPUT)
  }
  io.out := io.a + io.b
}

и

 import Chisel._

class Signed_Adder extends Module{ 
  val io = new Bundle{
    val a =      SInt(INPUT, 16)
    val b =      SInt(INPUT, 16)
    val out =    SInt(OUTPUT)
  }
  io.out := io.a + io.b
}

Это сгенерирует тот же код Verilog,

module Signed_Adder(
    input [15:0] io_a,
    input [15:0] io_b,
    output[15:0] io_out
);

  wire[15:0] T0;


  assign io_out = T0;
  assign T0 = io_a + io_b;
endmodule

Конечно, названия модулей будут отличаться. при реализации множителя в долоте с использованием оператора умножения (*)

io.out := io.a * io.b  

Я получу другой код Verilog для UInt и SInt, где в SInt код будет выглядеть так:

module Multi(
    input [15:0] io_a,
    input [15:0] io_b,
    output[31:0] io_out
);

  wire[31:0] T0;


  assign io_out = T0;
  assign T0 = $signed(io_a) * $signed(io_b);
endmodule

Добавление $signed в код. Это почему? почему в случае сложения я получаю тот же код Verilog, но в случае умножения я получаю другой код, сгенерированный для UInt и SInt?


person Ammar Kurd    schedule 15.09.2016    source источник


Ответы (2)


С добавлением, если размер переменной равен, сумматор не заботится о знаке, добавление будет правильным благодаря биту переполнения. Но с умножением мы должны знать знак, чтобы управлять им.

См. Эту документацию о подписанной арифметике в Verilog для получения дополнительной информации: введите описание ссылки здесь

person FabienM    schedule 16.09.2016

Если вы используете + &, тогда ширина Addr.io.out будет 17 бит.

и в Verilog этот Addr не будет заботиться о знаке, как сказал FabienM, потому что он будет обрабатываться конструкцией верхней иерархии, такой как преобразование unsigned в подписанное, затем подключенное к этому Addr, и оно будет преобразовано в форму с двумя дополнениями.

person Lin Frank    schedule 29.06.2017