21 / 37 · Conceito
function automatic e expressões reutilizáveis
Escreva funções sem tempo simulado e confira largura, sinal e independência da referência.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
Reutilize cálculo sem esconder o contrato
Função SystemVerilog retorna valor sem consumir tempo de simulação. Em RTL combinacional sintetizável, use entradas explícitas, atribua retorno em todos os caminhos e não inclua atraso nem controle de evento. automatic separa argumentos e variáveis locais de cada chamada, sem acrescentar registrador ou ciclo. O laço fixo abaixo calcula XOR de oito bits como paridade combinacional.
module parity_function (
input logic [7:0] data,
output logic parity,
output logic [7:0] with_parity
);
function automatic logic parity8(input logic [7:0] value);
logic p;
integer bit_index;
begin
p = 1'b0;
for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
p = p ^ value[bit_index];
parity8 = p;
end
endfunction
assign parity = parity8(data);
assign with_parity = {data[6:0], parity8(data)};
endmodulewith_parity descarta data[7] e acrescenta paridade: são oito bits, não uma codificação de nove que preserve a entrada toda. A função pode estar correta e o chamador perder informação.
Retorno: largura e sinal
O retorno é logic de um bit. Somar duas entradas sem sinal de oito bits preservando carry exige nove bits de retorno. Chamar função não amplia destino nem preserva carry automaticamente. Mantenha regras de largura e constantes junto à interface; evite dependências escondidas de sinais globais variáveis, que dificultam reutilização e teste.
Chamada não implica compartilhamento serial
Duas chamadas não forçam síntese de um operador compartilhado no tempo. A ferramenta pode otimizar lógica combinacional; compartilhamento serial requer aceitação, estado e instante do resultado. Não deduza área ou vazão contando chamadas. Tasks no banco de teste podem aguardar eventos; funções e tarefas temporizadas têm responsabilidades distintas. A aula seguinte usa task para estímulo na descida e observação depois da subida.
Prática: outra referência
data=0,1,3,8'h80,8'hFF deve dar paridade 0,1,0,1,0. Para 8'h80, with_parity=8'h01 pois o bit alto é removido e parity=1. Teste todos os 256 valores contando bits ativos num inteiro e usando resto por 2, sem chamar parity8 do DUT. Mude o limite do laço para 7: 8'h80 deve falhar, embora valores baixos não revelem o defeito. Depois mude a saída para nove bits com {data, parity8(data)} e atualize o modelo: é alteração de interface, não de formatação.