Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System verilog 在SystemVerilog中包含防护装置_System Verilog - Fatal编程技术网

System verilog 在SystemVerilog中包含防护装置

System verilog 在SystemVerilog中包含防护装置,system-verilog,System Verilog,我有一个包含在include-guards中的verilog头文件。它包含一些函数,我使用这些函数在其他rtl文件中定义本地参数。此包含文件在模块描述模块端口实例化“包含…”中被引用。。。。身体末端模块。我一直认为,当verilog编译每个模块时,包含的范围将是该模块的本地范围,并且它只会在模块内强制保护。我现在已经编译了项目中的所有模块,似乎是第二次在另一个模块中引用包含的内容,而guard仍然在运行。这是否与systemverilog的预处理器行为有关?当你说guard时,我假设你的意思是:

我有一个包含在include-guards中的verilog头文件。它包含一些函数,我使用这些函数在其他rtl文件中定义本地参数。此包含文件在模块描述模块端口实例化“包含…”中被引用。。。。身体末端模块。我一直认为,当verilog编译每个模块时,包含的范围将是该模块的本地范围,并且它只会在模块内强制保护。我现在已经编译了项目中的所有模块,似乎是第二次在另一个模块中引用包含的内容,而guard仍然在运行。这是否与systemverilog的预处理器行为有关?

当你说guard时,我假设你的意思是:

`ifndef MY_GUARD
`define MY_GUARD
// ... definitions for parameters, functions, etc. ...
`endif // MY_GUARD
`ifdef、`ifndef、`define和其他相关的`operation依赖于编译顺序。宏定义从定义到未定义都存在于全局空间中。在上面的示例中,一旦定义了MY_GUARD,任何'ifndef MY_GUARD将计算为false,直到它是未定义的'undef MY_GUARD

如果要在多个模块中包含同一文件,请移除防护


因为您使用的是SystemVerilog。考虑将公共代码放在一个包中,然后将它导入每个模块。

当你说“守护”时,我假设你的意思是:

`ifndef MY_GUARD
`define MY_GUARD
// ... definitions for parameters, functions, etc. ...
`endif // MY_GUARD
`ifdef、`ifndef、`define和其他相关的`operation依赖于编译顺序。宏定义从定义到未定义都存在于全局空间中。在上面的示例中,一旦定义了MY_GUARD,任何'ifndef MY_GUARD将计算为false,直到它是未定义的'undef MY_GUARD

如果要在多个模块中包含同一文件,请移除防护


因为您使用的是SystemVerilog。考虑将公共代码放入包中,然后将其导入到每个模块。

< p> SystemVerilog中不需要编译保护。正确使用包后,编译脚本应该按照正确的顺序编译所有内容。唯一的例外可能是包含文本宏

工具有几个用于编译文件和编译单元的形成方式的使用模型。如果你有

compile file1 file2
在单文件编译模式下,这与您输入的相同

compile file1
compile file2
在此模式下,所有编译器指令不会从一个文件传递到下一个文件。编译的规则并不重要,只是在导入包之前必须编译包


在多文件编译模式下,file1中的任何`定义都会转到file2。所以文件的顺序很重要。

您实际上不需要在SystemVerilog中编译保护程序。正确使用包后,编译脚本应该按照正确的顺序编译所有内容。唯一的例外可能是包含文本宏

工具有几个用于编译文件和编译单元的形成方式的使用模型。如果你有

compile file1 file2
在单文件编译模式下,这与您输入的相同

compile file1
compile file2
在此模式下,所有编译器指令不会从一个文件传递到下一个文件。编译的规则并不重要,只是在导入包之前必须编译包


在多文件编译模式下,file1中的任何`定义都会转到file2。因此,文件的顺序很重要。

Verilog对它编译的文件具有粘性语义。这意味着,如果命令行上有多个文件,则在一个文件中定义的宏也将在另一个文件中定义

a、 五

b、 五

因此,宏A_V在文件b.V中可用,如果您按照以下顺序编译它们:A.V,b.V

因此,如果h.vh使用保护宏,它将只被解析为包含在a.v中,而将被保护在b.v中而不被解析

现在假设您在h.vh中包含函数参数的定义:

`ifndef H_VH
`defien H_VH
paremeter I = 10;
`endif
它包含在模块主体中:

a、 五

b、 五

现在,当文件首先包含在模块A中时,参数现在在模块A中定义。但是宏H_VH也被定义。将不会在“b.v”文件中第二次分析包含文件。因此,将其包含在模块中不会扩展到参数定义,编译失败,因为没有可用的I

如果文件包含在全局范围内,模块之外,则verilog中的Guard宏非常有用。如果包含在范围内,它们会产生很多问题。经验法则是对全局包含的头使用它们,如果头包含在范围中,则永远不要使用它们。永远不要将全局和范围包含混合在一起


是的,正如大家已经提到的,在系统verilog中,您最好为此使用软件包。在常规verilog中,您没有其他选择来确定公共声明的范围

Verilog对它编译的文件具有粘性语义。这意味着,如果命令行上有多个文件,则在一个文件中定义的宏也将在另一个文件中定义

a、 五

< p> b.v

因此,宏A_V在文件b.V中可用,如果您按照以下顺序编译它们:A.V,b.V

因此,如果h.vh使用保护宏,它将只被解析为包含在a.v中,而将被保护在b.v中而不被解析

现在假设您在h.vh中包含函数参数的定义:

`ifndef H_VH
`defien H_VH
paremeter I = 10;
`endif
它包含在模块主体中:

a、 五

b、 五

现在,当文件首先包含在模块A中时,参数现在在模块A中定义。但是宏H_VH也被定义。将不会在“b.v”文件中第二次分析包含文件。因此,将其包含在模块中不会扩展到参数定义,编译失败,因为没有可用的I

如果文件包含在全局范围内,模块之外,则verilog中的Guard宏非常有用。如果包含在范围内,它们会产生很多问题。经验法则是对全局包含的头使用它们,如果头包含在范围中,则永远不要使用它们。永远不要将全局和范围包含混合在一起


是的,正如大家已经提到的,在系统verilog中,您最好为此使用软件包。在常规verilog中,您没有其他选择来确定公共声明的范围

说起来容易做起来难:-谢谢戴夫的回答。我100%同意你对包装的使用。问题出在夸特斯和望远镜之间。Quartus不喜欢包,尤其是当您导入localparams而spyglass导入localparams时。为了让两者都满意,我唯一能做的就是加入。说起来容易做起来难:-谢谢戴夫给你的答案。我100%同意你对包装的使用。问题出在夸特斯和望远镜之间。Quartus不喜欢包,尤其是当您导入localparams而spyglass导入localparams时。为了满足两者,我唯一能做的就是包含。