logo

Verilog 매개변수

Verilog에서 매개변수는 상수이며 레지스터 또는 네트 데이터 유형과 같은 다른 데이터 유형에 속하지 않습니다.

상수 표현식은 상수 또는 이전에 정의된 매개변수를 나타냅니다. 런타임 시 매개변수 값을 수정할 수는 없지만 다음을 사용하여 매개변수 값을 수정할 수 있습니다. 데파람 성명.

그만큼 데파람 명령문은 컴파일 시에만 매개변수를 수정할 수 있습니다. 매개변수 값은 모듈 인스턴스화와 함께 # 지연 사양을 사용하여 수정할 수 있습니다.

~ 안에 Verilog , 모듈 인스턴스화 중에 모듈 매개변수 값을 재정의하는 두 가지 방법이 있습니다.

  1. defparam 키워드를 사용합니다.
  2. 그리고 모듈 인스턴스 매개변수 값 할당.

defparam 키워드 뒤에는 매개변수와 매개변수의 새 값에 대한 계층적 경로가 지정됩니다. 이 새 값은 상수 표현식이어야 합니다. 오른쪽 표현식이 매개변수를 참조하는 경우 defparam이 호출되는 모듈 내에서 선언되어야 합니다.

모듈 인스턴스 매개변수 값 할당 방법은 게이트 인스턴스에 지연을 할당하는 것처럼 보입니다. 이 메서드는 인스턴스화된 모듈 내의 매개 변수가 모듈에 나타나는 대로 재정의됩니다. 이 형식을 사용하면 매개변수를 건너뛸 수 없습니다.

상수 표현식에는 이전에 선언된 매개변수가 포함될 수 있습니다. 이전에 선언된 매개변수에서 변경사항이 감지되면 이 값에 의존하는 모든 매개변수가 자동으로 업데이트됩니다.

4비트 가산기는 비트 수에 대한 값을 허용하도록 매개변수화될 수 있으며, 모듈 인스턴스화 중에 새 매개변수 값이 전달될 수 있습니다. 따라서 N비트 가산기는 4비트, 8비트 또는 16비트 가산기로 변환됩니다. 이는 함수 호출 중에 전달되는 함수에 대한 인수와 같습니다.

 parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3 

매개변수에는 두 가지 유형이 있습니다. 기준 치수 그리고 지정하다 , 둘 다 범위 지정을 허용합니다. 다만, 저장하고자 하는 값만큼 넓게 만들어지기 때문에 범위 지정은 필요하지 않습니다.

모듈 매개변수

이는 모듈 내의 매개변수 정의를 재정의하는 데 사용될 수 있으며 컴파일 타임에 모듈이 다른 매개변수 세트를 갖도록 만듭니다. 매개변수는 다음을 사용하여 수정할 수 있습니다. 데파람 성명. 매개변수 이름에 대문자를 사용하여 즉시 알아차리는 것이 일반적입니다.

아래 모듈은 매개변수를 사용하여 디자인 내에서 버스 너비, 데이터 너비 및 FIFO 깊이를 지정하며, 모듈이 인스턴스화되거나 defparam 문을 사용하여 새 값으로 재정의될 수 있습니다.

 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, // other port declarations ); 

매개변수 재정의

모듈 인스턴스화 중에 매개변수를 새 값으로 재정의할 수 있습니다. 첫 번째 부분은 다음과 같은 모듈입니다. 디자인_ip 새 매개변수가 #( ) 내에서 전달되는 d0 이름으로.

두 번째 부분은 Verilog 구문을 사용하는 것입니다. 데파람 새 매개변수 값을 설정합니다. 첫 번째 방법은 일반적으로 RTL 설계에서 새로운 매개변수를 전달하는 데 사용됩니다. 두 번째 방법은 테스트벤치 시뮬레이션에서 모듈을 다시 인스턴스화할 필요 없이 설계 매개변수를 신속하게 업데이트하는 데 사용됩니다.

 module tb; // Module instantiation override design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]); // Use of defparam to override defparam d0.FIFO_DEPTH = 128; endmodule 

모듈 카운터에는 두 개의 매개변수가 있습니다. N 그리고 아래에 , 기본값은 2와 0으로 선언됩니다.

N 출력의 비트 수를 제어하여 카운터 너비를 효과적으로 제어합니다. 기본적으로 2비트 카운터입니다.

매개변수 아래에 카운터가 증가해야 하는지 감소해야 하는지를 제어합니다. 매개변수가 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) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> 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 </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>

기본 매개변수는 카운터를 구현하는 데 사용됩니다. N 2이므로 2비트 카운터가 됩니다. 아래에 0이므로 업 카운터가 됩니다. 카운터의 출력은 최상위 수준에서 연결되지 않은 상태로 유지됩니다.

Verilog 매개변수

4비트 다운 카운터

이 경우 모듈 카운터는 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 

Verilog 매개변수

매개변수 지정

이러한 매개변수는 시간 및 지연 값을 제공하는 데 사용되며 다음을 사용하여 선언됩니다. 스펙파라미터 예어. 지정된 블록과 기본 모듈 본체 내에서 모두 사용할 수 있습니다.

 // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule 

지정 매개변수와 모듈 매개변수의 차이점

매개변수 지정 모듈 매개변수
매개변수를 선언하는 specparam 키워드를 지정하십시오. 모듈 매개변수는 매개변수로 선언됩니다.
특정 블록 내부나 기본 모듈 내에서 선언할 수 있습니다. 기본 모듈 내에서만 선언할 수 있습니다.
이 매개변수에는 specparams 및 매개변수가 할당될 수 있습니다. 이는 사양 매개변수를 할당할 수 없습니다.
SDF를 사용하여 값을 재정의할 수 있습니다. 인스턴스 선언 매개변수 값 또는 defparam을 사용하여 재정의할 수 있습니다.

노트

다음은 Verilog 매개변수에 대한 몇 가지 중요한 참고 사항입니다.

  • 우리가 데파람 명령문에서는 매개변수에 대한 계층적 경로를 지정해야 합니다.
  • 매개변수는 건너뛸 수 없습니다. 모듈 인스턴스 매개변수 값 할당 . 이를 수행해야 하는 경우 덮어쓰지 않은 매개변수의 초기 값을 사용하십시오.
  • 한 매개변수가 다른 매개변수에 의존하는 경우 첫 번째 매개변수를 변경하면 두 번째 매개변수도 자동으로 업데이트됩니다.