Ingeniería inversa de la secuencia de programación del fabricante de un FPGA

Por mucho que IP tiende a facilitar las cosas, me gustaría aprender más sobre protocolos e interfaces haciéndolo todo yo mismo (entiendo la dificultad de la tarea y tengo recursos para ayudarme como en profesores y libros). Sin embargo, por lo que entiendo, es casi imposible (sin ingeniería inversa) usar cualquier característica de hardware en un FPGA sin IP. He investigado en línea y no he encontrado casi nada sobre el tema, ya que la gente parece complaciente con el uso de IP. Esencialmente, estoy tratando de encontrar más recursos HDL de código abierto, ya que faltan en este momento.

Editar: para ser más conciso, ¿es posible evitar la IP de los fabricantes para programar fpgas?

¿Tienes una pregunta?
Lo siento, es posible que me haya olvidado de preguntar explícitamente uno en mis divagaciones o lo borré por accidente. Lo editaré y lo agregaré en la parte inferior.
Aparentemente, sería imposible utilizar las IP duras y semiduras (firmes) presentes en las FPGA.
No está claro qué está preguntando OP. Una cosa es "cómo programar FPGA" en el sentido de "cómo fusionar información de interconexión", otra cosa es cómo usar primitivas de hardware como ser-des y bloquear RAM, y la tercera es si uno puede hacer su propio gran macrobloques como PCIe o USB SIE.
Mis disculpas por no aclarar. En su lista, estoy más mirando el segundo y tercer elemento.
Para el segundo elemento, todas las primitivas de hardware deben tener una descripción suficiente, y es posible configurarlas "a mano" y no utilizar la "IP de configuración" proporcionada por el proveedor. En un pasado no muy lejano, todos los bloques de hardware se configuraban sin applets de configuración modernos. Con respecto al tercer elemento, vea mi respuesta a continuación.
@ laptop2d, según la aclaración anterior, la nueva edición del título no refleja la verdadera cuestión de OP. No está interesado en la configuración bit a bit.
Entonces edítalo, ¡tú tienes el poder!

Respuestas (5)

Puede haber un malentendido acerca de lo que significa 'IP'.

Es posible programar la estructura de un FPGA, es decir, las LUT programables y demás, desde cero. Sin embargo, los bits, las puertas y las tablas en Xilinx y Altera son diferentes, y son diferentes de una familia a otra, por lo que es como ensamblar la codificación de un micro, todos tienen un código de máquina de bajo nivel diferente. No creo que nadie haga eso, al menos no comercialmente.

Por lo general, es más fácil usar VHDL y escribir asignaciones AND y OR y vectoriales ADD, y dejar que el mapeador convierta eso en entradas LUT. Yo no llamaría a eso 'IP', lo llamaría compilación. Cuando su VDHL que implica puertas y pestillos NAND golpea un compilador Altera o un compilador Xilinx, ya que la estructura es diferente, las tablas LUT se programarán de manera diferente, pero la función de bajo nivel que ha descrito en el VHDL se implementa de la misma manera. .

Si desea utilizar el hardware específico que proporcionan Xilinx y Altera, como las memorias RAM de doble puerto o el acumulador multiplicador de 48x24, debe utilizar primitivas específicas del proveedor. Pero, tienes control total sobre cómo te conectas a ellos. Todavía no llamaría a esta IP.

Si desea utilizar un FFT empaquetado, un filtro FIR de reducción de muestreo o un decodificador Viterbi, o el ARM integrado, proporcionado o autorizado por el proveedor para su arquitectura, ya sea una licencia gratuita (con las herramientas) o de pago, eso es PI

Nitpick: Algunas herramientas de síntesis pueden inferir ciertas primitivas. Por ejemplo, las herramientas de Xilinx intentarán inferir bloques de RAM cuando sea posible.
@duskwuff, como calificó correctamente Neil, el bloque de RAM no es realmente una IP. Técnicamente no es muy diferente de un D-flop. Es solo un mapeo de HDL en primitivas de hardware disponibles. Todas las herramientas modernas reconocen construcciones HDL estándar y las asignan de manera óptima al hardware disponible. Puede construir un D-flop clásico a partir de puertas NAND explícitamente en Verilog y se asignará a LUT generales, pero ¿cuál sería el punto?
No creo que el formato de los archivos de configuración y el mapeo de bits sobre cómo configurar la interconexión martix de FPGA se haya divulgado alguna vez al público, por lo que la declaración de posibilidad de hacer la configuración por su cuenta tiene una probabilidad muy baja.
@AliChen: Había varios documentos que leí en los que el grupo de investigación estaba haciendo cosas no estándar con FPGA que hasta el día de hoy no puedo hacer con las herramientas proporcionadas por el proveedor. Uno que recuerdo fue reconfigurar un FPGA sobre la marcha para que un solo FPGA en la placa funcione como 4 o más FPGA (corre circuitos que no caben en el chip). Otro fue uno que implementó un algoritmo evolutivo para que el sistema reescriba el circuito sobre la marcha a medida que se entrena. Entonces, al menos algunas personas lo han hecho, aunque si tuviera que adivinar, diría que habrían firmado acuerdos de confidencialidad para la información necesaria.
@slebetman Lo primero que mencionó es la reconfiguración dinámica, que es compatible con las herramientas de Xilinx. Lo segundo fue trabajar con FPGA Xilinx mucho más antiguas (XC6216) que tenían un formato de flujo de bits documentado.

