VHDL ieee.numeric_std: ¿División por cero definida?

1

Como dice el título, me gustaría saber si el comportamiento de una división cero en ieee.numeric_std está definido de alguna manera. Si uno lo hace

signal a, b : unsigned (width1_g-1 downto 0);
signal c    : unsigned (width2_g-1 downto 0);

div_proc : process (clk_i)
begin
    if rising_edge(clk_i) then
        c <= a / b;
    end if;
end process;

por ejemplo, ¿cuál será el resultado de c ?

    
pregunta Andy Ef

2 respuestas

1

En su ejemplo, a y b no están inicializados, pero supongo que desea una división con b := 0 en algún lugar, esta respuesta es solo para FPGA:

Desde el paquete numeric_std.vhd:

  

- NOTA: Si el segundo argumento es cero para el operador "/", una gravedad   Se emite un nivel de ERROR.

 -- Id: A.21   function "/" (L,R: UNSIGNED ) return UNSIGNED;

Así que en la simulación esto debería fallar. Si no falla, deberías encontrar un simulador mejor.

En síntesis:

  • Vivado solo admite la división por potencias de 2 en versiones anteriores e intentará deducir una unidad Divider LogiCORE para otras, que no admite la división por un 0 constante (por lo que es un error de síntesis) y permite la opción detección de errores al intentar dividir por una variable que podría ser 0. No he intentado lo que sucede si desactiva esta inferencia en las ediciones actuales, pero sospecho que nuevamente solo acepta potencias de 2.

  • Los productos actuales de Quartus intentan inferir un divisor DSP con limitaciones extremadamente similares a las del divisor Xilinx. No tengo idea de lo que sucede cuando intenta sintetizarlo en LUT puras. Sé que la división se puede inferir para poderes no binarios y es horrible.

No intentes dividir por cero.

    
respondido por el DonFusili
1

En simulación:

  • El estándar VHDL IEEE Std 1076.2-1996 define la división por cero como una condición de error. Así que esto debería terminar inmediatamente la simulación.
  • El estándar Verilog IEEE Std 1364-2005, por otro lado, dice que la división por cero debe devolver xxx y no desencadenar nada espectacular (consulte el capítulo 5.1.5 Operadores aritméticos en la norma).

Por supuesto, en hardware real, cualquier cosa podría suceder, porque ninguno de estos resultados es implementable (no hay un mecanismo incorporado en el chip para detener la ejecución, o ¿debería "detenerse la simulación" traducirse en "explotar el chip"? y los valores de xxx requerirían una lógica de actualización que no está allí). Así que la decisión depende de la herramienta de síntesis que estés usando (y la decisión podría ser "no está definida"). Tal vez esté especificado en la documentación de la herramienta específica que está utilizando.

Pero en realidad, ciertamente no lograrás sintetizar correctamente tal construcción sin abombar tu diseño de todos modos (y algunas herramientas de síntesis ni siquiera son capaces de producir un bloque divisor de propósito general que puede tomar cualquier valor para el divisor : estarán restringidos al poder de dos). Así que simplemente no hagas eso en un diseño de hardware real.

    
respondido por el dim

Lea otras preguntas en las etiquetas