FPGA en C con Cynth

Programar una FPGA con Verilog se parece mucho a la programación. Pero no lo es, al menos no en el sentido tradicional. Hay varios sistemas que tienen como objetivo tomar un código C y convertirlo en un lenguaje de descripción de dispositivo. Uno de estos, cynth, es simplemente utilizable y está disponible en GitHub. Deberá instalar un sistema de escala y compilación llamado sbt si desea probarlo.

Hay limitaciones, por supuesto. Si desea un preprocesador, deberá ejecutarlo por separado. No puede usar variables globales, multiplicación, balsas y muchas otras piezas de C. El compilador genera un archivo Verilog para cada función de C.

Un programa tradicional en C hace una cosa a la vez, a menos que utilice técnicas especiales, es decir, en un multiprocesador. Incluso entonces, existe un límite práctico para la cantidad de CPU que probablemente controle. FPGA, por otro lado, le permite implementar cosas que suceden en paralelo. Por ejemplo, considere esto:

while (1)
   {
     out1=ctr1++;
     out2=ctr2++;
   }

El valor out1 cambiará ligeramente antes que el valor in out2. Si tuviera muchos, digamos hasta 1999, el retraso podría ser significativo. El código Verilog equivalente podría verse así:

always @(posedge clk)
begin
   out1<=ctr1;
   ctr1<=ctr1+1;
   out2<=ctr2;
   ctr2<=ctr2+1;
end

Esto se ve casi igual, pero los resultados cambiarán al mismo tiempo, pase lo que pase. Además, todas las demás cosas que no puede ver sucederán a la vez. Así como el hardware Y la puerta de enlace no “escanean” sus entradas, FPGA procesa todas sus entradas y genera salidas.

En el caso de cynth, cada función de C crea un módulo Verilog que tiene los mismos argumentos que la función junto con otro argumento para reemplazar el valor de retorno, si lo hay. También habrá entradas para el reloj del sistema, una señal de control y tres señales de control. Uno es la entrada que habilita el procesamiento. Hay dos resultados. Uno indica que la función está disponible para habilitar y otro indica que un resultado está disponible.

El ejemplo proporcionado por el código es un patrón de ojo Cylon que alimenta cuatro LED. Hay dos funciones externas creadas con Verilog puro. La función write_leds enciende los LED y una función de suspensión produce un retraso.

El código C es una función simple llamada deambular:

 while (1)
 {
 if (dir && c == 8)
 dir = 0;
 else if (!dir && c == 1)
 dir = 1;
 
 if (dir)
 c <<= 1;
 else
 c >>= 1;
 
 write_leds(c);
 
 sleep(1000); // 1s
 }

Los archivos de Verilog correspondientes realizan la misma función que puede verificar con un emulador de Verilog.

