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:如何创建一个简单接口数组的接口?