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

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

  1. Verilog 튜토리얼
  2. Verilog 연결
  3. Verilog 할당
  4. Verilog 차단 및 비 차단
  5. Verilog 기능
  6. Verilog 작업
  7. Verilog 계층적 참조 범위
  8. Verilog 클록 생성기
  9. Verilog 디스플레이 작업
  10. Verilog 수학 함수