В verilog, есть ли разница между пакетом импорта в области блока компиляции и заголовком модуля? - PullRequest
1 голос
/ 30 сентября 2019

В verilog, есть ли разница между пакетом импорта в области блока компиляции (1) и заголовком модуля (2)?

1) в области блока компиляции

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

2)в заголовке модуля

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

Нет ошибки компиляции для всех вышеперечисленных случаев. Я ожидал, что с 1) способом это может вызвать дублированное предупреждение или ошибку импорта, когда был другой файл, который импортирует mypkg в области видимости его модуля компиляции, но не было.

Есть ли разница между ними?

1 Ответ

1 голос
/ 30 сентября 2019

В 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);

Теперь у вас есть пакет, импортированный в область видимости модуля, и пусть объявления портов также видят этот импорт.

...