Ciertamente es posible programar (usando y HDL) y realizar tareas útiles en FPGA sin usar bloques de IP de terceros, si eso es lo que quiso decir. Sin embargo, aún tiene que usar las herramientas de síntesis de los proveedores.

Las máquinas de estado sincrónicas, etc. escritas en VHDL estructurado apropiadamente se sintetizan fácilmente en las LUT, flip flops y multiplexores en una celda FPGA y puede hacer que estos diseños se conecten con los pines IO usando un archivo de restricciones (que estará en un formato propietario).

Las herramientas de síntesis reconocerán ciertos modismos en VHDL y se mapearán en otros recursos en el chip automáticamente, por ejemplo, utilizando señales de reloj global cuando corresponda e incluso mapeando una construcción aritmética canalizada en un DSP cuando corresponda.

Por otro lado, hay algunos recursos en el chip para los que debe usar macros proporcionadas por el proveedor para que las herramientas de síntesis puedan mapearse en el hardware. Un ejemplo es si se usa un PLL para generar relojes de diferentes fases.

Hay herramientas de síntesis de terceros disponibles. La implementación, por otro lado, tiene que usar las herramientas del proveedor (a menos que se trate de lattice ice40 clifford.at/icestorm )

Ciertamente puede implementar cualquier protocolo de interfaz por sí mismo. ¿Cómo crees que se diseñaron estas IP en primer lugar?

Todo lo que necesita es estudiar cuidadosamente las especificaciones particulares e implementar todas las máquinas de estado de acuerdo con la documentación. Luego, debe verificar todas sus construcciones HDL con bancos de prueba que cubran todos los casos de esquina. Luego, debe colocar y enrutar su lógica de tal manera que cumpla con el tiempo necesario para los relojes requeridos. El proveedor de FPGA proporcionará herramientas automáticas para hacer este trabajo, pero con mucha frecuencia la ubicación de los bloques lógicos puede ser complicada para lograr una sincronización satisfactoria, y es posible que se requiera una gran sofisticación para formular las restricciones de sincronización adecuadas para la herramienta.

También deberá diseñar un entorno externo para operar su interfaz en condiciones realistas, ya sea virtualmente (nuevamente, modelos de sistema/bus) o tener un entorno operativo físico, para validar la funcionalidad de su interfaz.

Por supuesto, puede hacerlo todo solo, y le llevará solo un par de años realizar todas estas tareas para cualquier interfaz serializada de paquetes moderna. O puede utilizar los frutos del trabajo de varios años de ingenieros experimentados que ya hicieron este diseño y envolvieron su trabajo en una forma de IP configurable. Solo necesitará un par de semanas para comprender el funcionamiento externo e incorporar la propiedad intelectual en su diseño. Pero la IP te costará. Ahora es tu elección.

Para los esfuerzos a lo largo del camino del diseño propio, puede comenzar con OpenCores.org .

Depende de a qué tipo de IP te refieras. Algunas IP son IP blandas y realmente no son diferentes de un diseño en HDL, ya que viven en las LUT de la FPGA. Esto lo puedes implementar por tu cuenta, pero puede ser muy complejo. Hard IP, por otro lado, existe como silicio dedicado fuera de las LUT de FPGA. Por lo general, esto involucrará componentes de señal mixta, como en un PLL o un serializador o deserializador de alta velocidad. A veces, la IP dura es puramente digital, como en el caso de un núcleo de CPU duro, una interfaz PCIe o una MAC Ethernet. Si la IP dura tiene componentes de señal mixtos, entonces es imposible reemplazarla solo con HDL. Si el núcleo es puramente digital, entonces puede ser más complejo de lo que sería factible reemplazar.

Ahora, hay primitivas FPGA comunes, como multiplicadores, LUT y RAM de bloque que en realidad se pueden inferir con un poco de hdl puro en lugar de requerir una instanciación explícita. Para cosas como bloques de RAM y segmentos de DSP, este puede ser un enfoque muy razonable.

Si quieres hacer algo como un FIFO, entonces sí, puedes hacer el tuyo propio.

Ahora, si desea usar primitivas de hardware específicas como BRAM, multiplicadores, PLL, etc., deberá usar las herramientas, bibliotecas, IP e interfaces proporcionadas por el fabricante.

Eso es lo que había sospechado. vergüenza de verdad
¿Por qué es una vergüenza? Quería implementarlos usted mismo, continúe. Solo asegúrese de no comprar un FPGA con las IP duras propietarias
Punto justo, aunque sería genial interactuar con él de todos modos. Viniendo de un fondo de microcontrolador, estoy acostumbrado a tener un control casi completo sobre lo que se da, pero su punto es completamente válido.
Creo que no entendiste lo que son los primitivos: son como periféricos de microcontroladores. Son una sección de hardware que realiza esa función y se pueden conectar al resto. Pero generalmente no se les llama "IP", son secciones más grandes de código que realizan tareas de alto nivel.
(¡generalmente es imposible usar un FPGA sin la cadena de herramientas del fabricante! La única excepción es el semidispositivo de celosía que ha sido diseñado a la inversa)
@ pjc50, diría que las primitivas son más similares a las incorporadas en flash/registers/fpu/alu/etc. en un microcontrolador, donde son los componentes básicos del dispositivo. Los periféricos serían más análogos a los núcleos IP duros como PCIe/transceptores. Y, al igual que no tiene acceso directo a los pines de datos de USB en un uC, tampoco tiene acceso directo a los pines de transceptores de varios gigabits en un FPGA