Menu
Coddy logo textTech

파라미터

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

동일한 모듈의 복사본을 여러 개 만들어 서로 다른 위치에서 사용할 수 있습니다. 이를 **다중 인스턴스(multiple instances)**라고 합니다. 동일한 코드를 반복해서 작성하는 대신, 한 번만 작성하고 필요한 만큼 재사용합니다. 각 인스턴스는 칩 상에 있는 해당 하드웨어의 개별적인 복사본입니다.

하지만 각 복사본이 서로 달라야 한다면 어떻게 해야 할까요? 예를 들어, 8비트 카운터 하나, 16비트 카운터 하나, 그리고 32비트 카운터 하나가 필요한 경우입니다. 매개변수(parameters)가 없다면, 세 개의 별도 모듈을 작성해야 할 것입니다.

매개변수가 이 문제를 해결합니다.

매개변수는 인스턴스를 생성할 때 설정할 수 있는 상수 값입니다. 이를 통해 모듈의 각 복사본을 다르게 설정할 수 있습니다.

매개변수 선언하기

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

#(parameter WIDTH = 8)은 기본값이 8인 WIDTH라는 이름의 파라미터를 정의합니다.

파라미터를 선언할 때, 모듈 이름 바로 뒤 그리고 포트 리스트 앞# 기호를 사용합니다. #은 Verilog에게 그 뒤에 오는 것이 모듈을 구성하는 파라미터 리스트임을 알려줍니다. 모듈에 파라미터가 없는 경우, #을 완전히 생략하면 됩니다.

파라미터 사용하기

파라미터는 상수가 필요한 곳 어디에서나 사용할 수 있습니다:

reg [WIDTH-1:0] data;        // 벡터 크기
count <= count + 1;           // 모든 너비에서 작동함
assign out = data[WIDTH-1];   // MSB 위치

파라미터 재정의

모듈을 사용할 때 파라미터 값을 변경할 수 있습니다:

// 기본 너비 (8비트)
counter u1 (.clk(clk), .reset(reset), .count(count1));

// 16비트로 재정의
counter #(.WIDTH(16)) u2 (.clk(clk), .reset(reset), .count(count2));

다중 파라미터

여러 개의 파라미터를 가질 수 있습니다:

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Localparam

localparam은 유사하지만 외부에서 재정의(override)할 수 없습니다:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // 이 값들은 이 모듈 내부에서 고정됩니다
endmodule

변경되지 않아야 하는 상수를 위해 localparam을 사용하세요.

challenge icon

챌린지

기본값이 4WIDTH라는 파라미터를 추가하세요.

수행할 작업:

  1. WIDTH라는 이름의 파라미터 추가
  2. 기본값을 4로 설정
  3. 파라미터는 모듈 이름 뒤의 #( ) 안에 위치합니다

치트 시트

매개변수(Parameters)를 사용하면 코드를 다시 작성하지 않고도 모듈 인스턴스를 다르게 구성할 수 있습니다.

매개변수 선언

module counter #(
  parameter WIDTH = 8  // 기본값
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

인스턴스화 시 매개변수 재정의(Overriding)

counter u1 (.clk(clk), .count(count1));          // 기본값(8) 사용
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2)); // 16으로 재정의됨

다중 매개변수

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)( ... );

Localparam (재정의 불가능한 상수)

localparam STATE_IDLE = 2'b00;
localparam STATE_RUN  = 2'b01;

모듈 외부에서 변경해서는 안 되는 내부 상수에는 localparam을 사용하세요.

직접 해보기

module counter #(
  // 여기에 기본값 4를 갖는 WIDTH 파라미터를 추가하세요
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz icon실력 점검

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

기초의 모든 레슨