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

Verilog `ifdef 조건부 컴파일

Verilog는 본질적으로 컴파일러가 특정 방식으로 코드를 처리하도록 지시하는 몇 가지 컴파일러 지시문을 지원합니다. 예를 들어, 코드의 일부는 특정 기능의 구현을 나타낼 수 있으며 기능이 사용되지 않는 경우 디자인에 코드를 포함하지 않는 방법이 있어야 합니다.

이것은 조건부로 해결할 수 있습니다. 디자이너가 컴파일러 지시문 내에서 코드를 래핑할 수 있는 컴파일에서 지정된 명명된 플래그가 설정될 때 컴파일을 위해 코드를 포함하거나 제외하도록 컴파일러에 지시합니다.

구문

Verilog `ifdef을 사용하여 조건부 컴파일을 수행할 수 있습니다. 및 `ifndef 키워드. 이러한 키워드는 디자인의 어느 곳에나 나타날 수 있으며 다른 키워드 안에 중첩될 수 있습니다.

키워드 `ifdef 다음 `else까지 코드 조각을 포함하도록 컴파일러에 지시합니다. 또는 `endif FLAG라는 매크로가 `define을 사용하여 정의된 경우 지시.

  
  
// Style #1: Only single `ifdef
`ifdef <FLAG>
	// Statements
`endif

// Style #2: `ifdef with `else part
`ifdef <FLAG>
	// Statements
`else
	// Statements
`endif

// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
	// Statements
`elsif <FLAG2>
	// Statements
`elsif <FLAG3>
	// Statements
`else
	// Statements
`endif

  

키워드 `ifndef 다음 `else까지 코드 조각을 포함하도록 컴파일러에 지시합니다. 또는 `endif FLAG라는 지정된 매크로가 not인 경우 `define을 사용하여 정의 지시.

'ifdef

를 사용한 디자인 예제
  
  
module my_design (input clk, d, 
`ifdef INCLUDE_RSTN
                  input rstn,
`endif                  
                  output reg q);
  
  always @ (posedge clk) begin
`ifdef INCLUDE_RSTN
    if (!rstn) begin
      q <= 0;
    end else 
`endif
    begin
      q <= d;
    end
  end
endmodule

  

테스트벤치

  
  
module tb;
  reg clk, d, rstn;
  wire q;
  reg [3:0] delay;
  
  my_design u0 ( .clk(clk), .d(d),
`ifdef INCLUDE_RSTN
                .rstn(rstn),
`endif
                .q(q));
  
  always #10 clk = ~clk;
  
  initial begin
    integer i;
    
    {d, rstn, clk} <= 0;
    
	#20 rstn <= 1;    
    for (i = 0 ; i < 20; i=i+1) begin
      delay = $random;
      #(delay) d <= $random;
    end
    
    #20 $finish;
  end
endmodule

  

기본적으로 rstn은 디자인을 컴파일하는 동안 포함되지 않으므로 포틀리스트에 나타나지 않습니다. 그러나 INCLUDE_RSTN이라는 매크로가 파일 컴파일 목록의 일부인 Verilog 파일에 정의되어 있거나 명령줄을 통해 컴파일러에 전달되는 경우 rstn이 컴파일에 포함되고 디자인에 포함됩니다.

차이점을 알아보려면 왼쪽 창의 '컴파일 및 실행 옵션'에서 +define+INCLUDE_RSTN을 추가 및 제거하여 실험해 보세요.

Verilog `ifdef `elsif 예

다음 예제에는 별도의 `ifdef 안에 두 개의 표시 문이 있습니다. 기본 `else이 없는 범위 그것의 일부. 즉, 기본적으로 아무 것도 표시되지 않습니다. 매크로 중 하나의 MACRO가 정의된 경우 해당 표시 메시지가 포함되고 시뮬레이션 중에 표시됩니다.

  
  
module tb;
  initial begin

`ifdef MACRO1
    $display ("This is MACRO1");
    
`elsif MACRO2
    $display ("This is MACRO2");
    
`endif
  end
endmodule

  
시뮬레이션 로그
# With no macros defined
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Verilog `ifndef `elsif 예

`ifndef로 동일한 코드를 작성할 수 있습니다. 결과는 정반대입니다.

  
  
module tb;
  initial begin

`ifndef MACRO1
    $display ("This is MACRO1");
    
`elsif MACRO2
    $display ("This is MACRO2");
    
`endif
  end
endmodule

  
시뮬레이션 로그
# With no macros defined
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO2
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+MACRO1 +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Verilog 중첩 `ifdef 예

`ifdef 정의된 매크로를 사용하여 코드를 포함하고 제외하는 복잡한 방법을 만들기 위해 그 맛을 다른 하나 안에 중첩할 수 있습니다.

  
  
module tb;
  initial begin
    `ifdef FLAG
    	$display ("FLAG is defined");
    	`ifdef NEST1_A
    		$display ("FLAG and NEST1_A are defined");
    		`ifdef NEST2
    			$display ("FLAG, NEST1_A and NEST2 are defined");
    		`endif
    	`elsif NEST1_B
    		$display ("FLAG and NEST1_B are defined");
    		`ifndef WHITE
    			$display ("FLAG and NEST1_B are defined, but WHITE is not");
    		`else
    			$display ("FLAG, NEST1_B and WHITE are defined");
    		`endif
    	`else
    		$display ("Only FLAG is defined");
    	`endif
    `else
    	$display ("FLAG is not defined");
    `endif
  end
endmodule

  
시뮬레이션 로그
# Without defining any macro
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG +define+NEST1_B
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG and NEST1_B are defined, but WHITE is not
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG +define+NEST1_B +define+WHITE
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG, NEST1_B and WHITE are defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+FLAG
ncsim> run
FLAG is defined
Only FLAG is defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+WHITE
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +define+NEST1_A
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

상위 매크로가 정의되지 않은 한 그 안에 있는 다른 중첩 매크로의 정의는 컴파일되지 않습니다. 예를 들어, FLAG가 없는 NEST1_A 또는 WHITE 매크로 정의는 컴파일러가 중첩 코드를 선택하도록 하지 않습니다.


verilog

  1. Verilog 튜토리얼
  2. Verilog 연결
  3. Verilog 할당
  4. Verilog 차단 및 비 차단
  5. Verilog 기능
  6. Verilog 작업
  7. Verilog 클록 생성기
  8. Verilog 디스플레이 작업
  9. Verilog 수학 함수
  10. Verilog 시간 형식