El paso a paso o código que encontrarás en este artículo es la resolución más rápida y válida que hallamos a tus dudas o dilema.
Solución:
Todo depende del tipo de código que estés escribiendo.
Si está escribiendo código que tiene la intención de sintetizar, que tiene la intención de entrar en un FPGA o ASIC, entonces probablemente no quiera usar los operadores de división o módulo. Cuando coloca cualquier operador aritmético en RTL, el sintetizador instancia un circuito para hacer el trabajo; un sumador para +
& -
; un multiplicador de *
. Cuando escribes /
estás pidiendo un circuito divisor, pero un circuito divisor es algo muy complejo. A menudo toma varios ciclos de reloj y puede usar tablas de búsqueda. Está pidiendo mucho a una herramienta de síntesis para inferir lo que quieres cuando escribes a / b
.
(Obviamente, dividir por potencias de 2 es simple, pero normalmente usaría los operadores de cambio)
Si está escribiendo código que no quiere que se sintetice, que es parte de un banco de pruebas, por ejemplo, entonces puede usar la división todo lo que quiera.
Así que para responder a tu pregunta, el /
operator no es inútil, pero debe ser consciente de dónde y por qué lo está usando. lo mismo es true de *
, pero en menor grado. Los multiplicadores son bastante caros, pero la mayoría de los sintetizadores pueden inferirlos.
Tienes que pensar en hardware.
Cuando escribe a <= b/c, le está diciendo a la herramienta de síntesis "Quiero un divisor que pueda proporcionar un resultado en cada ciclo de reloj y que no tenga registros intermedios".
Si resuelve el circuito lógico requerido para crearlo, es muy complejo, especialmente para recuentos de bits más altos. En general, los FPGA no tendrán bloques de hardware especializados para la división, por lo que tendría que implementarse a partir de recursos lógicos genéricos. Es probable que sea grande (muchos luts) y lento (fmax bajo).
Algunos sintetizadores pueden implementarlo de todos modos (a partir de una búsqueda rápida, parece que Quartus lo hará), otros no se molestarán porque no creen que sea muy útil en la práctica.
Si está dividiendo por una constante y puede vivir con un resultado aproximado, entonces puede hacer trucos con multiplicadores. Toma el recíproco de lo que querías dividir, multiplícalo por una potencia de dos y redondea al entero más cercano.
Luego, en su verilog, puede implementar su división aproximada por multiplicación (que no es demasiado costosa en los FPGAS modernos) seguida de cambio (el cambio en un número fijo de bits es esencialmente gratuito en el hardware). Asegúrese de permitir suficientes bits para el resultado intermedio.
Si necesita una respuesta exacta o si necesita dividir por algo que no es una constante predefinida, tendrá que decidir qué tipo de divisor desea. SI su rendimiento es bajo, entonces puede usar un enfoque basado en una máquina de estado que hace una división cada n ciclos de reloj. Si su rendimiento es alto y puede pagar el área del dispositivo, entonces puede ser más apropiado un enfoque canalizado que hace una división por ciclo de reloj (pero requiere varios ciclos para que fluya el resultado).
A menudo, los proveedores de herramientas proporcionarán bloques prefabricados (altera los llama megafunciones) para este tipo de cosas. La ventaja de estos es que el proveedor de la herramienta probablemente los haya optimizado cuidadosamente para el dispositivo. La desventaja es que pueden traer el bloqueo del proveedor, si desea cambiar a un proveedor de dispositivos diferente, lo más probable es que tenga que cambiar el bloque y el bloque con el que lo intercambie puede tener características diferentes.
Así que estoy confundido. ¿Verilog no puede manejar la división simple? ¿Es inútil el operador /?
La especificación de síntesis de verilog (IEEE 1364.1) en realidad indica que se deben admitir todos los operadores aritméticos con operandos enteros, pero nadie sigue esta especificación. Algunas herramientas de síntesis pueden hacer la división de enteros, pero otras la rechazarán (creo que XST todavía lo hace) porque la división combinacional suele ser muy ineficiente en el área. Las implementaciones multiciclo son la norma, pero no se pueden sintetizar a partir de ‘/’.
Si haces scroll puedes encontrar las aclaraciones de otros usuarios, tú todavía eres capaz insertar el tuyo si lo deseas.