在verilog中,编译单元范围内的导入包和模块头之间有什么区别吗?

Yun*_* Mo 6 import verilog compilation package

在verilog中,编译单元范围(1)和模块头(2)的导入包之间有什么区别吗?

1) 在编译单元范围

import mypkg::*;
module my_module(
  port_declaration
  ...
Run Code Online (Sandbox Code Playgroud)

2) 在模块头

module my_module
import mypkg::*;
(
  port_declaration
  ...
Run Code Online (Sandbox Code Playgroud)

上述所有情况都没有编译错误。我预计,使用 1) 方式,当有另一个文件在其编译单元范围内导入 mypkg 时,可能会导致重复导入警告或错误,但事实并非如此。

他们之间有什么区别吗?

Ser*_*rge 7

两者verilog都会导致编译错误,所以没有区别:-)。范围界定存在System Verilog差异。

beforeimport pkg::* 模块声明将在全局范围内提取包的所有定义。这意味着此文件中或在命令行上跟随您的文件的其他文件中定义的所有模块都将了解此导入。例如:

 import pkg::abc_t;
 module top;
    abc_t a;
    ...
 endmodule
 module child;
    abc_t b;
    ...
 endmodule 
Run Code Online (Sandbox Code Playgroud)

在模块内部导入只会将包内容拉入此模块范围:

 module top;
    import pkg::abc_t;
    abc_t a;
    ...
 endmodule
 module child;
    abc_t b; << error, not visible, needs import first
    ...
 endmodule 
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但是如果模块端口使用该包怎么办?第一种情况没有问题:

  import pkg::*;
  module top(input abc_t abc);
Run Code Online (Sandbox Code Playgroud)

但在全球范围内导入通常是一件坏事,这可能会导致大型项目出现问题。解决方案是在模块头中使用 import。

module top
import pkg::*;
(input abc_t abc);
Run Code Online (Sandbox Code Playgroud)

现在,您已将包导入到模块范围中,并让端口声明也可以看到此导入。