Class 为什么编译面向对象的SystemVerilog代码这么慢?

Class 为什么编译面向对象的SystemVerilog代码这么慢?,class,compilation,system-verilog,Class,Compilation,System Verilog,为什么商业SystemVerilog编译器每次都必须重新编译所有内容?在这个问题中,我只是指不可合成的面向对象SystemVerilog代码 例如,许多项目都使用SystemVerilog。每次我编译时,我的模拟器都会解析并编译UVM库,包括95%的UVM库,这是我的模拟不需要的。为什么我不能准备一个预编译的版本,我可以用于每一个模拟 相比之下,其他语言不需要编译已经编译且未更改的代码。例如: C++编译.cpp文件一次,然后将它们链接到可执行文件中 Java将所有文件编译成.class文件,

为什么商业SystemVerilog编译器每次都必须重新编译所有内容?在这个问题中,我只是指不可合成的面向对象SystemVerilog代码

例如,许多项目都使用SystemVerilog。每次我编译时,我的模拟器都会解析并编译UVM库,包括95%的UVM库,这是我的模拟不需要的。为什么我不能准备一个预编译的版本,我可以用于每一个模拟

相比之下,其他语言不需要编译已经编译且未更改的代码。例如:

  • C++编译
    .cpp
    文件一次,然后将它们链接到可执行文件中
  • Java将所有文件编译成
    .class
    文件,这些文件在执行期间由类加载器动态加载

我使用的所有模拟器都提供了增量编译选项。这意味着,如果更改一个文件,则只会重新编译包含该文件的包以及导入该包的任何后续包/模块

其中一个Big3模拟器确实为您提供了一个可以直接使用的预编译版本的UVM(包括DPI)。问题是,它不是用“UVM\u NO\u不推荐”编译的。如果您想使用该定义,那么您可以选择使用增量编译(开关类似于-incr)自己编译它(包括DPI代码及其调试功能)


另一个我使用过的3大模拟器,默认情况下是增量编译。

编译C++文件时,必须显式选择不使用像Sub或Cube之类的东西重新编译未被修改的文件。我不知道GCC自己能做到这一点。不过,我不知道还有其他编译器。