Menu
CoddyTech

모듈 인스턴스화

Coddy Verilog 여정의 기초 섹션에 포함된 레슨. 90개 중 33번째.

모듈 인스턴스화는 다른 모듈 안에 모듈의 복사본을 만드는 과정입니다. 이는 작은 구성 요소들을 서로 연결하여 더 큰 설계를 만드는 방법입니다.

모듈을 정의한 후에는 다른 모듈 안에서 사용할 수 있습니다. 이를 인스턴스화라고 합니다. 인스턴스화할 때마다 해당 모듈의 별도 인스턴스가 생성됩니다. 청사진을 사용해 같은 구성 요소의 여러 복사본을 만드는 것과 같다고 생각하면 됩니다.

기본 구문

module_name instance_name (connections);
부분의미
module_name인스턴스화할 모듈의 이름
instance_name이 복사본에 지정할 고유한 이름
connections모듈의 포트에 연결된 신호

간단한 예제

1단계: 모듈 정의하기

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

2단계: 다른 모듈에서 인스턴스화하기

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에 연결됩니다.

각 포트에 신호 하나씩 전달하세요. Verilog는 신호를 더 적게 전달하거나 괄호를 비워 두는 것도 허용하지만, 신호가 전달되지 않은 포트는 연결되지 않은 상태로 남아 설계의 어떤 부분에도 배선되지 않습니다. 모듈의 포트 수보다 많은 신호를 전달하면 오류가 발생합니다.

여러 인스턴스

같은 모듈의 복사본을 여러 개 만들 수 있습니다:

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)과 고유한 연결이 있습니다. 서로 독립적으로 작동합니다.

인스턴스화 중에 일어나는 일

  • 하드웨어의 복사본이 생성됩니다
  • 각 인스턴스에는 고유한 신호 집합이 있습니다
  • 인스턴스는 병렬로(동시에) 실행됩니다
  • 전달하는 신호에 따라 인스턴스가 설계의 나머지 부분과 연결되는 방식이 결정됩니다

인스턴스화 규칙

규칙이유
인스턴스 이름은 고유해야 합니다복사본을 구분하기 위해서입니다
모듈 이름이 존재해야 합니다다른 곳에서 정의되어 있어야 합니다
포트마다 신호 하나를 전달합니다신호가 없는 포트는 연결되지 않은 상태로 남고, 포트보다 신호가 많으면 오류가 발생합니다
연결 순서는 포트 순서와 일치해야 합니다첫 번째 신호는 첫 번째 포트에 연결되고, 나머지도 같은 방식으로 연결됩니다.
challenge icon

챌린지

or_gate 모듈을 인스턴스화하여 코드를 완성하세요.

해야 할 일:

  1. 인스턴스 이름을 or1로 지정하여 or_gate를 인스턴스화하세요.
  2. 신호를 올바른 순서로 전달하세요: input_a, input_b, output_y

직접 해보기

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: or_gate를 or1이라는 이름으로 인스턴스화하세요
  // 신호를 다음 순서로 전달하세요: input_a, input_b, output_y
  // .port(signal) 구문을 사용하지 마세요
  

endmodule
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨

직접 연습해 보세요: 온라인 Verilog 컴파일러