산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog 파라미터 마스터하기: 재사용 가능하고 확장 가능한 모듈 구축

파라미터는 모듈을 다른 사양으로 재사용할 수 있게 하는 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 문으로 새로운 값으로 오버라이드할 수 있습니다.

// Verilog 1995 스타일 포트 선언
module design_ip (addr, wdata, write, sel, rdata);
  parameter BUS_WIDTH = 32, DATA_WIDTH = 64, FIFO_DEPTH = 512;
  input addr;
  input wdata;
  input write;
  input sel;
  output rdata;
  wire [BUS_WIDTH-1:0] addr;
  wire [DATA_WIDTH-1:0] wdata;
  reg [DATA_WIDTH-1:0] rdata;
  reg [7:0] fifo [FIFO_DEPTH];
  // 설계 코드 여기에 ...
endmodule

새로운 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 설계에서 새 파라미터를 전달하는 가장 일반적인 방법입니다. 두 번째 방법은 모듈을 재인스턴스화하지 않고 테스트벤치 시뮬레이션에서 설계 파라미터를 빠르게 업데이트하는 데 주로 사용됩니다.

module tb;
  // 모듈 인스턴스화 오버라이드
  design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [포트 리스트] );

  // defparam을 사용한 오버라이드
  defparam d0.FIFO_DEPTH = 128;
endmodule

예제

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을 가지며 업카운터가 됩니다.

module design_top (
  input clk,
  input rstn,
  input en,
  output [1:0] out
);
  counter #(.N(2)) u0 (
    .clk(clk),
    .rstn(rstn),
    .en(en)
  );
endmodule

기본 파라미터를 사용하여 N=2(2비트 카운터), DOWN=0(업카운터)로 구현됨을 볼 수 있습니다. 카운터 출력은 최상위 레벨에서 연결되지 않은 상태로 둡니다.

4비트 다운카운터

이 경우 counter 모듈은 N=4로 인스턴스화되어 4비트 카운터가 됩니다. DOWN에 1이 전달되어 다운카운터가 구현됩니다.

module design_top (
  input clk,
  input rstn,
  input en,
  output [3:0] out
);
  counter #(.N(4), .DOWN(1)) u1 (
    .clk(clk),
    .rstn(rstn),
    .en(en)
  );
endmodule

지정 파라미터 (Specify Parameters)

주로 타이밍과 지연 값을 제공하는 데 사용되며 specparam 키워드로 선언됩니다. specify 블록과 메인 모듈 본문 모두에서 사용할 수 있습니다.

// specify 블록 사용
specify
  specparam t_rise = 200, t_fall = 150;
  specparam clk_to_q = 70, d_to_q = 100;
endspecify

// 메인 모듈 내부
module my_block ( ... );
  specparam dhold = 2.0;
  specparam ddly = 1.5;
  parameter WIDTH = 32;
endmodule

지정 파라미터와 모듈 파라미터의 차이

지정 파라미터 모듈 파라미터
specparam으로 선언 parameter로 선언
specify 블록 내부나 메인 모듈에서 선언 가능 메인 모듈 내부에서만 선언 가능
specparam과 parameter를 할당받을 수 있음 specparam을 할당받을 수 없음
SDF로 값 오버라이드 가능 인스턴스 선언 파라미터 값이나 defparam으로 오버라이드 가능

verilog

  1. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  2. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  3. Verilog 핵심 요약: 모듈, 데이터 타입, 할당문 3분 만에 익히기
  4. Verilog 할당문 이해: 유형, 문법, 모범 사례
  5. Verilog 차단 vs 비차단 할당: 핵심 차이점 완벽 이해
  6. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  7. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  8. Verilog 계층적 참조 범위 마스터하기: 모듈과 블록 간 이름 충돌 방지
  9. Verilog 클럭 생성기: 설계 및 구현 가이드
  10. Verilog 수학 함수 마스터하기: 효율적인 하드웨어 설계를 위한 활용