#verilog #system-verilog #operator-precedence
#verilog #system-verilog #оператор-приоритет
Вопрос:
У меня есть код SystemVerilog, в котором используется репликация, которую я не понимаю. Пожалуйста, будьте внимательны к своему ответу.
parameter WIDTH = 6;
logic [WIDTH-1:0] flag, flag2;
`define ZERO_X(n, m) {{m-$bits(n){1'b0}}, (n)}
assign flag = flag2 - `ZERO_X(1'b1, WIDTH);
Ответ №1:
Первым шагом является выполнение простой замены текста в этом выражении. Замените n
на 1'b1
и m
на WIDTH
. Итак, это:
`ZERO_X(1'b1, WIDTH)
становится:
{{WIDTH-$bits(1'b1){1'b0}}, (1'b1)}
Заменить WIDTH
на 6
:
{{6-$bits(1'b1){1'b0}}, 1'b1}
$bits(1'b1)
вычисляется как 1
:
{{(6-1){1'b0}}, 1'b1}
6-1
это просто 5
:
{{5{1'b0}}, 1'b1}
{5{1'b0}}
реплицирует 1'b0
до 5 0:
{5'b0_0000, 1'b1}
Затем простая конкатенация:
6'b00_0001
Таким образом, эта строка:
assign flag = flag2 - `ZERO_X(1'b1, WIDTH);
вычисляется как:
assign flag = flag2 - 6'b00_0001;
Ответ №2:
Этот код пытается 0-расширить свой операнд до ШИРИНЫ и совершенно не нужен. По правилам Verilog, 1'b1
операнд уже расширяется до ширины самого большого операнда в контексте выражения, в котором он записан.
assign flag = flag2 - 1'b1;
Но если вы хотите четко показать это расширение, вы могли бы написать явное приведение:
assign flag = flag2 - WIDTH'(1'b1);