Si desea explorar el código generado, puede obtener más información sobre Verilog a través de algunos proyectos. Si C no es lo tuyo, siempre puedes probar Python.

  • Absolutamente automático dice:

    Recuerdo que hace mucho tiempo con algunas herramientas sintéticas de Altera, según su programa (especialmente las asignaciones) podían producir diferentes asignaciones de recursos internos (pestillos, puertas, caminos de metal, etc.) para resultados casi similares. Recuerdo que un profesor le dijo que lo contrataron para optimizar un proyecto (actualización de firmware) que era “más grande” que el chip del hardware ya enviado. Papá finalmente, pudo minimizar el diseño (puertas adecuadas) pero las pistas de metal ya no están disponibles

  • ESTOLA dice:

    Espero que cosas como esta cynth (¿cerilog?) Animen a más personas a utilizar HDL.

    Personalmente, elegí VHDL porque era mucho menos “similar a un programa” en comparación con Verilog.

    Además, no entiendo para qué sirve. Si necesita un proceso secuencial, simplemente use un microcontrolador. Si necesita más velocidad y paralelismo, utilice FPGA.

    Pude entender HDL, que tenía una notación de objeto mascota (OOP) como JavaScript, pero solo con objetos, eventos, ejemplos y posiblemente herencia.

    Realmente, los HDL como VHDL y Verilog * NO * son similares a un lenguaje de programación. Son un modelo sintético.

    El HDL debe despegar en algún momento. Es el costo y el consumo de energía lo que lo hace menos competitivo para la mayoría de las tareas. Pero para algunas tareas FPGA es perfecto y una muy buena habilidad.

    Si tiene que hacer las cosas muy rápido, puede usar un micrófono muy rápido, pero a menudo un micrófono muy rápido no es una ventaja para las otras tareas. R podría usar solo un micrófono normal e insertar un FPGA / CPLD solo para la función de alta velocidad.

    • Al Williams dice:

      Yo personalmente uso Verilog y, a veces, VHDL. Pero puedo ver el atractivo para un programador que solo quiere acelerar alguna función y no quiere luchar con un nuevo lenguaje. La verdadera pregunta es cómo el compilador convierte su código en lógica y si eso se adapta a su propósito o no.

    • Sin personaje dice:

      ¿Puedo sugerir Chisel3 o SpinalHDL? Aprenda un poco sobre Scala, una herramienta de recogida que permite a los desarrolladores de FPGA de peso gallo golpear como pesos pesados. Es por esos dos que tiene un RISC-V a mano y accesible.

  • Lisaparratt dice:

    Recuerdo haber usado Handel-C hace años. La conclusión a la que llegué es que era un concepto bastante malo porque te anima a pensar como un programador en C: linealmente. Eso es * exactamente * lo contrario de cómo debería pensar al diseñar una FPGA.

    El aspecto de HDL como un lenguaje de programación normal ayuda a dar el espacio de cabeza necesario para evitar caer en trampas cómodas y familiares.

    • Mattvenn dice:

      Soy un principiante con HDL, pero todos mis libros que leo enfatizan que ocurren errores cuando HDL se confunde con un lenguaje de programación. Entonces, para mí, escribir en C contradice este consejo.

      • Yann Guidon / YGDES dice:

        Debido a que HDL * IS * Device Description Language, esto / sucede / usa algunos lenguajes de programación porque parece menos desagradable que escribir EDIF directamente.

    • Yann Guidon / YGDES dice:

      Mis modelos más elaborados están co-desarrollados en JavaScript (escritura rápida, rápida y sucia) y VHDL.
      Los sintetizadores altamente avanzados han estado disponibles durante más de 15 años, que toman una descripción avanzada de un sistema (una tubería para calcular términos DSP, por ejemplo) y proporcionan varias implementaciones para probar intercambios rápidos / grandes / costosos. Bueno, no son baratos ni gratuitos, pero ya existen.

      Todo el mundo está intentando reinventar la rueda en lugar de mejorar las existentes.

      Bueno, tratar de mejorar VHDL es peor que morir en una piscina llena solo de patos: es ridículo, doloroso y mucho. Lo intenté en vano, pero no puedo cambiar nada. Pero VHDL ya es tremendamente poderoso y, a pesar de sus extrañas deficiencias, podemos hacer cosas increíbles si nos tomamos el tiempo para verlo.

      Eche un vistazo a GHDL y diviértase con los trucos añadidos (http://ygdes.com/GHDL/), luego intente simular los mismos sistemas con Verilog con un código tan elegante y flexible.

    • CampGareth dice:

      De acuerdo, trabajo en un lugar trabajando en Golang to Verilog (y luego algunas cosas de calidad de vida como una implementación fácil en FPGA alojada por AWS, porque llegar a Verilog es solo la mitad de la batalla). Golang tiene excelentes funciones para el paralelismo, como un cambio de señal para operar en paralelo y canales de comunicación. Tiene mucho más sentido que C imo, pero luego soy partidista.

    • Sin personaje dice:

      Depende de lo que llames trampas cómodas y familiares. Si está hablando de ver el sistema como software, si uso CLaSH (subconjunto de HDL y HLS sintetizables de Haskell, y es REAL), no caería en esas trampas “familiares”. HDL se sincroniza al mismo tiempo … Así que puedes “caer en esas trampas” con Verilog y VHDL, pero tienes la molestia peor que codificar COBOL en la mezcla haciéndolo.

      Al final, DEBE pensar en términos de acción asincrónica y asincrónica, y es principalmente asincrónica, independientemente de lo que esté utilizando.

      La noción C / C ++ / etc. HLS está … oye … dolorosamente pensado porque no tiene éxito y terminas con resultados ineficaces de ese proceso. (No vamos a entrar en el hecho de que ninguno de los proveedores de FPGA ha logrado hacerlo muy bien con SystemVerilog o los aspectos de prueba / sistema de VHDL hasta ahora … ¿por qué confiaría en ellos con HLS? XD)

  • mac012345 dice:

    Al menos si está instalando scala / sbt, pruebe con cincel o spinalHDL. HDL mucho más elegante y moderno, pero auténtico que verilog / VHDL.
    SpinalHDL parece el más prometedor de ambos (mejor característica, biblioteca real), pero cincel tiene más soporte.

    • GuzTech dice:

      +1 para SpinalHDL. Lo he probado un poco y me ha gustado mucho hasta ahora.

      Aquí hay algo que se me ocurrió en 30 minutos:

      • Sin personaje dice:

        Ayudado por SpinalHDL. “Soporte” es un concepto relativo. Chris está en las salas de chat de Gitter para SpinalHDL y VexRiscv y hay algunas otras personas (incluido yo mismo) allí la mayor parte del tiempo. Chisel3 tiene a Berkeley trabajando con él y mejorándolo, pero es un poco más difícil de usar con algunos bordes afilados que podrían morderlo.

  • codigos dice:

    Creo que ni C ni Python son adecuados para FPGA, que es un tipo de programación completamente diferente, más similar a describir el deseo de salida, hacer que * parezca * como C o Python solo lo hará difícil para los principiantes …

    • Nikki dice:

      También fomenta el pensamiento de la misma forma de pensar procedimental que C / Python, en lugar de la forma reactiva y simultánea en la que realmente funcionan los FPGA.

      VHDL y su sintaxis Ada completa no son tan difíciles de aprender.

      • Rollyn01 dice:

        Por extraño que parezca, fue más fácil para mí aprender VHDL que aprender C ++ (todavía estoy tratando de entender la programación orientada a objetos). Aunque puede ser porque aprendí hardware en lugar de software.

    • Nikki dice:

      También fomenta el pensamiento de la misma forma de pensar procedimental que C / Python, en lugar de la forma reactiva y simultánea en la que realmente funcionan los FPGA.

      VHDL y su sintaxis Ada completa no son tan difíciles de aprender.

  • ytmytm dice:

    “El valor out1 cambiará ligeramente antes que el valor in out2”.

    Si está utilizando un compilador C moderno con optimizaciones habilitadas, no hay garantía de eso.

    • Somun dice:

      Muy buen punto. La CPU los reorganizará como desee.

    • Al Williams dice:

      Bueno, claro, pero no sucederán a la vez, de todos modos, a menos que haya hecho algo con varios procesadores y luego su código todavía no se vea así.

  • Yann Guidon / YGDES dice:

    Otro intento más de hacer lo que VHDL ha estado haciendo desde 1987 …

    • Kevin Harrelson dice:

      ¿Gente confundida?

      En serio, usé mucho Verilog y VHDL. Yo prefiero Verilog.

      VHDL tiene algunas ventajas: ninguna declaración de bloque en código sintetizable, ninguna de estas tonterías de “reg contra cable” (que desaparece en SystemVerilog), no hay necesidad de escalas de tiempo, etc.

      Sin embargo, Verilog es mucho más amigable, especialmente porque no tiene que preocuparse por entidades y arquitecturas separadas. Si desea agregar un puerto, solo necesita agregarlo en UN lugar (imagínese eso). También prefiero “7: 0” en lugar de “7 hasta 0” porque escribe mucho menos.

      • ESTOLA dice:

        VHDL es un lenguaje definitivo y Verilog no lo es. Es por eso que ahora tenemos System Verilog. En VHDL las definiciones deben ser completamente definitivo para que no pueda haber ambigüedad. En Verilog puede escribir código ambiguo. El código bilingüe no es posible en VHDL.

        Entonces, verilog es bueno en un ciclo de prueba corto como FPGA, pero dudo mucho que alguien, excepto los más experimentados con Verilog, lo envíe a ASIC fab.

        Mencionaste algunos aspectos de VHDL que son bastante molestos, pero aún así, VHDL se usa más que Verilog. De todos modos, VHDL se puede convertir a Verilog, pero no siempre es tan fácil ir en la otra dirección.

        Cada uno a lo suyo dije. Me gusta VHDL porque he existido lo suficiente como para pensar fácilmente en puertas y registros, para que sea más fácil retrasar la propagación de imágenes y los efectos en la jerarquía del reloj.

        • Megol dice:

          Verilog se utilizó para proyectar una gran cantidad de chips, pero tiene razón: nadie envía código Verilog a una historia. Envían archivos GDS II.

  • Maravilloso dice:

    Aplaudo el esfuerzo, pero esa función de dormir me asusta.

    • Yann Guidon / YGDES dice:

      VHDL tiene funciones de suspensión / espera equivalentes …
      pero operan sólo en partes (procesos) “consecutivas” y tienen un comportamiento bien definido.

  • alksio dice:

    SystemC existe desde hace mucho tiempo. ¿Cómo es esto mejor o más útil? ¿Puedes integrar SystemC con esto?

    https://eo.wikipedia.org/wiki/SystemC
    http://www.asic-world.com/systemc/first1.html#Hello_World_Program

    • Keith Cancel dice:

      Honestamente, al jugar y usar SystemC. Creo que este proyecto sería mejor si apoyara las adiciones de SystemC.

      Incluso Xilinix tiene su propia disposición de síntesis de C. Lo llaman Life-Advanced Synthesis, es compatible con C, C ++ y SystemC.

  • Mike Kentley dice:

    No he probado esta herramienta en particular para transformar C en puertas, pero … arrojaré mi $ .02 porque escuché los mismos argumentos para VHDL / Verilog contra el diseño de nivel de transistor totalmente personalizado durante mis primeros años en el industria. He estado trabajando en muchos chips en los que no se han creado dos transistores iguales y se ha dedicado mucho tiempo y esfuerzo a poner estos chips relativamente simples en la puerta. Parecían, literalmente, obras de arte. Solíamos pensar que ninguna herramienta automática podría hacer un trabajo mejor que un ser humano real.

    Bueno, teníamos razón y nos equivocamos.

    Podríamos empaquetar mejor las puertas manualmente, pero las personas que usan herramientas automatizadas podrían comercializar con Design Compiler mucho más rápido con más funciones.

    No se trata de afeitarse, ya que las puertas son rápidas y económicas para la mayoría de las aplicaciones. Se trata de más funciones integradas, probadas y más rápidas.

    Actualmente, utilizo SystemC todos los días en mi trabajo, con síntesis de comportamiento (herramientas Stratus de Cadence) para producir RTL para FPGA y ASIC. Si bien la sintaxis es C ++, termina escribiendo código para síntesis como si estuviera escribiendo hardware: hay subprocesos y módulos de biblioteca para admitir comportamientos de tiempo específicos de E / S. Las herramientas hacen un trabajo bastante decente al producir RTL. Implementé una pila de host USB en unos pocos miles de líneas de SystemC y la convertí en puertas. Funciona. Puedo quedármelo. Es razonablemente fácil de leer y mantener. Aprendí a codificar el SystemC para que produzca buenas puertas para los tipos de proyectos que hago. Mi código sintetizable se ve diferente a mi código no sintetizable. Descubrí que es bastante fácil obtener el código de otra persona y realizar grandes cambios con un poco de aprendizaje y edición.

    Recomendaría mirar lo que hay por ahí. Las herramientas de Xilinx en particular están diseñadas para integrar sin problemas proyectos C / SystemC a nivel de bloque en un sistema más grande mezclado con VHDL y Verilog.

  • Pekon dice:

    Hola a todos,

    Durante mucho tiempo escribí un tutorial para que los desarrolladores de C entendieran Verilog comparando edificios de C y Verilog. Si alguien está interesado y puede agregar sus conocimientos o sugerencias al enlace a continuación, este tutorial sería una guía reforzada para los nuevos estudiantes de Verilog.

    http://pek-sem.com/wiki/index.php/learning_verilog_like_c

Marco Navarro
Marco Navarro

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *