21 / 37 · Concepto
function automatic y expresiones reutilizables
Escribe funciones sin tiempo simulado y comprueba retorno, signo e independencia de la referencia.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
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.
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 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.