Verilog “符号”&引用;在“define”语句的末尾
对于某些模拟器(例如VCS),下面的代码正在传递,对于某些模拟器,它会导致编译错误(例如Xcelium): 例如: `定义最大尺寸8 谁知道为什么一些模拟器会在最后带有“;”符号Verilog “符号”&引用;在“define”语句的末尾,verilog,system-verilog,Verilog,System Verilog,对于某些模拟器(例如VCS),下面的代码正在传递,对于某些模拟器,它会导致编译错误(例如Xcelium): 例如: `定义最大尺寸8 谁知道为什么一些模拟器会在最后带有“;”符号 非常感谢,Verilog文本宏用于文本替换。在您的情况下,是宏定义的一部分。它将按原样放置在文本中,例如: `define MAX_SIZE 8; ... assign abc = `MAX_SIZE 最后一条语句不包含显式分号。当它的文本被替换时,它由宏提供,看起来像assignabc=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
当你把一个在宏的末尾加上一个,然后在使用宏的语句的末尾加上一个,最后得到一个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还是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
在我的示例中:在提到的'define行之后是以下行:参数MAX\u SIZE='MAX\u SIZE;正如您所提到的,我理解应该从代码的第一行或第二行删除符号。因为结果可能变成abc=8;;这将导致一个问题。我对答案添加了更多的解释。我认为,为什么在某些模拟器中可以使用此选项,而在其他模拟器中却不能使用此选项的答案是,某些模拟器允许
,将第二个分号视为空语句。根据标准,code>不是合法的verilog语法。大多数编译器都会在这里抛出一个错误。有些人会允许的代码>在SystemVerilog的某些地方是合法的。参见我的答案。在我的示例中:在提到的'define行之后是以下行:参数MAX\u SIZE='MAX\u SIZE;正如您所提到的,我理解应该从代码的第一行或第二行删除符号。因为结果可能变成abc=8;;这将导致一个问题。我对答案添加了更多的解释。我认为,为什么在某些模拟器中可以使用此选项,而在其他模拟器中却不能使用此选项的答案是,某些模拟器允许
,将第二个分号视为空语句。根据标准,code>不是合法的verilog语法。大多数编译器都会在这里抛出一个错误。有些人会允许的代码>在SystemVerilog的某些地方是合法的。看看我的答案。