Я не понимаю этого определения макроса с репликацией

#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);