首页 > 解决方案 > 我不明白这个带复制的定义宏

问题描述

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

标签: verilogsystem-verilogoperator-precedence

解决方案


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

assign flag = flag2 - 1'b1;

但是,如果您想清楚地显示该扩展名,则可以编写显式转换:

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

推荐阅读