1

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

1) 在编译单元范围内

import mypkg::*;
module my_module(
  port_declaration
  ...

2) 在模块头

module my_module
import mypkg::*;
(
  port_declaration
  ...

以上所有情况都没有编译错误。我预计,通过 1) 方式,当有另一个文件在其编译单元范围内导入 mypkg 时,它可能会导致重复导入警告或错误,但没有。

他们之间有什么区别吗?

4

1 回答 1

1

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

import pkg::* before模块声明将把包的所有定义拉到全局范围内。这意味着在此文件中或在命令行上跟随您的文件的其他文件中定义的所有模块都将知道此导入。例如

 import pkg::abc_t;
 modle top;
    abc_t a;
    ...
 endmodule
 module child;
    abc_t b;
    ...
 endmodule 

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

 modle top;
    import pkg::abc_t;
    abc_t a;
    ...
 endmodule
 module child;
    abc_t b; << error, not visible, needs import first
    ...
 endmodule 

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

  import pkg::*;
  module top(input abc_t abc);

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

module top
import pkg::*;
(input abc_t abc);

现在您已经在模块范围内导入了包,并让端口声明也看到了这个导入。

于 2019-09-30T10:45:40.550 回答