verilog
function
입력에 대해 일부 처리를 수행하고 단일 값을 반환하는 반면 task
더 일반적이며 여러 결과 값을 계산하고 출력을 사용하여 반환할 수 있습니다. 그리고 inout 유형 인수. 작업에는 @와 같이 시간이 많이 소요되는 시뮬레이션 요소가 포함될 수 있습니다. , 포제지 다른 사람.
작업은 포트 목록에 인수 집합을 가질 필요가 없으며, 이 경우 비워 둘 수 있습니다.
// Style 1
task [name];
input [port_list];
inout [port_list];
output [port_list];
begin
[statements]
end
endtask
// Style 2
task [name] (input [port_list], inout [port_list], output [port_list]);
begin
[statements]
end
endtask
// Empty port list
task [name] ();
begin
[statements]
end
endtask
작업이 정적이면 모든 구성원 변수는 동시에 실행되도록 시작된 동일한 작업의 서로 다른 호출에서 공유됩니다.
task sum (input [7:0] a, b, output [7:0] c);
begin
c = a + b;
end
endtask
// or
task sum;
input [7:0] a, b;
output [7:0] c;
begin
c = a + b;
end
endtask
initial begin
reg [7:0] x, y , z;
sum (x, y, z);
end
작업 활성화 인수(x, y, z)는 작업에 의해 정의된 인수(a, b, c)에 해당합니다. a 이후 및 b 입력, x 값 및 y a에 배치됩니다. 및 b 각기. c 때문에 출력으로 선언되고 z와 연결됩니다. 호출하는 동안 합계는 자동으로 변수 z에 전달됩니다. c에서 .
키워드 automatic
작업을 재진입하도록 만들며, 그렇지 않으면 기본적으로 정적입니다. 자동 내의 모든 항목 작업은 각 호출에 대해 동적으로 할당되며 동시에 실행되는 동일한 작업의 호출 간에 공유되지 않습니다. automatic
작업 항목은 계층 참조로 액세스할 수 없습니다.
예를 들어 정적 다른 initial
에서 호출되는 작업 표시 동시에 실행되는 블록. 이 경우 작업 내에서 선언된 정수 변수는 작업의 모든 호출 간에 공유되므로 각 호출에 대해 표시되는 값이 증가해야 합니다.
module tb;
initial display();
initial display();
initial display();
initial display();
// This is a static task
task display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
시뮬레이션 로그 xcelium> run i=1 i=2 i=3 i=4 xmsim: *W,RNQUIE: Simulation is complete.
작업이 자동으로 설정되면 작업을 호출할 때마다 시뮬레이션 메모리에서 다른 공간이 할당되고 다르게 작동합니다.
module tb;
initial display();
initial display();
initial display();
initial display();
// Note that the task is now automatic
task automatic display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
시뮬레이션 로그 xcelium> run i=1 i=1 i=1 i=1 xmsim: *W,RNQUIE: Simulation is complete.
모든 모듈 외부에서 선언된 작업을 전역이라고 합니다. 작업은 전역 범위를 가지며 모든 모듈 내에서 호출할 수 있습니다.
// This task is outside all modules
task display();
$display("Hello World !");
endtask
module des;
initial begin
display();
end
endmodule
시뮬레이션 로그 xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.
작업이 des 모듈 내에서 선언된 경우 모듈 인스턴스 이름을 참조하여 호출해야 합니다.
module tb;
des u0();
initial begin
u0.display(); // Task is not visible in the module 'tb'
end
endmodule
module des;
initial begin
display(); // Task definition is local to the module
end
task display();
$display("Hello World");
endtask
endmodule
시뮬레이션 로그 xcelium> run Hello World Hello World xmsim: *W,RNQUIE: Simulation is complete.
function
의 차이점 및 task
Verilog의 기능과 작업은 유사한 목적으로 사용되지만 몇 가지 주목할 만한 차이점이 있습니다.
함수 | 작업 |
---|---|
시간 제어 명령문/지연을 가질 수 없으므로 동일한 시뮬레이션 시간 단위로 실행 | 시간 제어 명령문/지연을 포함할 수 있으며 다른 시간에만 완료될 수 있음 |
위의 규칙 때문에 작업을 활성화할 수 없습니다. | 다른 작업 및 기능을 활성화할 수 있음 |
최소한 하나의 입력 인수가 있어야 하며 출력 또는 입력 인수를 가질 수 없습니다. | 모든 유형의 인수를 0개 이상 가질 수 있음 |
하나의 값만 반환할 수 있음 | 값을 반환할 수 없지만 출력 인수를 사용하여 동일한 효과를 얻을 수 있음 |
함수가 task
을 호출하려고 할 때 또는 시간이 많이 걸리는 명령문이 포함된 경우 컴파일러에서 오류를 보고합니다.
module tb;
reg signal;
initial wait_for_1(signal);
function wait_for_1(reg signal);
#10;
endfunction
endmodule
시뮬레이션 로그 #10; | xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].
disable
을 사용하여 작업을 비활성화할 수 있습니다. 키워드.
module tb;
initial display();
initial begin
// After 50 time units, disable a particular named
// block T_DISPLAY inside the task called 'display'
#50 disable display.T_DISPLAY;
end
task display();
begin : T_DISPLAY
$display("[%0t] T_Task started", $time);
#100;
$display("[%0t] T_Task ended", $time);
end
begin : S_DISPLAY
#10;
$display("[%0t] S_Task started", $time);
#20;
$display("[%0t] S_Task ended", $time);
end
endtask
endmodule
표시할 때 작업이 첫 번째 initial
에 의해 시작되었습니다. 블록, T_DISPLAY가 시작되고 시간이 50단위에 도달하면 비활성화되었습니다. 즉시 다음 블록 S_DISPLAY가 시작되어 80단위로 완료되었습니다.
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
verilog
매개변수는 다른 사양으로 모듈을 재사용할 수 있도록 하는 Verilog 구성입니다. 예를 들어, 4비트 가산기는 비트 수에 대한 값을 허용하도록 매개변수화될 수 있으며 모듈 인스턴스화 중에 새 매개변수 값이 전달될 수 있습니다. 따라서 N비트 가산기는 4비트, 8비트 또는 16비트 가산기가 될 수 있습니다. 함수 호출 중에 전달되는 함수에 대한 인수와 같습니다. parameter MSB = 7; // MSB is a parameter with a constant value 7 paramet
Verilog는 하드웨어 설명 언어이며 설계자가 RTL 설계를 시뮬레이션하여 논리 게이트로 변환할 필요가 없습니다. 시뮬레이션이 필요한 이유는 무엇입니까? 시뮬레이션은 RTL 코드가 의도한 대로 동작하는지 확인하기 위해 다른 시간에 다른 입력 자극을 설계에 적용하는 기술입니다. 기본적으로 시뮬레이션은 설계의 견고성을 검증하기 위해 잘 따라야 하는 기술입니다. 또한 가공된 칩이 실제 세계에서 사용되는 방식과 다양한 입력에 반응하는 방식과 유사합니다. 예를 들어, 위의 디자인은 출력 pe 보여진 바와 같이. 시뮬레이션을 통해