“多动脑,多思考” !!!!
笔者,作为ASIC 验证人员,虽然工作年限不多,经历了3家公司的TB验证环境。一直悬在心里的一个疑问就是:为什么 在TB验证文件中,发现多次`include "uvm_macros.svh"该行代码?
追查了一下uvm_pkg::* 这个package . 源代码如下:
我们发现,uvm_pkg.sv中,已经包含了 如下行:
`include "uvm_macros.svh"
既然,uvm_pkg.sv中已经包含了 上面一行,为什么我们还要自己手动去添加呢?
一下文章,均snapshot from 某个论坛
继续追问:
【解答1】:
宏不能通过包提供。当你需要的时候,你必须阅读相应的定义。
【解答2】
像'定义宏这样的编译器指令不存在于任何作用域中,比如包。在识别任何SystemVerilog语法之前都要进行处理。它们只在当前代码单元(编译单元)被编译时存在。
因此,问题的答案取决于uvm_pkg是否被编译为一个单独的编译单元的一部分,从代码中导入uvm_pkg。
通常人们对uvm_pkg使用预编译的库,所以你需要同时进行导入和包含。
对于另一种情况,当所有内容都被编译为一个单独的编译单元时,如果你重复' include '并不重要,因为在uvm_宏中有编译守卫。防止重定义警告的SVH文件。
所以你可以在这两种情况下都包含,只是为了让你的代码更具适应性。
【追问】
【回答】
我将重复:至于' include ' uvm_macros.svh”出现在uvm_pkg内部或者外部。重要的是,宏必须在编译单元中定义,然后才能在同一编译单元中使用。您可以假定编译器预处理文本宏和编译器指令不知道SystemVerilog语法。
SystemVerilog允许使用多种不同的方法来编译单元。出现在编译器命令行上的每个文件可以是一个单独的编译单元;或者您可以在多个编译单元的命令行中拥有一组文件,或者您可以在一个编译单元中拥有所有文件。对于允许多个编译步骤的工具,每个步骤可以是一个单独的编译单元。
在所有这些情况下,任何被包含的文件都与带有“Include”语句的文件是同一编译单元的一部分。
至此,我们是不是有所感悟了。哈哈,别慌,下节课,我们动手用实际例子来验证一下~~~
其它useful links:
https://verificationacademy.com/forums/uvm/necessity-writing-include-uvmmacros.svh
https://blogs.sw.siemens.com/verificationhorizons/2010/07/13/package-import-versus-include/