verilog
종종 우리는 RTL 내에서 반복적이고 여러 번 호출되는 특정 코드 조각을 찾습니다. 대부분 시뮬레이션 시간을 소비하지 않으며 다른 데이터 값으로 수행해야 하는 복잡한 계산이 포함될 수 있습니다. 이러한 경우 function
을 선언할 수 있습니다. 함수 내부에 반복적인 코드를 배치하고 결과를 반환하도록 합니다. 이제 함수 호출만 하면 되므로 이렇게 하면 RTL의 줄 수가 크게 줄어듭니다. 계산을 수행해야 하는 데이터를 전달합니다. 사실 이것은 C의 함수와 매우 유사합니다.
함수의 목적은 표현식에 사용할 값을 반환하는 것입니다. 함수 정의는 항상 function
키워드로 시작합니다. 그 뒤에 괄호로 묶인 반환 유형, 이름 및 포트 목록이 옵니다. Verilog는 endfunction
를 찾으면 함수 정의가 끝난다는 것을 알고 있습니다. 예어. 함수에는 적어도 하나의 입력이 선언되어 있어야 하며 반환 유형은 void
입니다. 함수가 아무 것도 반환하지 않는 경우.
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
키워드 automatic
함수를 재진입으로 만듭니다. 작업 내에서 선언된 항목은 작업의 서로 다른 호출 간에 공유되지 않고 동적으로 할당됩니다. 이것은 재귀 함수에 유용하고 동일한 함수가 분기될 때 N개의 프로세스에 의해 동시에 실행될 때 유용합니다.
함수에 대한 입력을 선언하는 두 가지 방법이 있습니다.
function [7:0] sum;
input [7:0] a, b;
begin
sum = a + b;
end
endfunction
function [7:0] sum (input [7:0] a, b);
begin
sum = a + b;
end
endfunction
함수 정의는 암시적으로 함수와 동일한 이름의 내부 변수를 생성합니다. 따라서 함수 범위 내에서 동일한 이름의 다른 변수를 선언하는 것은 불법입니다. 함수 결과를 내부 변수에 대입하여 반환값을 초기화합니다.
sum = a + b;
함수 호출 표현식이 있는 피연산자이며 아래와 같은 구문을 갖습니다.
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
force-release
을 가질 수 없습니다. 또는 assign-deassign
자신을 호출하는 함수를 재귀 함수라고 합니다. 아래 표시된 예에서 재귀 함수는 주어진 숫자의 계승을 계산하기 위해 작성되었습니다.
module tb;
initial begin
integer result = factorial(4);
$display("factorial(4) = %0d", result);
end
function automatic integer factorial(integer i);
integer result = i;
// This function is called within the body of this
// function with a different argument
if (i) begin
result = i * factorial(i-1);
$display("i=%0d result=%0d", i, result);
end else
result = 1;
return result;
endfunction
endmodule
시뮬레이션 로그 xcelium> run i=1 result=1 i=2 result=2 i=3 result=6 i=4 result=24 factorial(4) = 24 xmsim: *W,RNQUIE: Simulation is complete
verilog
for 루프는 소프트웨어에서 가장 널리 사용되는 루프이지만 주로 복제하는 데 사용됩니다. Verilog의 하드웨어 로직. for 뒤에 숨겨진 아이디어 루프는 주어진 조건이 참인 한 루프 내에서 주어진 명령문 세트를 반복하는 것입니다. 이것은 while와 매우 유사합니다. 루프이지만 반복자를 사용할 수 있고 조건이 이 반복자의 값에 따라 달라지는 컨텍스트에서 더 많이 사용됩니다. 구문 for (<initial_condition>; <condition>; <step_assignment>) be
case 문은 주어진 표현식이 목록의 다른 표현식 중 하나와 일치하는지 확인하고 그에 따라 분기합니다. 일반적으로 멀티플렉서를 구현하는 데 사용됩니다. if-else 구문은 확인해야 할 조건이 많고 멀티플렉서 대신 우선 순위 인코더로 합성되는 경우 적합하지 않을 수 있습니다. 구문 Verilog 케이스 명령문은 case로 시작합니다. 키워드이고 endcase로 끝남 예어. 괄호 안의 표현식은 정확히 한 번 평가되고 작성된 순서대로 대안 목록과 비교되며 대안이 주어진 표현식과 일치하는 명령문이 실행됩니다. 여러 문의 블록은 그룹화되