Herencia de propiedades

0

¿Es posible heredar algunas propiedades del ámbito al que invocamos una función? Un fragmento de código podría ayudar más a explicar:

typedef enum logic {
    RESET    , IDLE   ,
    STATE_A  , STATE_B} states;
//as you see above I don't define the width or the values of the states

states current_state, next_state;

  always_comb begin
    assign next_state = next_state_func (
      curr_state,    reset,
      modportA.some_signal_a, modportA.some_signal_b);
  end

function next_state_func (
      //THIS IS THE BUG ZONE:
      //Can I inherit the caller's signals properties? I mean I don't have specific width available so what do I do? 
      ref curr_state,    ref reset,
      ref some_signal_a, ref some_signal_b);

  endfunction
    
pregunta user2692669

1 respuesta

2

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 = ...
    
respondido por el Greg

Lea otras preguntas en las etiquetas