Verilog “符号”&引用;在“define”语句的末尾

Verilog “符号”&引用;在“define”语句的末尾,verilog,system-verilog,Verilog,System Verilog,对于某些模拟器(例如VCS),下面的代码正在传递,对于某些模拟器,它会导致编译错误(例如Xcelium): 例如: `定义最大尺寸8 谁知道为什么一些模拟器会在最后带有“;”符号 非常感谢,Verilog文本宏用于文本替换。在您的情况下,是宏定义的一部分。它将按原样放置在文本中,例如: `define MAX_SIZE 8; ... assign abc = `MAX_SIZE 最后一条语句不包含显式分号。当它的文本被替换时,它由宏提供,看起来像assignabc=8 回答评论 使用不是一个好

对于某些模拟器(例如VCS),下面的代码正在传递,对于某些模拟器,它会导致编译错误(例如Xcelium): 例如: `定义最大尺寸8

谁知道为什么一些模拟器会在最后带有“;”符号


非常感谢,

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

`define MAX_SIZE 8;
...
assign abc = `MAX_SIZE
最后一条语句不包含显式分号。当它的文本被替换时,它由宏提供,看起来像
assignabc=8

回答评论

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

`assign abc = `MAX_SIZE;
编译失败的另一个例子是声明:

   reg[`MAX_SIZE-1:0] ctrl;
现在,MAX_大小中的分号将保持不变

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

`define MAX_SIZE 8

但是,定义常量的更好方法是使用参数<代码>参数MAX_SIZE=8

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

`define MAX_SIZE 8;
...
assign abc = `MAX_SIZE
最后一条语句不包含显式分号。当它的文本被替换时,它由宏提供,看起来像
assignabc=8

回答评论

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

`assign abc = `MAX_SIZE;
编译失败的另一个例子是声明:

   reg[`MAX_SIZE-1:0] ctrl;
现在,MAX_大小中的分号将保持不变

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

`define MAX_SIZE 8

但是,定义常量的更好方法是使用参数<代码>参数MAX_SIZE=8

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

module top;
 ;
endmodule 
当你把一个

`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还是SystemVerilog有关。Verilog没有空语句的概念,而SystemVerilog有:

module top;
 ;
endmodule 
当你把一个

`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

在我的示例中:在提到的'define行之后是以下行:参数MAX\u SIZE='MAX\u SIZE;正如您所提到的,我理解应该从代码的第一行或第二行删除符号。因为结果可能变成abc=8;;这将导致一个问题。我对答案添加了更多的解释。我认为,为什么在某些模拟器中可以使用此选项,而在其他模拟器中却不能使用此选项的答案是,某些模拟器允许
,将第二个分号视为空语句。
不是合法的verilog语法。大多数编译器都会在这里抛出一个错误。有些人会允许的在SystemVerilog的某些地方是合法的。参见我的答案。在我的示例中:在提到的'define行之后是以下行:参数MAX\u SIZE='MAX\u SIZE;正如您所提到的,我理解应该从代码的第一行或第二行删除符号。因为结果可能变成abc=8;;这将导致一个问题。我对答案添加了更多的解释。我认为,为什么在某些模拟器中可以使用此选项,而在其他模拟器中却不能使用此选项的答案是,某些模拟器允许
,将第二个分号视为空语句。
不是合法的verilog语法。大多数编译器都会在这里抛出一个错误。有些人会允许的在SystemVerilog的某些地方是合法的。看看我的答案。