Funções Verilog
Muitas vezes, encontramos certos trechos de código repetitivos e chamados várias vezes dentro da RTL. Eles geralmente não consomem tempo de simulação e podem envolver cálculos complexos que precisam ser feitos com diferentes valores de dados. Nesses casos, podemos declarar um
function
e coloque o código repetitivo dentro da função e permita que ela retorne o resultado. Isso reduzirá drasticamente a quantidade de linhas na RTL, pois tudo o que você precisa fazer agora é fazer uma chamada de função e passar os dados sobre os quais o cálculo precisa ser executado. Na verdade, isso é muito semelhante às funções em C. O objetivo de uma função é retornar um valor que deve ser usado em uma expressão. Uma definição de função sempre começa com a palavra-chave
function
seguido pelo tipo de retorno, nome e uma lista de portas entre parênteses. A Verilog sabe que uma definição de função terminou quando encontra o endfunction
palavra-chave. Observe que uma função deve ter pelo menos uma entrada declarada e o tipo de retorno será void
se a função não retornar nada. Sintaxe
function [automatic] [return_type] name ([port_list]);
[statements]
endfunction
A palavra-chave
automatic
tornará a função reentrante e os itens declarados dentro da tarefa são alocados dinamicamente em vez de compartilhados entre diferentes invocações da tarefa. Isso será útil para funções recursivas e quando a mesma função for executada simultaneamente por N processos quando for bifurcada. Declarações de função
Existem duas maneiras de declarar entradas para uma função:
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
Retornando um valor de uma função
A definição da função criará implicitamente uma variável interna com o mesmo nome da função. Portanto, é ilegal declarar outra variável com o mesmo nome dentro do escopo da função. O valor de retorno é inicializado atribuindo o resultado da função à variável interna.
sum = a + b;
Chamando uma função
Uma chamada de função é um operando com uma expressão e tem a sintaxe mostrada abaixo.
reg [7:0] result;
reg [7:0] a, b;
initial begin
a = 4;
b = 5;
#10 result = sum (a, b);
end
Regras de função
- Uma função não pode conter nenhuma instrução controlada por tempo, como # , @ , aguarde , postado , negrito
- Uma função não pode iniciar uma tarefa porque pode consumir tempo de simulação, mas pode chamar outras funções
- Uma função deve ter pelo menos uma entrada
- Uma função não pode ter atribuições não bloqueantes ou
force-release
ouassign-deassign
- Uma função não pode ter gatilhos
- Uma função não pode ter saída ou entrada
Funções recursivas
Funções que chamam a si mesmas são chamadas de funções recursivas. No exemplo mostrado abaixo, uma função recursiva é escrita para calcular o fatorial de um determinado número.
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
Registro de simulação 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