У меня есть конкретный вопрос и просьба о более общих указаниях.
У меня вопрос, какой самый чистый способ умножить число со знаком на число без знака в SystemVerilog?
Ниже приведенонебольшой тестовый код, который иллюстрирует проблему.«а» - это число без знака.«б» является подписанным номером.Для получения правильного результата со знаком SystemVerilog, похоже, требует, чтобы оба операнда умножения были подписаны.Чтобы это работало здесь, я должен был добавить дополнительный «0» в начале номера без знака, чтобы сделать его действительным номером со знаком.Я думаю, что должен быть более чистый способ.
В общем, я только начинаю делать математику с фиксированной точкой в SystemVerilog.В VHDL есть очень конкретный синтаксис и даже стандартный пакет для поддержки математики со знаком и без знака с фиксированной точкой, с округлением и т. Д. Есть ли что-то подобное в мире SystemVerilog?
Спасибо,
module testbench ();
localparam int Wa = 8;
localparam int Wb = 8;
logic [Wa-1:0] a; // unsigned
logic [Wa:0] a_signed; // signed word with extra bit to hold unsigned number.
logic [Wb-1:0] b; // signed
logic [Wa+Wb-1:0] c; // result
localparam clk_period = 10;
assign a_signed = {1'b0, a};
assign c = $signed(a_signed)*$signed(b);
initial begin
a = +5;
b = +10;
#(clk_period*1);
$display("Hex: a=%x,b=%x, c=%x; Dec: a=%d, b=%d, c=%d", a, b, c, a, $signed(b), $signed(c));
a = +5;
b = -10;
#(clk_period*1);
$display("Hex: a=%x,b=%x, c=%x; Dec: a=%d, b=%d, c=%d", a, b, c, a, $signed(b), $signed(c));
a = +255;
b = +10;
#(clk_period*1);
$display("Hex: a=%x,b=%x, c=%x; Dec: a=%d, b=%d, c=%d", a, b, c, a, $signed(b), $signed(c));
a = +255;
b = -10;
#(clk_period*1);
$display("Hex: a=%x,b=%x, c=%x; Dec: a=%d, b=%d, c=%d", a, b, c, a, $signed(b), $signed(c));
$stop;
end
endmodule