verilog
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
을 사용하여 정의 지시.
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을 추가 및 제거하여 실험해 보세요.
다음 예제에는 별도의 `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.
`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.
`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
매개변수는 다른 사양으로 모듈을 재사용할 수 있도록 하는 Verilog 구성입니다. 예를 들어, 4비트 가산기는 비트 수에 대한 값을 허용하도록 매개변수화될 수 있으며 모듈 인스턴스화 중에 새 매개변수 값이 전달될 수 있습니다. 따라서 N비트 가산기는 4비트, 8비트 또는 16비트 가산기가 될 수 있습니다. 함수 호출 중에 전달되는 함수에 대한 인수와 같습니다. parameter MSB = 7; // MSB is a parameter with a constant value 7 paramet
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해