Síntesis de la función truncar

2

Estoy usando synplify y escribí una biblioteca de utilidades para mi proyecto, que contiene la siguiente función:

function truncate(x: in std_logic_vector; constant length: in integer)
return std_logic_vector is
    variable result : std_logic_vector(length-1 downto 0);
begin
    result := x(length-1 downto 0);
    return result;
end function;

Sin embargo, Synplify da el siguiente error (la línea 197 es la que declaro la variable result ):

  

@E: CD866: utility.vhd (197) | La expresión no es una constante (estática)   expresión

Mis preguntas son:

  • ¿Por qué me sale el error? (En síntesis, pensé que function está en línea y todo está bien)
  • ¿Cómo puedo trabajar cerca? (Intenté marcar la longitud como const, pero eso no funcionó, además de que arruinará la parte posterior).
  • Si el campo de trabajo es: simplemente escríbalo, ¿puedo formular result <= a(a'left downto a'right+cut) & truncate(unsigned(b)+2, cut); sin usar inmediatos adicionales? (Sé que result <= a(a'left downto a'right+cut) & (b+2)(cut-1 downto 0); no funcionará sin calcular cut-1 en un vector intermedio y luego usar un subconjunto de ese vector).

NOTA IMPORTANTE:

Mi diseño contiene una parte donde combino dos vectores algo similares a este ( cut es una señal de entrada, por lo tanto no es constante):

result <= a(a'left downto a'right+cut) & truncate(b, cut);

Aunque tengo la sensación de que esta podría ser la fuente del problema, no veo por qué tal artilugio no debería ser sintetizable (después de todo, son solo varios multiplexores y controles de corte, cuáles toman "bits" de a / b respectivley.

(La razón es que encuentro truncate(x, y) más legible que x(y-1 downto 0) , además, se podría extender esta función para que funcione independientemente de la dirección del rango y de la prueba) (por ejemplo, un vector x definido solo para un rango k downto l donde l>0 .

    
pregunta ted

1 respuesta

2

Tenga en cuenta que su valor de retorno tiene una longitud dinámica. En síntesis, esto implica un bus físico que tiene un número variable de bits, que ciertamente no es sintetizable. Intente rellenar el valor de retorno con ceros para que pueda tener un ancho constante ... que no debería hacer ninguna diferencia en la operación AND posterior.

    
respondido por el Joe Hass

Lea otras preguntas en las etiquetas