본문 바로가기
Language/Verilog & SV

[Verilog] Parameter

by VIR&US 2023. 7. 19.
반응형

목차

    Parameter

    Verilog HDL의 Parameter는 variable이나 net에 속하지 않습니다. 상수입니다.

    Parameter의 두 가지 타입

    • module parameter, witg localparam
    • specify parameters(specparams)

    parameter : 기본적으로 모듈 내에서 상수값을 특정 문자열에 mapping

    defparam : 모듈밖에서 parameter값을 재정의(혹은 override) 할 때 사용

    localparam : 모듈내에서 localparam으로 선언하면 모듈밖에서 바꿀 수 없음

    Specpara : parameter와 비슷하지만 특정 블록 내에서만 사용됩니다.

    Parameter example

    module vdff 
      	#(parameter size = 5, parameter delay = 1) (
            input [0:size-1] in,
            input clk,
            output reg[0:size-1] out);
    
      	always @(posedge clk) begin
            	#delay out = in;
      	end
    
    endmodule
    
    module top;
            reg  		clk;
            wire [0:4] 	out_c, in_c;
            wire [1:10]     out_a, in_a;
            wire [1:5] 	out_b, in_b;
    
            // create an instance and set parameters
      	vdff #(10,15) mod_a (
            	.out(out_a), 
              	.in(in_a), 
              	.clk(clk));
    
            // create an instance leaving default values
            vdff mod_b(
    		.out(out_b),
    		.in(in_b), 
    		.clk(clk));
    
            // create an instance and set one parameter
            vdff #(.delay(12)) mod_c(
    		.out(out_c),
    		.in(in_c), 
    		.clk(clk));
    
    endmodule
    

    localparam

    • parameter와 비슷하지만 local parameter는 module instance parameter 할당으로 수정할 수 없습니다.
    • local parameter는 defparam 문이나 module instance parameter 할당으로 수정할 수 있는 parameter를 포함하는 상수 표현식을 할당할 수 있습니다.

    Local Parameter example

    module generic_fifo
    	//ANSI-C 2001
            #(parameter MSB=3, LSB=0, DEPTH=4) (
            input [MSB:LSB] in,
            input clk, read, write, reset,
            output [MSB:LSB] out,
            output full, empty );
    
     
            // These parameters are local, and cannot be overridden.
            // They can be affected by altering the public parameters
            // above, that is to change indirectly.
            localparam FIFO_MSB = DEPTH*MSB;
            localparam FIFO_LSB = LSB;
            
    	reg [FIFO_MSB:FIFO_LSB] fifo;
            reg [LOG2(DEPTH):0] depth;
    
            always @(posedge clk or reset) begin
                   casex ({read,write,reset})
                   // implementation of fifo
                   // implementation of fifo
                   endcase	
            end
    
    endmodule
    

    Defparam

    • defparam을 사용하면 parameter의 hierarchical name을 사용하여 설계 전반에 걸쳐 모든 module instance에서 parameter의 값을 변경할 수 있습니다.
    • defparam은 parameter 값 할당을 하나의 module로 그룹화 하는데 특히 유용합니다. 그러나 instance 배열 아래 hierarchical 구조의 값은 변경할 수 없습니다.
    • 단일 parameter에 대해 여러 defparam이 있는 경우 마지막 defparam 문의 값을 사용합니다.
    • defparam이 parameter를 수정할 수 있기에 System Verilog compiler는 모든 설계 파일이 compile 되기 전에 instance의 최종 parameter 값을 확인할 수 없습니다. 그래서 defparam의 사용은 System Verilog에서 추천하지 않습니다.

    Definition Parameter example

    module top;
            reg clk;
            reg [0:4] in1;
            reg [0:9] in2;
            wire [0:4] o1;
            wire [0:9] o2;
    
            vdff m1 (
    	.out(o1), 
    	.in(in1), 
    	.clk(clk));
    
            vdff m2 (
    	.out(o2),
    	.in(in2), 
    	.clk(clk));
    
    endmodule
    
     
    
    module vdff 
            #(parameter size = 1, delay = 1) (
            input [0:size-1] in,
            input clk,
            output reg [0:size-1] out);
            
    	always @(posedge clk) begin
                   # delay out = in;
    	end
    
    endmodule
    
     
    module annotate;
            defparam
            top.m1.size = 5,
            top.m1.delay = 10,
            top.m2.size = 10,
            top.m2.delay = 20;
    
    endmodule
    

    Specparam

    • Specparam 은 매개변수와 비슷하지만 특정 블록 내에서만 사용됩니다.
    • 상수 표현식은 정수, 실수, 지연 또는 인용 문자열일 수 있습니다.
    • specparam은 defparam 을 사용하거나 모듈 인스턴스화에서 #을 사용 하여 재정의할 수 없습니다.

    Specparam example

    specparam parameter_name = constant_expression;
    
    [Example]
    specparam TRise = 1.2;
    specparam T1 = 2:3:4; // min:typ:max 
    
    728x90
    반응형

    'Language > Verilog & SV' 카테고리의 다른 글

    [Verilog] Clock generator  (0) 2023.07.20
    [Verilog] Blocking(=) vs Nonblocking(<=)  (0) 2023.07.19
    [System Verilog] 'break' and 'continue'  (0) 2023.07.19
    [Verilog] D F/F  (0) 2023.07.19
    [Verilog] Ram Model example Code  (0) 2023.07.06