Verilog 모듈 인스턴스화 마스터: 순서·이름 기반 연결, 미연결 포트 처리
복잡한 설계는 여러 모듈을 계층적으로 통합해 만듭니다. 모듈 인스턴스화 시 포트 연결은 순서 기반(Ordered)과 이름 기반(Named) 두 가지 방식이 있습니다.
1. 순서 기반 연결 (Ordered List)
포트 리스트 순서대로 매핑. 설계 모듈의 포트 순서를 알아야 하며, 포트 추가/순서 변경 시 연결이 깨지기 쉽습니다.
module mydesign (input x, y, z, output o); endmodule
module tb_top;
wire [1:0] a; wire b, c;
mydesign d0 (a[0], b, a[1], c); // 위치: 1→x, 2→y, 3→z, 4→o
endmodule
포트 순서 변경이나 추가는 치명적 버그 유발. 대규모 설계에서 비추천.
2. 이름 기반 연결 (Named Connection) — 강력 권장
.포트명(신호명) 형식으로 명시적 매핑. 순서 무관, 가독성·유지보수성 우수.
module design_top;
wire [1:0] a; wire b, c;
mydesign d0 (
.x (a[0]),
.y (b),
.z (a[1]),
.o (c)
);
endmodule
- 각 포트 연결을 별도 줄에 작성 → 컴파일 에러 라인 번호로 즉시 식별 가능
- 동일 포트 중복 연결 불가 (
.x(a[0]), .x(b) → 에러)
미연결/플로팅 포트 (Unconnected/Floating Ports)
연결하지 않은 포트는 고임피던스(Hi-Z, z) 상태가 됩니다.
module design_top;
mydesign d0 (
.x (a[0]),
.y (a[1]),
.z (a[1]),
.o () // 출력 o 미연결 → 상위 모듈의 연결 넷은 Z
);
endmodule
시프트 레지스터 예제에서 출력 미연결
module shift_reg (input d, clk, rstn, output q);
wire [2:0] q_net;
dff u0 (.d(d), .clk(clk), .rstn(rstn), .q(q_net[0]));
dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q()); // q 플로팅
dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q()); // q 플로팅
dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q));
endmodule
- 합성 후 RTL 회로도에서 u1, u2의 출력 핀이 열린 상태로 표시
- u2, u3의 입력이 구동되지 않는 넷에 연결되어 접지(GND) 처리됨
- 시뮬레이션 파형에서 미연결 출력은 주황색 수직선(Hi-Z)으로 표시
포트 타입과 연결 규칙 요약
| 케이스 | 코드 | 결과 |
| 입력은 암시적 wire | module m(input clk); | OK (wire 생략 가능) |
| 입력에 reg 선언 | module m(input reg clk); | 불법: input은 reg 불가 |
| 출력 폭 > 입력 폭 연결 | output [3:0] data; input [7:0] data; | 상위 4비트 미구동 (무시) |
| 출력 포트를 상위 reg에 연결 | reg [3:0] r; des2(.data(r)); | 불법: output은 reg에 연결 불가 |
베스트 프랙티스 체크리스트
- 항상 이름 기반 연결 사용
- 포트당 한 줄씩 작성
- 미연결 포트는 의도적임을 주석으로 명시 (
// intentionally floating)
- 입력/인아웃은
wire (또는 넷 타입), 출력은 용도에 따라 wire/reg 선택
- 포트 폭 일치 확인 (Lint 도구 활용 권장)