Consulte el LRM sobre funciones y pase por referencia
IEEE Std 1800-2012 § 13.4 Funciones :
Será ilegal llamar a una función con salida, inout o ref argumentos en una expresión de evento, en una expresión dentro de una asignación continua de procedimiento, o en una expresión que no esté dentro de una declaración de procedimiento. Sin embargo, un argumento de la función ref ref será legal en este contexto (ver 13.5.2).
IEEE Std 1800-2012 § 13.5.2 Pasar por referencia :
Los argumentos pasados por referencia no se copian en el área de subrutina, sino que se pasa una referencia al argumento original a la subrutina. La subrutina puede acceder a los datos del argumento a través de la referencia. Los argumentos pasados por referencia deben coincidir con tipos de datos equivalentes (véase 6.22.2). No se permitirá ningún lanzamiento. Para indicar que el argumento pasa por referencia, la declaración del argumento va precedida por la palabra clave ref
. Será ilegal utilizar argumentos que pasen por referencia para subrutinas con un tiempo de vida de static
. La sintaxis general es la siguiente:
subroutine( ref type argument );
Puedes probar:
function automatic states next_state_func (
const ref states curr_state,
const ref logic reset,
const ref {type} some_signal_a,
const ref {type} some_signal_b);
...
endfunction
No estoy seguro si puede sintetizar. No he visto ninguna documentación que brinde orientación sobre las funciones con ref
sintetizar. Siempre uso ref
para el área relacionada con el banco de pruebas. Al codificar RTL, calculo el next_state
dentro de un always_comb
sin ningún function
llamadas.
Otro problema:
No ponga assign
dentro de bloques de procedimiento. Consulte IEEE Std 1800-2012 § C.4.2 Asignaciones de procedimientos y asignaciones de desasignación
Las declaraciones de procedimiento assign
y deassign
pueden ser una fuente de errores de diseño y pueden ser un impedimento para la implementación de la herramienta. Los enunciados procesales assign
y deassign
no proporcionan una capacidad que no pueda realizarse mediante otro método que evite estos problemas. Por lo tanto, las declaraciones de procedimiento assign
y deassign
están en una lista de desaprobación. ...
...
Permitir que la instrucción assign
se use dentro y fuera de un bloque de procedimiento causa confusión y es una fuente de errores en los modelos SystemVerilog. No se recomienda la práctica de usar las declaraciones assign
y deassign
dentro de los bloques de procedimientos.
Tu código debe ser:
always_comb begin
next_state = ...
end
o
assign next_state = ...