对于某些模拟器(例如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;