【问题标题】:I don't understand this define macro with replication我不明白这个带复制的定义宏
【发布时间】:2021-01-21 21:44:17
【问题描述】:
我有 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);
【问题讨论】:
标签:
verilog
system-verilog
operator-precedence
【解决方案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 扩展为 WIDTH,这完全没有必要。根据 Verilog 规则,1'b1 操作数已经扩展到其所写表达式上下文中最大操作数的宽度。
assign flag = flag2 - 1'b1;
但如果您想清楚地显示该扩展,您可以编写显式转换:
assign flag = flag2 - WIDTH'(1'b1);