여러 module이 같은 type이나 상수를 쓴다면 SystemVerilog package에 정의해 공유할 수 있다. package는 한 곳에 정의하고, 사용하는 파일이 그보다 뒤에 compile되도록 순서를 관리한다.
package 정의
package bus_types_pkg;
parameter int unsigned DATA_WIDTH = 8;
typedef logic [DATA_WIDTH-1:0] data_t;
endpackage
package 항목 사용
이름 충돌을 줄이려면 package scope를 명시하거나 필요한 type만 import한다.
module receiver (
input bus_types_pkg::data_t data_in
);
bus_types_pkg::data_t saved_data;
always_comb
saved_data = data_in;
endmodule
다른 선택은 module 안에서 필요한 항목만 가져오는 것이다.
module receiver;
import bus_types_pkg::data_t;
data_t saved_data;
endmodule
import bus_types_pkg::*;는 편하지만 어떤 이름이 어디서 왔는지 흐릴 수 있다. package 이름을 명시하거나 selective import를 우선한다.
compile order와 include 구분
package를 쓰는 파일은 package가 먼저 compile되어야 한다. 프로젝트의 source order나 simulator file list에 package 파일을 앞에 둔다.
package 파일을 여러 곳에서 무조건 `include 하면 같은 package가 중복 정의될 수 있다. include는 텍스트 삽입이고 compile order는 파일 의존 순서이므로, 프로젝트에서 package source를 한 번 등록하고 dependency를 정리한다.
확인 순서
- package 이름과 파일 이름을 팀 규칙에 맞춘다.
- package를 사용하는 모든 source보다 먼저 compile되는지 확인한다.
- import한 type과 상수가 의도한 package에서 온 것인지 확인한다.
- simulator와 synthesis tool의 SystemVerilog 설정을 확인한다.
공식 자료
원문 기록
한 줄 요약
공통 type과 상수는 package로 정의하고, scoped import와 compile order를 명시해 재사용성과 빌드 재현성을 함께 지킨다.