Altifigence Academy

21 / 37 · Concepto

function automatic y expresiones reutilizables

Escribe funciones sin tiempo simulado y comprueba retorno, signo e independencia de la referencia.

Reutiliza el cálculo sin ocultar el contrato

Una función SystemVerilog devuelve un valor sin consumir tiempo simulado. En RTL combinacional sintetizable usa entradas explícitas, asigna retorno en todos los caminos y no incluye retardos ni control de eventos. automatic da almacenamiento propio a cada llamada para argumentos y variables locales; no añade registro ni ciclo. Este bucle de límite fijo calcula XOR de ocho bits como paridad 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 intencionadamente data[7] y añade paridad: tiene ocho bits, no conserva la entrada completa en nueve. Un helper correcto puede ser llamado de una forma que pierda información.

Anchura y signo del retorno

Aquí se devuelve logic de un bit. La suma de dos valores de ocho bits necesita nueve si incluye acarreo. Documenta signo y tamaño: llamar una función no conserva automáticamente acarreo ni amplía el destino. Mantén constantes y reglas junto a la interfaz y evita lecturas ocultas de señales globales cambiantes; dificultan reutilización y verificación.

La llamada no implica hardware compartido en serie

Dos llamadas no obligan a sintetizar un único operador multiplexado en el tiempo. Compartir de forma secuencial requiere política de aceptación, estado y temporización; no deduzcas área ni rendimiento contando llamadas. Las tareas del banco de pruebas pueden esperar eventos para estímulos y comprobaciones; las funciones no consumen tiempo.

Práctica: un algoritmo de referencia distinto

Para data=0,1,3,8'h80,8'hFF espera paridad 0,1,0,1,0. Con 8'h80, with_parity=8'h01 porque se elimina el bit alto y se añade 1. Agota 256 valores y cuenta bits activos en un entero módulo 2, sin llamar a parity8 del DUT. Cambia el límite a 7: 8'h80 debe fallar; valores bajos no detectarían la omisión. Cambia después la salida a nueve bits mediante {data, parity8(data)} y actualiza la referencia: es un cambio de interfaz.

El ejemplo posterior usa una tarea que presenta estímulos en el flanco descendente y verifica después del ascendente; esa responsabilidad temporal es distinta de una función.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.