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é queresult <= a(a'left downto a'right+cut) & (b+2)(cut-1 downto 0);
no funcionará sin calcularcut-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
.