微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我不明白这个定义宏与复制

如何解决我不明白这个定义宏与复制

我有 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 替换为 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;
,

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

assign flag = flag2 - 1'b1;

但是如果您想清楚地显示该扩展名,您可以编写一个明确的演员表:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。