#12. Verilog 구조적 모델링-(2), 모듈 parameter/deparam문

Verilog/Verilog HDL강의정리(KOCW) 2023. 8. 9. 22:49
반응형

이번 글에서는 지난 글에서 이어서 구조적 모델링에 대해서 계속해서 알아보도록 하겠다. 이번 글에서는 parameter에 대해서 소개할 텐데, parameter은 SW에서 변수 역할을 하는 것과 비슷하다고 생각하면 되겠다. 회로 합성에 영향을 미치지 않지만, 코드 속에서 일정한 값을 배정받아 사용할 수 있도록 하는 것이다. parameter은 variable, net 범주에 속하지 않고, 모듈이 인스턴스 될때마다 값을 변경시킬 수 있다. 보통 비트수를 parameter로 선언하면, 어떤 기능을 하는 모듈을 만들때, 비트수를 자유롭게 조절해서 만들 수 있다는 장점이 있다. 예를 들어 가산기가 있다면, parameter 조절을 통해 1비트 가산기 혹은 4비트 가산기, 24비트 가산기 등등 를 자유자재로 parameter을 바꾼것으로만으로도 구성할 수 있다는 것이다.  C언어에서의 define 문과도 비슷하다고 생각할 수 있겠다.  먼저 문법에 대해서 알아보도록 하자.


1. parameter/defparam

parameter문을 사용하는 방법은 간단하다.

parameter size=1, delay=1;

이렇게 선언하면 size=1, delay=1 이라는 변수를 할당하게 된 것이며, 이 변수명은 자유자재로 사용할 수 있다.

module vdff(out, in, clk);
    parameter size = 1, delay = 1; //parameter선언
    input [0:size-1] in; //input 선언, 비트수 size만큼 선언
    input clk;
    output [0:size-1] out; //output 선언
    reg [0:size-1] out;
    
    always@(posedge clk)
        # delay out = in; //1만큼 delay 후 out에 in을 할당
endmodule

간단한 플립플롭을 설계하였다. delay로 1ns을 주어 always문을 구성하였다.  그런데 여기서 top 모듈을 구성한다고 생각해보자.

module top (clk, in1, in2, o1, o2);
    input clk; //input 선언
    input [0:4] in1;
    input [0:9] in2;
    output [0:4] o1;
    output [0:9] o2;
    
    annotate U0 (); //annotate 모듈 인스턴스, 입출력 없음
    
    vdff m1(o1, in1, clk); //만들어두었던 vdff 모듈 인스턴스
    vdff m2(o2, in2, clk);
endmodule

top 모듈에서는 만들어두었던 모듈들을 instance하게 되는데, 여기서 vdff의 경우 포트 지정을 하여 신호를 연결하였고, annotate 모듈을 하나 인스턴스 하였다. 그럼 여기서 annotate 모듈을 살펴보자

module annotate;
    defparam
        top.m1.size=5, //defparam을 통해 m1 모듈의 size 파라미터를 변경한다.
        top.m1.delay=10, //m1 모듈의 delay 파라미터를 변경한다.
        top.m2.size=10,
        top.m2.delay=20;
endmodule

이렇게 defparam 문을 활용하면 top.m1.size 이렇게 접근하여 값을 바꿀 수 있다. 즉, 계층적으로 모듈에 접근이 가능하다.

1-1. "#" 을 활용한 parameter 바꾸기

#기호를 활용하여 parameter값을 바꿀 수도 있다.

앞에서 만든 vdff를 인스턴스 하며 parameter 값을 바꾸는 방법으로 다음 예시를 보자

//순서에 의한 parameter 값 변경
vdff #(10,15) mod_a(out_a, in_a, clk); // vdff 를 mod_a라는 이름으로 인스턴스하며
                                       // size = 10, delay=15로 바꿈
//이름에 의한 parameter 값 변경
vdff #(.delay(12)) mod_c(out_c, in_c, clk); //delay가 12로 바뀜 size는 5 그대로

이렇게 순서에 의해 혹은 이름에 의해 parameter 값을 바꿀 수 있으니 참고하도록 하자

 

 

반응형