파라미터는 모듈을 다른 사양으로 재사용할 수 있게 하는 Verilog 구조입니다. 예를 들어, 4비트 가산기는 비트 수 값을 받아들이도록 파라미터화할 수 있고, 모듈 인스턴스화 시 새로운 파라미터 값을 전달할 수 있습니다. 이렇게 N비트 가산기가 4비트, 8비트, 16비트 가산기가 될 수 있습니다. 이는 함수 호출 시 전달되는 함수 인자와 비슷합니다.
parameter MSB = 7; // MSB는 값 7을 가진 파라미터
parameter REAL = 4.5; // REAL은 실수를 가짐
parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // 두 파라미터 선언
parameter [7:0] f_const = 2'b3; // 2비트 값이 8비트로 변환됨: 8'b3
파라미터는 기본적으로 상수이므로 런타임에 값을 수정하는 것은 불법입니다. 넷, 변수, 다른 파라미터에서 이미 사용 중인 이름을 재선언하는 것도 불법입니다.
두 가지 주요 파라미터 유형인 모듈과 지정(specify)이 있으며, 둘 다 범위 사양을 받아들입니다. 하지만 보통 저장할 값에 필요한 만큼만 넓게 만들므로 범위 사양은 필요하지 않습니다.
모듈 파라미터 (Module Parameters)
모듈 파라미터는 모듈 내 파라미터 정의를 오버라이드하는 데 사용되며, 이로써 모듈이 컴파일 시 다른 파라미터 세트를 가지게 됩니다. 파라미터는 defparam 문이나 모듈 인스턴스 문장에서 수정할 수 있습니다. 파라미터 이름을 대문자로 하여 눈에 띄게 하는 것이 일반적입니다.
아래 모듈은 파라미터를 사용하여 버스 폭, 데이터 폭, FIFO 깊이를 지정하며, 모듈 인스턴스화 시나 defparam 문으로 새로운 값으로 오버라이드할 수 있습니다.
새로운 ANSI 스타일의 Verilog 포트 선언에서는 아래와 같이 파라미터를 선언할 수 있습니다.
module design_ip #(
parameter BUS_WIDTH=32,
parameter DATA_WIDTH=64
) (
input [BUS_WIDTH-1:0] addr,
// 다른 포트 선언들
);
파라미터 오버라이드
파라미터는 모듈 인스턴스화 시 새로운 값으로 오버라이드할 수 있습니다. 첫 번째 부분은 design_ip 모듈을 d0라는 이름으로 인스턴스화하며 새로운 파라미터를 #( ) 안에 전달합니다. 두 번째 부분은 defparam이라는 Verilog 구조를 사용하여 새로운 파라미터 값을 설정합니다. 첫 번째 방법이 RTL 설계에서 새 파라미터를 전달하는 가장 일반적인 방법입니다. 두 번째 방법은 모듈을 재인스턴스화하지 않고 테스트벤치 시뮬레이션에서 설계 파라미터를 빠르게 업데이트하는 데 주로 사용됩니다.
counter 모듈은 N과 DOWN 두 파라미터를 가지며 각각 기본값 2와 0을 가집니다. N은 출력의 비트 수를 제어하여 카운터 폭을 제어합니다. 기본적으로 2비트 카운터입니다. DOWN 파라미터는 카운터가 증가할지 감소할지 제어합니다. 기본적으로 0이므로 업카운터입니다.
2비트 업카운터
module counter #(
parameter N = 2,
parameter DOWN = 0
) (
input clk,
input rstn,
input en,
output reg [N-1:0] out
);
always @ (posedge clk) begin
if (!rstn) begin
out <= 0;
end else begin
if (en)
if (DOWN) out <= out - 1;
else out <= out + 1;
else out <= out;
end
end
endmodule
counter 모듈은 N을 2로 인스턴스화합니다(기본값이 2이므로 필수는 아님). DOWN은 인스턴스화 시 전달되지 않아 기본값 0을 가지며 업카운터가 됩니다.