Verilog 我不理解这个用复制定义宏

Verilog 我不理解这个用复制定义宏,verilog,system-verilog,operator-precedence,Verilog,System Verilog,Operator Precedence,我有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); 第一步是在此表达式中执行简单的文本替换。将n替换为1'b1,将m替换为宽度。因此: `ZERO_X(1'b1, WIDTH) 变成:

我有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);

第一步是在此表达式中执行简单的文本替换。将n替换为1'b1,将m替换为宽度。因此:

`ZERO_X(1'b1, WIDTH)
变成:

{{WIDTH-$bits(1'b1){1'b0}}, (1'b1)}
将宽度替换为6:

$bits1'b1的计算结果为1:

6-1只是5:

{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;

第一步是在此表达式中执行简单的文本替换。将n替换为1'b1,将m替换为宽度。因此:

`ZERO_X(1'b1, WIDTH)
变成:

{{WIDTH-$bits(1'b1){1'b0}}, (1'b1)}
将宽度替换为6:

$bits1'b1的计算结果为1:

6-1只是5:

{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;

这段代码试图将其操作数0扩展到宽度,完全没有必要。根据Verilog规则,1'b1操作数已经扩展到它所写入的表达式上下文中最大操作数的宽度

assign flag = flag2 - 1'b1;
但如果您想清楚地显示该扩展,可以编写一个显式强制转换:

assign flag = flag2 - WIDTH'(1'b1);

这段代码试图将其操作数0扩展到宽度,完全没有必要。根据Verilog规则,1'b1操作数已经扩展到它所写入的表达式上下文中最大操作数的宽度

assign flag = flag2 - 1'b1;
但如果您想清楚地显示该扩展,可以编写一个显式强制转换:

assign flag = flag2 - WIDTH'(1'b1);