본문 바로가기

모듈내에 데이터 비트등을 선언할때 정의를 하도록 하려면 Parameter 방법을 이용해야 한다. Hard-fix 코드로 박아두면 항상 문제가 생기곤 했다. 귀찮아도 꼭 미리 해두자

 

Parameter 선언

인스턴스 생성시에 데이터 비트를 지정하게 하는 방법은

모듈을 만들때 아래처럼 파라메터 값을 받아 처리하도록 하는 것이다. C/C++ 코드의 생성자 함수내의 파라메터를 같은 개념이지

module <module_name> #(<parameter list>) <port_list>;
 

아래 예제는 여기서 가져왔다. 

https://docs.xilinx.com/r/en-US/ug901-vivado-synthesis/Parameters-Example-Verilog

module myreg (clk, clken, d, q);

    parameter SIZE = 1;
    input clk, clken;
    input [SIZE-1:0] d;
    output reg [SIZE-1:0] q;

    always @(posedge clk)
    begin
        if (clken)
	        q <= d;
    end

endmodule

module parameter_1 (clk, clken, di, do);

    parameter SIZE = 8;
    input clk, clken;
    input [SIZE-1:0] di;
    output [SIZE-1:0] do;

	myreg #8 inst_reg (clk, clken, di, do); 
    // parameter 생성하는 예제 위의 myreg 모듈에 SIZE 값을 8 주는 예제이다.
endmodule

 

Parameter and Generate-For Example

활용도가 높은 코드이다. 파라메터로 값을 받아서 원하는 수 만큼 같은 로직을 생성시키는 코드 예제이다.

module parameter_generate_for_1 (clk, si, so);

parameter SIZE = 8;

input clk;
input si;
output so;

reg [0:SIZE-1] s;

assign so = s[SIZE-1];

always @ (posedge clk)
	s[0] <= si;

genvar i;
generate
    for (i = 1; i < SIZE; i = i+1)
    begin : shreg
        always @ (posedge clk)
        begin
	        s[i] <= s[i-1];
        end
    end
endgenerate

endmodule

 

Parameter 사용법

예제는 이글에서 참고했다. 

https://lifelectronics.tistory.com/161 설명이 아주 자세하게 잘 되어 있다. 꼭 방문해 보시길~~

 

defparam을 이용해서 직접 C의 변수처럼 지정하는 방법이 있고,

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

 

혹은 생성할때, 순서로 지정을 하던, 이름을 가지고 직접 입력하던 아래 처럼 #() 를 이용해서 할당하는 방법이 있다.

//순서에 의한 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 그대로

 

좀 더 종합적으로 다 들어 있는 예제 코드는 아래를 보면 된다. 모든 경우를 다 넣어 둔듯 하다.

https://vlsiverify.com/system-verilog/systemverilog-parameters/

 

`define 도 써서, 적당하게 활용되는 예제가 잘 구성되어 있다. 

순서로 지정하기, 이름으로 지정하기, defparam으로 지정하기 전부 다 정의되어 있다. 

`define D_WIDTH 32
`define I_WIDTH 8

module tb_top;
  
  param_example p1(.data(2), .id(1)); // without passing parameter
  param_example #(4, 16) p2(.data(3), .id(2)); // constant parameter passing
  param_example #(`D_WIDTH, `I_WIDTH) p3(.data(6), .id(3));  // macro define based parameter passing
    
  param_example p4(.data(9), .id(4));
  // Change parameter value using defparam
  defparam p4.DATA_WIDTH = 10;
  defparam p4.ID_WIDTH = 16;
endmodule

 

이상 모듈 인스턴스 생성시에 변경될 수 있는 데이터 비트, 내부 모듈에 사용되는 상수값 들을 정의하는 parameter 에 대해 살펴봤다. 정리를 하면서 필요하면 계속 업데이트 할 생각이다. :)

 

유사 모듈 무한 생성 ㅋ 구글 딥마인드 관련 그림에서

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.