systemverilog 的解决方法没有 `if 编译器指令

Posted

技术标签:

【中文标题】systemverilog 的解决方法没有 `if 编译器指令【英文标题】:Workaround for systemverilog there is no `if compiler directive 【发布时间】:2017-01-30 14:52:46 【问题描述】:

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

`define BITS 16

reg[`BITS-1:0] my_reg;

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

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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你可以程序化if声明

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

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

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

my_reg[(`BITS>31) ? 31 : 0] = 1'b0;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于systemverilog 的解决方法没有 `if 编译器指令的主要内容,如果未能解决你的问题,请参考以下文章

SystemVerilog基本语法总结(中)

SystemVerilog:如何创建一个简单接口数组的接口?

如果未设置某个宏,则阻止systemverilog编译

systemverilog接口

求systemverilog vimrc 高亮方法(要代码)

SystemVerilog测试台模拟(VCS)的非活动停止开关