定义语句末尾的符号";"



对于某些模拟器(例如VCS(,以下代码正在传递,其中一些代码会导致编译错误(例如Xcelium(: 例如: "定义MAX_SIZE 8;

谁知道一些模拟器最后带有";"符号的原因是什么?

此致敬意

原因与工具是否将代码解释为Verilog或SystemVerilog有关。Verilog 没有空语句的概念,而 SystemVerilog 有:

module top;
;
endmodule 

当您将;放在宏的末尾,并将一个放在使用该宏的语句的末尾时,最终会得到一个 null 语句。

`defne MAX_SIZE 8;
A = `MAX_SIZE;

这被入侵为

A = 8; ;

因此,这取决于该 null 语句在其出现的上下文中是否有意义。

begin 
; // allowed here
case (expr)
1: A = 8;
2: A = 16; ; // null statement not allowed here
endcase
B = 8; ; // allowed here
end

Verilog 文本宏用于文本替换。在您的情况下,;是宏定义的一部分。它将按原样放置在文本中,例如:

`define MAX_SIZE 8;
...
assign abc = `MAX_SIZE

最后一个语句不包含显式分号。当它的文本在那里被替换时,它由宏提供,看起来像assign abc = 8;

回答评论

在宏定义中使用;不是一个好的做法。Verilog对分号非常严格,还有其他问题。例如,如果在这样的宏之后加上一个分号,就像在注释中一样,编译将因双;;而失败

`assign abc = `MAX_SIZE;

编译失败的另一个示例是声明:

reg[`MAX_SIZE-1:0] ctrl;

现在,MAX_SIZE中的分号将挡住路。

避免在 verilog 中使用宏出现问题的最佳方法:不要在宏定义中使用分号,尤其是在定义常量时:

`define MAX_SIZE 8

但是,定义常量的更好方法是使用参数。parameter MAX_SIZE = 8;

最新更新