3 / 37 · 개념
모듈·포트·인스턴스: 연결을 계약으로 읽기
이름 기반 포트 연결, 하나의 구동자와 계층 경계를 확인하며 조합 모듈을 연결합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
모듈 경계와 클록 경계는 다릅니다
모듈은 포트와 내부 논리를 묶습니다. 새 인스턴스를 만든다고 레지스터나 한 사이클의 지연이 자동으로 추가되지 않습니다. 직렬로 연결한 조합 모듈 두 개는 여전히 조합 경로이며 물리적인 지연은 더해집니다. 클록 레지스터를 명시해야 저장 경계가 생깁니다.
포트 계약에는 방향·폭·부호·구동자·유효 시점을 적으세요. 다음 이름은 입력 목록의 위치를 외우지 않아도 어느 입력을 선택하는지 알려줍니다.
module select_word #(parameter integer W = 8) (
input logic [W-1:0] a, b,
input logic select_b,
output logic [W-1:0] y
);
assign y = select_b ? b : a;
endmodule
module choose_and_increment (
input logic [7:0] a, b,
input logic select_b,
output logic [8:0] result
);
logic [7:0] chosen;
select_word #(.W(8)) select_u (
.a(a), .b(b), .select_b(select_b), .y(chosen)
);
assign result = {1'b0, chosen} + 9'd1;
endmoduleselect_word는 모듈 타입이고 select_u는 인스턴스 이름입니다. .a(a)는 자식의 a 포트를 부모의 a 신호에 연결합니다. .W(8)은 설계를 elaboration할 때 정하는 매개변수 변경이며 실행 중 포트로 전달하는 값이 아닙니다.
연결의 양쪽을 모두 확인합니다
chosen의 구동자는 자식의 y 출력 하나입니다. 부모는 이를 읽습니다. 부모의 다른 프로시저에서도 chosen에 대입하면 안 됩니다. logic 선언이 서로 충돌하는 구동자를 허용해 주지는 않습니다.
255에 1을 더하면 256이므로 result는 9비트입니다. 연결 연산으로 chosen을 확장한 뒤 더합니다. a=255, b=9, select_b=0이면 result=256이고, select_b=1이면 10입니다. result를 8비트로 줄이면 첫 결과의 carry를 잃습니다.
계층·파일·top 선택
두 모듈 정의는 같은 파일이나 별도 파일에 둘 수 있습니다. 컴파일러에 둘 다 전달해야 합니다. 선택할 top은 choose_and_increment입니다. select_word를 top으로 선택하면 다른 설계 경계를 검사하는 것입니다. 자식 모듈 파일이 빠진 것은 소스 목록의 오류이며 포트 논리 오류의 증거가 아닙니다.
교육과 재사용 설계에서는 이름 기반 연결을 권합니다. 위치 기반 연결은 포트 목록을 수정할 때 의미가 조용히 바뀔 수 있습니다. 연결하지 않은 입력은 의도적인 0이 아닙니다. 상수를 명시적으로 연결하거나 사용하지 않는 출력을 문서화하고 도구 진단을 확인하세요.
조합 출력이 저장소자 없이 경로를 돌아 자신의 입력을 구동하는 피드백 루프를 피하세요. 계층을 따라 신호의 화살표를 추적하는 것도 설계 점검입니다. 모듈 경계만으로 이런 루프가 끊어지지는 않습니다.
실습 · 연결 결과를 독립적으로 검증하기
(a,b,select_b)=(0,255,0), (0,255,1), (255,0,0), (255,0,1)을 검사하세요. result의 기대값은 각각 1, 256, 256, 1입니다. 다음에는 두 select 값 각각에서 선택된 입력의 256가지 값을 모두 검사합니다. 선택되지 않은 입력은 다르게 두어 두 입력이 같아서 잘못된 선택을 가리는 일이 없게 하세요.
참조 모델에서는 a 또는 b의 정수값을 고르고 1을 더한 뒤 조합 경로가 안정된 시점에 9비트 result와 비교합니다. DUT 내부 chosen을 참조값으로 읽으면 자식의 잘못된 선택을 검사기와 공유하여 놓칠 수 있습니다.
마지막으로 출력 레지스터를 추가해 보세요. 리셋이 동기식인지, result가 언제 유효해지는지, 출력이 어느 입력 에지에 해당하는지 명세합니다. 레지스터를 추가하면 산술이 같아도 인터페이스의 시간 계약이 바뀝니다.