В 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);
Теперь у вас есть пакет, импортированный в область видимости модуля, и пусть объявления портов также видят этот импорт.