Altifigence Academy

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.

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.

SystemVerilog
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)};
endmodule

with_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.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.