순서를 이용한 포트 매핑
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 35번째.
이전 레슨에서 여러분은 .port(signal)을 사용하여 각 연결을 명시적으로 레이블링하는 이름에 의한 포트 매핑(port mapping by name)에 대해 배웠습니다. 이제 대안적인 방법인 순서에 의한 포트 매핑(port mapping by order)에 대해 알아보겠습니다.
이 방식은 모듈 정의에 나타나는 순서에 따라 신호를 모듈의 포트에 연결합니다. 단순히 괄호 안에 신호들을 나열하면, Verilog가 이를 하나씩 차례대로 매칭합니다.
구문:
module_name instance_name (signal1, signal2, signal3);첫 번째 신호는 첫 번째 포트에 연결되고, 두 번째 신호는 두 번째 포트에 연결되는 방식 등으로 이어집니다.
예제
모듈 정의:
module or_gate (
input in1, // 첫 번째 포트
input in2, // 두 번째 포트
output result // 세 번째 포트
);
assign result = in1 | in2;
endmodule순서에 의한 포트 매핑을 사용한 인스턴스화:
or_gate or1 (input_a, input_b, output_y);이것은 다음과 같이 연결됩니다:
- 첫 번째 신호
input_a→ 첫 번째 포트in1 - 두 번째 신호
input_b→ 두 번째 포트in2 - 세 번째 신호
output_y→ 세 번째 포트result
순서가 중요합니다
순서에 의한 포트 매핑 시에는 순서가 매우 중요합니다:
// 올바른 순서
or_gate or1 (input_a, input_b, output_y);
// 잘못된 순서 - 신호가 잘못된 포트에 연결되었습니다!
or_gate or1 (input_b, input_a, output_y);
or_gate or1 (output_y, input_a, input_b);순서가 바뀌면 연결이 잘못된 포트로 연결됩니다. 코드가 언뜻 보기에는 올바르게 보이기 때문에 디버깅하기 어려울 수 있습니다.
이름에 의한 포트 매핑 vs 순서에 의한 포트 매핑
| 기능 | 이름에 의한 매핑 (By Name) | 순서에 의한 매핑 (By Order) |
|---|---|---|
| 구문 (Syntax) | .port(signal) | signal1, signal2 |
| 순서가 중요한가요? | 아니요 | 예 |
| 자기 문서화(Self-documenting)가 되나요? | 예 | 아니요 |
| 실수 위험 | 낮음 | 높음 |
| 권장 용도 | 대부분의 설계 | 단순한 경우에만 |
순서에 의한 포트 매핑을 사용하는 경우
순서에 의한 포트 매핑은 다음과 같은 경우에 허용됩니다:
- 모듈의 포트 수가 매우 적을 때 (2-3개)
- 포트 순서가 명확하고 변경될 가능성이 낮을 때
- 빠른 테스트벤치를 작성할 때
대부분의 설계에서, 이름에 의한 포트 매핑(port mapping by name)이 선호됩니다. 이는 더 명확하고 오류가 발생할 가능성이 적기 때문입니다.
챌린지
포트 매핑 순서를 사용하여 신호를 올바른 순서로 나열하여 인스턴스화를 완료하세요.
수행할 작업:
모듈 포트 (다음 순서대로):
input en(enable)input [7:0] d(data input)output [7:0] q(data output)
연결할 신호:
enable_signal→en에 연결data_input→d에 연결data_output→q에 연결
치트 시트
순서에 의한 포트 매핑(Port mapping by order)은 모듈의 포트 정의 순서와 일치하는 위치를 기반으로 신호를 연결합니다.
module_name instance_name (signal1, signal2, signal3);or_gate 모듈(포트: in1, in2, result)을 사용한 예시:
or_gate or1 (input_a, input_b, output_y);순서가 매우 중요합니다. 신호의 순서를 바꾸면 잘못된 연결이 발생하며, 이는 디버깅하기 매우 어렵습니다.
| 특징 | 이름에 의한 매핑 | 순서에 의한 매핑 |
|---|---|---|
| 구문 | .port(signal) | signal1, signal2 |
| 순서 중요 여부 | 아니요 | 예 |
| 실수 위험 | 낮음 | 높음 |
| 권장 용도 | 대부분의 설계 | 단순하거나 포트가 적은 경우에만 |
직접 해보기
module register (
input en,
input [7:0] d,
output [7:0] q
);
assign q = en ? d : q;
endmodule
module top (
input enable_signal,
input [7:0] data_input,
output [7:0] data_output
);
// TODO: 순서 매핑(ORDER mapping)을 사용하여 이름이 reg1인 register를 인스턴스화하세요
// 신호를 올바른 순서로 나열하세요: enable_signal, data_input, data_output
// .port(signal) 구문을 사용하지 마세요
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.