radastan escribió:Efectivamente, usar el propio código de Verilog para emular un sistema. Sólo habría que asignar a los pines de e/s del código verilog la emulación de lo externo (un televisor, un mando, etc). Evidentemente habría que usar una precompilación antes de ejecutar el emulador, pero se usaría el mismo código.
Y... ¿qué diferencia hay entre eso y convertir la descripción en un circuito para metérselo en una FPGA?
Porque si lo que estás insinuando es que exista algún tipo de compilador que traduzca Verilog al código máquina de un procesador, ya te cuento que hay varios escollos:
- Verilog es un lenguaje que de forma natural procesa en paralelo. Esto no es posible en un procesador, ni siquiera en uno con varios nucleos, dado que el procesamiento en paralelo de Verilog es a nivel de ciclo de reloj. Muchísimo más fino que el procesamiento paralelo a nivel de cores de un multicore. Un ejemplo: para intercambiar el contenido de dos variables a,b en cada ciclo de reloj, en Verilog, se usa esto:
Esto funciona porque ambas asignaciones se realizan al mismo tiempo, por lo que no hay condiciones de carrera que sí habría en un multicore.
- Hay procesos y cálculos, incluso, que se ejecutan ideamente en 0ns de tiempo (y que en la realidad, según la FPGA usada, pueden tardar del orden de 2-3ns). Un ejemplo: un trozo de código que según el valor de su entrada, un número de 4 bits en formato BCD, genera el patrón de bits para encender un display LED de 7 segmentos:
Código: Seleccionar todo
always @* begin
case(BCD)
4'h0: SevenSeg = 8'b11111100;
4'h1: SevenSeg = 8'b01100000;
4'h2: SevenSeg = 8'b11011010;
4'h3: SevenSeg = 8'b11110010;
4'h4: SevenSeg = 8'b01100110;
4'h5: SevenSeg = 8'b10110110;
4'h6: SevenSeg = 8'b10111110;
4'h7: SevenSeg = 8'b11100000;
4'h8: SevenSeg = 8'b11111110;
4'h9: SevenSeg = 8'b11110110;
default: SevenSeg = 8'b00000000;
endcase
end
- El sistema en que se implementa un diseño en Verilog "habla" con otros dispositivos (un teclado, un monitor) que van a una cierta velocidad. Pongamos el monitor, que tiene que poder pintar 352 píxeles en 64 microsegundos. Esto significa que Verilog tiene que poder darle a la salida de video un dato nuevo cada 140 nanosegundos aproximadamente. Y debe hacerlo independientemente del resto de cosas que se estén "ejecutando" en el interior del dispositivo en el que use el diseño en Verilog.
Todos estos escollos lo que vienen a sugerir es que la traducción de Verilog a código máquina nunca (o practicamente nunca, salvo para casos excepcionalmente triviales) va a producir un código máquina capaz de leer y generar datos a la misma cadencia que se haría con una FPGA. El microprocesador que usara una "compilación" de Verilog estaría ejecutando secuencialmente lo que en origen es paralelo.
El primer entorno de diseño con FPGA que usé era el DK de Celoxica (luego Mentor Designs). En él podíamos simular el código Verilog, apareciendo en pantalla una representación gráfica de la placa actual para la que se había diseñado ese código. Si como parte del diseño habíamos hecho un controlador VGA, podíamos ver cómo ese controlador VGA iba pintando la pantalla. Obviamente no lo veíamos en tiempo real, sino a cámara lenta, y no porque el PC fuera muy lento.... es que para poder hacer esa simulación en tiempo real el PC debería ser como 1000 veces más rápido de lo que lo es ahora.