Menu
Coddy logo textTech

이름을 이용한 포트 매핑

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

이전 레슨에서, 여러분은 모듈 정의에 포트가 나타나는 것과 동일한 순서로 신호를 전달하여 모듈을 인스턴스화하는 방법을 배웠습니다. 이 방식은 작동하지만, 한 가지 문제가 있습니다: 순서가 중요하다는 점입니다.

실수로 순서를 섞으면, 신호가 잘못된 포트에 연결됩니다. 이는 디버깅하기 어려울 수 있습니다.

순서 매핑의 문제점

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// 순서 매핑 - 순서가 반드시 일치해야 함
or_gate or1 (input_a, input_b, output_y);  // 올바름
or_gate or1 (input_b, input_a, output_y);  // 틀림! 입력이 서로 바뀜

두 번째 줄은 input_bin1에, input_ain2에 연결합니다. 이는 놓치기 쉬운 미묘한 버그입니다.

솔루션: 이름에 의한 포트 매핑

이름에 의한 포트 매핑은 연결을 설정하기 위해 포트 이름을 사용합니다. 각 연결에 명시적으로 레이블이 지정되어 있으므로 순서는 중요하지 않습니다.

구문:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

포트 이름 앞의 점 .은 모듈 내부의 포트를 참조하고 있음을 나타냅니다. 괄호 안의 신호는 해당 포트에 연결하는 신호입니다.

예제

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

이것은 명시적으로 다음과 같이 말합니다:

  • 포트 in1은 신호 input_a를 받습니다
  • 포트 in2는 신호 input_b를 받습니다
  • 포트 result는 신호 output_y를 받습니다

순서는 중요하지 않습니다

이름에 의한 포트 매핑을 사용하면, 어떤 순서로든 연결을 작성할 수 있습니다:

// 세 가지 모두 동일합니다

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

or_gate or1 (
  .result(output_y),
  .in1(input_a),
  .in2(input_b)
);

or_gate or1 (
  .in2(input_b),
  .result(output_y),
  .in1(input_a)
);

각 연결에 레이블이 지정되어 있기 때문에 모두 정확히 동일한 작업을 수행합니다.

challenge icon

챌린지

이름에 의한 포트 매핑(port mapping by name)을 사용하여 누락된 포트 연결을 추가함으로써 인스턴스화를 완료하세요.

수행할 작업:

  1. clk 포트를 clock_signal 신호에 연결합니다.
  2. data_in 포트를 input_data 신호에 연결합니다.
  3. data_out 포트를 output_data 신호에 연결합니다.

치트 시트

이름에 의한 포트 매핑은 .port_name(signal) 구문을 사용하며, 순서가 중요하지 않습니다:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

예제:

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

포트 이름 앞의 .은 모듈 내부의 포트를 가리키며, 괄호 안의 신호는 그 포트에 연결되는 신호입니다. 순서에 의한 매핑과 달리, 연결을 어떤 순서로든 나열할 수 있어 버그를 유발하지 않습니다.

직접 해보기

module register (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out
);
  always @(posedge clk) begin
    data_out <= data_in;
  end
endmodule

module top (
  input clock_signal,
  input [7:0] input_data,
  output [7:0] output_data
);
  
  register reg1 (
    // TODO: .port(signal) 구문을 사용하여 포트 매핑을 추가하세요
  );
  
endmodule
quiz icon실력 점검

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

기초의 모든 레슨