모듈 인스턴스화
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 33번째.
모듈 인스턴스화(Module instantiation)는 다른 모듈 내부에 모듈의 복사본을 생성하는 과정입니다. 이는 작은 컴포넌트들을 함께 연결하여 더 큰 설계를 구축하는 방법입니다.
모듈을 정의하고 나면, 다른 모듈 내부에서 그것을 사용할 수 있습니다. 이것을 인스턴스화라고 합니다. 각 인스턴스화는 해당 모듈의 별도 인스턴스를 생성합니다. 동일한 컴포넌트의 복사본을 여러 개 만들기 위해 설계도를 사용하는 것과 같다고 생각하면 됩니다.
기본 구문
module_name instance_name (connections);| 항목 | 의미 |
|---|---|
module_name | 인스턴스화할 모듈의 이름 |
instance_name | 이 복사본의 고유 이름 |
connections | 모듈의 포트에 연결된 신호들 |
간단한 예제
1단계: 모듈 정의하기
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule2단계: 다른 모듈에서 인스턴스화하기
module top (
input x,
input y,
output z
);
and_gate gate1 (x, y, z);
endmodule이 코드에서 일어나는 일은 다음과 같습니다:
and_gate— 사용하려는 모듈의 이름 (어딘가에 존재해야 함)gate1— 이 특정 인스턴스에 부여하는 고유한 이름(x, y, z)— 모듈의 포트에 연결하는 신호 (모듈 정의에 나타나는 순서와 동일해야 함)
첫 번째 신호 x는 첫 번째 포트 a에 연결됩니다. 두 번째 신호 y는 두 번째 포트 b에 연결됩니다. 세 번째 신호 z는 세 번째 포트 c에 연결됩니다.
모듈에 신호를 전달해야 합니다. 괄호는 비워둘 수 없습니다. 신호의 수는 포트의 수와 일치해야 합니다.
다중 인스턴스
동일한 모듈의 복사본을 여러 개 생성할 수 있습니다:
module top;
wire out1, out2;
wire sig1, sig2, sig3, sig4;
and_gate gate1 (sig1, sig2, out1);
and_gate gate2 (sig3, sig4, out2);
endmodule각 인스턴스는 고유한 이름(gate1, gate2)과 고유한 연결을 가집니다. 이들은 독립적으로 작동합니다.
인스턴스화 중에 일어나는 일
- 하드웨어의 복사본이 생성됩니다
- 각 인스턴스는 자체 신호 집합을 가집니다
- 인스턴스는 병렬로 (동시에) 실행됩니다
- 전달하는 신호는 인스턴스가 디자인의 나머지 부분과 연결되는 방식을 결정합니다.
인스턴스화 규칙
| 규칙 | 이유 |
|---|---|
| 인스턴스 이름은 고유해야 합니다 | 복사본들을 구별하기 위해 |
| 모듈 이름이 존재해야 합니다 | 다른 곳에서 정의되어야 합니다 |
| 연결의 수는 포트의 수와 일치해야 합니다 | 그렇지 않으면 Verilog는 무엇이 어디에 연결되는지 알 수 없습니다 |
| 연결 순서는 포트 순서와 일치해야 합니다 | 첫 번째 신호는 첫 번째 포트에 연결되는 식입니다 |
챌린지
or_gate 모듈을 인스턴스화하여 코드를 완성하세요.
수행할 작업:
- 인스턴스 이름
or1으로or_gate를 인스턴스화하세요 - 신호를 올바른 순서로 전달하세요:
input_a,input_b,output_y
치트 시트
모듈 인스턴스화는 한 모듈 내부에 다른 모듈의 복사본을 생성합니다:
module_name instance_name (connections);예시:
module and_gate (input a, input b, output c);
assign c = a & b;
endmodule
module top (input x, input y, output z);
and_gate gate1 (x, y, z); // x→a, y→b, z→c
endmodule규칙:
- 인스턴스 이름은 고유해야 합니다
- 연결의 수는 포트의 수와 일치해야 합니다
- 연결 순서는 포트 정의 순서와 일치해야 합니다
- 여러 인스턴스는 병렬로 실행되며, 각각 고유한 신호를 가집니다
직접 해보기
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
module top (
input input_a,
input input_b,
output output_y
);
// TODO: or1이라는 이름으로 or_gate 인스턴스화
// 신호를 input_a, input_b, output_y 순서대로 전달
// .port(signal) 구문을 사용하지 마세요
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.