Чистый способ обрезать результат сложения или вычитания - PullRequest
0 голосов
/ 05 июня 2019

Когда я делаю сложение или вычитание в Verilog, некоторые компиляторы выдают предупреждение.

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 1;
  c <= a - 1;
end
// warning example
Warning (13469): Verilog HDL assignment warning at xxx.sv(xxx): truncated value with size 11 to match size of target (10) File: xxx.sv Line: xxx
Warning (13469): Verilog HDL assignment warning at xxx.sv(xxx): truncated value with size 32 to match size of target (10) File: xxx.sv Line: xxx

Я хочу найти чистый способ удаления этих предупреждений.Я попробовал два метода:

// method 1
b <= (a + 1)[9 : 0];
// method 2
logic [10 : 0] d;
d <= a + 1;
b <= d[9 : 0];

Я думал, что первый метод будет компилироваться, но это был неверный синтаксис в verilog.Второй метод работает, но он слишком многословен и грязен.Есть ли другие чистые способы?

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Используйте фигурные скобки Керли

b <= {a + 1}[9 : 0];

или измените постоянный размер (по умолчанию 32-битный)

b <= a + 10'd1;
2 голосов
/ 06 июня 2019

Из стандарта IEEE 1364-2001.

Страница 73: Таблица 29 - Битовые длины, полученные из выражений, определяемых пользователем:

  • Постоянное число без размера = То же, что и целое число

Страница 45:

  • ПРИМЕЧАНИЕ. Реализации могут ограничивать максимальный размер целочисленной переменной, но они должны составлять не менее 32 бит.

Таким образом, вы видите предупреждения, возникающие при попытке оперировать одной числовой константой без размера (не менее 32 бит) с переменной размера (10 бит), поэтому синтезатор предупреждает о том, что результат может переполниться.

Итак, просто убедитесь, что все ваши операнды имеют одинаковый размер:

Вместо:

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 1;
  c <= a - 1;
end

Do:

// code example
logic [9 : 0] a, b, c;
always_ff @(posedge clk) begin
  b <= a + 10'd1;
  c <= a - 10'd1;
end
2 голосов
/ 05 июня 2019

1 идентификатор 32-битного значения. В результате ширина выражения составляет 32. Обходной путь - использовать размерное значение «1», т.е.

b <= a + 1'b1;
c <= b - 1'b1;

Это потенциально может дать вам 11-битный результат. Каррион бит будет потерян. На данный момент вы можете сделать некоторые другие трюки. Я думаю, что это самый распространенный. Используйте ручную кладь.

logic con;
logic[9:0] a,b;
...
{con, a} <= b + 1'b1;

Вы можете использовать временную переменную, как в вашем примере.

Как правило, стандарт Verilog допускает свободное усечение или расширение ширины операндов, и никаких предупреждений не требуется. Определенно в этом случае вы можете игнорировать предупреждение или отключить его. Я не видел тренажеров, которые бы предупреждали об этом. Просто определенное правило в подкладке инструментов.

...