0

在 systemverilog 中没有 `if 编译器指令。所以以下几行是不正确的:

`define BITS 16

reg[`BITS-1:0] my_reg;

...
`if `BITS > 10
   my_reg[31] = 1'b0;
endif
...

没有`如果有警告/错误。

我该如何解决或解决这个问题?

4

2 回答 2

3

你可以一个程序if声明

if (`BITS > 10)
      my_reg[31] = 1'b0;

并且编译器/合成器将优化带有常量表达式的分支语句;if这意味着该语句不会创建额外的逻辑。

要绕过越界消息,您需要一个更复杂的表达式(仍然是一个常量)

my_reg[(`BITS>31) ? 31 : 0] = 1'b0;
于 2017-01-30T15:29:47.700 回答
0

1800-2012 LRM,22.5.1:“指令 `define 创建一个用于文本替换的宏。” 例如。:

`define D(x,y) initial $display("start", x, y, "end");

`D( "msg1" , "msg2" ) // expands to 'initial $display("start", "msg1", "msg2", "end");'

对于数值参数,您应该使用parameter/localparam根据您的需要。

于 2017-02-01T07:52:40.283 回答