Extra帽a s铆ntesis cuando se trabaja con FPGA

Hoy en d铆a, hay dos de los lenguajes de descripci贸n de hardware m谩s comunes: Verilog / SystemVerilog y VHDL. Los lenguajes de descripci贸n de hardware en s铆 mismos son medios bastante universales, pero 驴es este siempre el caso? 驴Y de qu茅 puede depender la "no universalidad" del lenguaje de descripci贸n de hardware?

La idea de escribir este art铆culo surgi贸 durante la s铆ntesis de un proyecto en diferentes entornos de desarrollo, como resultado de lo cual se obtuvieron resultados diferentes. Dado que el m贸dulo fuente es bastante voluminoso, se escribi贸 un m贸dulo de prueba de un volumen m谩s peque帽o para demostrar los resultados, pero cuya s铆ntesis caus贸 las mismas advertencias / errores. Se utiliz贸 un registro de 4 bits con reinicio as铆ncrono como m贸dulo de prueba, y se eligieron Libero SoC 18.1, Quartus Prime 17.1, Vivado 2017.4.1 como entornos de desarrollo.

Primero, se presenta una variante para describir dicho m贸dulo en el lenguaje Verilog, cuyo texto es percibido correctamente por los entornos de desarrollo seleccionados:

module test1 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= 4'h0 ; end else begin q <= data ; end end endmodule 

Como resultado de la s铆ntesis de este m贸dulo, se obtuvieron los siguientes esquemas:

  1. Libero SoC v11.8

    test1 Libero SoC

  2. Quartus Prime 17.1

    prueba1 cuarto de prima

  3. Vivado 2017.4.1

    test1 vivado


En todos los circuitos sintetizados para la prueba 1, los disparadores D se usaron con una entrada de reinicio inverso (Quartus Prime) o con la adici贸n de un inversor (VERIFIC_INV en el caso de Libero SoC y LUT1 en el caso de Vivado).

驴Ser谩 diferente el circuito sintetizado si se cambia la verificaci贸n de estado del reinicio as铆ncrono? Para hacer esto, cambie el texto del m贸dulo test1 a la descripci贸n del m贸dulo test2:

 module test2 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=data; end else begin q<=4'h0; end end endmodule 

Se puede suponer que la s铆ntesis del m贸dulo test2 no deber铆a diferir de la s铆ntesis del m贸dulo test1, ya que las l贸gicas de la descripci贸n de ambos m贸dulos no se contradicen entre s铆. Sin embargo, la s铆ntesis del m贸dulo test2 condujo a los siguientes resultados:

  1. Libero SoC v11.8
    El circuito se sintetiz贸, pero el siguiente mensaje de advertencia "Borde y condici贸n no coinciden (CG136)" apareci贸 en los mensajes. Esta advertencia indica un desajuste de la lista de sensibilidad y la verificaci贸n de la condici贸n de reinicio. Sin embargo, el circuito sintetizado no es diferente del m贸dulo test1.

    test2 Libero SoC

  2. Quartus Prime 17.1

    La s铆ntesis del circuito fall贸 con el error:

    "Error (10200): error de la declaraci贸n condicional de Verilog HDL en test2.v (10): no se pueden hacer coincidir los operandos en la condici贸n con los bordes correspondientes en el control de eventos de cierre de la construcci贸n siempre". El texto del error es similar a la advertencia emitida por Libero SoC.
  3. Vivado 2017.4.1

    La s铆ntesis del circuito se realiz贸 con la advertencia:

    "[Sintetizador 8-5788] Registrar q_reg en la prueba del m贸dulo tiene tanto Establecer como restablecer con la misma prioridad. Esto puede causar desajustes de simulaci贸n. Considere reescribir el c贸digo ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10]". Similar a Libero SoC y Quartus Prime, se emiti贸 una advertencia similar. Adem谩s, la advertencia dec铆a sobre la posible discrepancia entre los resultados del modelado y el trabajo en el hardware, como resultado de lo cual se propuso reescribir el c贸digo del m贸dulo.

    test2 vivado


Despu茅s de describir los m贸dulos test1 y test2, surgi贸 la idea de verificar qu茅 suceder铆a si sintetizamos el siguiente c贸digo:

 module test3 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @(posedge clk or negedge arst) begin if (arst) begin q<=4'h0; end else begin q<=data; end end endmodule 

La descripci贸n de dicho registro no es l贸gica, ya que el reinicio de los activadores en este caso ocurre cuando la l铆nea de reinicio est谩 inactiva.

Los resultados de la s铆ntesis fueron los siguientes:

  1. Libero SoC v11.8

    La s铆ntesis del circuito no se realiz贸 con el error: "La l贸gica para q [3: 0] no coincide con un flip-flop est谩ndar (CL123)", por lo que se niega a sintetizar el circuito, citando la ausencia del tipo de disparadores necesarios para la s铆ntesis.
  2. Quartus Prime 17.1

    El circuito no se sintetiz贸 con el siguiente error: "Error (10200): error de declaraci贸n condicional HDL de Verilog en test3.v (9): no puede hacer coincidir operando (s) en la condici贸n con los bordes correspondientes en el control de evento de cierre de la construcci贸n siempre" . El texto de este error no difiere del texto de error para el m贸dulo test2.
  3. Vivado 2017.4.1

    El esquema fue sintetizado sin errores:

    test3 vivado


Sin embargo, qu茅 suceder谩 si describimos un m贸dulo en el que la lista de sensibilidad no contradiga la verificaci贸n de la condici贸n de reinicio, pero los disparadores se reinician cuando la l铆nea de reinicio est谩 inactiva, como en el caso de la descripci贸n del m贸dulo test3. La descripci贸n de dicho m贸dulo test4 es la siguiente:

 module test4 ( input clk, input arst, input [3:0] data, output reg [3:0] q ); always @( posedge clk or negedge arst ) begin if ( ~ arst ) begin q <= data ; end else begin q <= 4'h0 ; end end endmodule 

Durante la s铆ntesis, se obtuvieron los siguientes resultados:

  1. Libero SoC v11.8

    La s铆ntesis del circuito se realiz贸 con la advertencia:

    "Se帽al encontrada identificada como reloj del sistema que controla 4 elementos secuenciales, incluido q_1 [3]. El uso de este reloj, que no tiene una restricci贸n de tiempo espec铆fica, puede afectar negativamente el rendimiento del dise帽o. (MT532) ".

    test4 Libero SoC

  2. Quartus Prime 17.1

    Como resultado de la s铆ntesis del circuito, se recibieron advertencias:

    芦Warning (13004): Presettable and clearable registers converted to equivalent circuits with latches. Registers power-up to an undefined state, and DEVCLRn places the registers in an undefined state.
    Warning (13310): Register "q[0]~reg0" is converted into an equivalent circuit using register "q[0]~reg0_emulated" and latch "q[0]~1"
    Warning (13310): Register "q[1]~reg0" is converted into an equivalent circuit using register "q[1]~reg0_emulated" and latch "q[1]~1"
    Warning (13310): Register "q[2]~reg0" is converted into an equivalent circuit using register "q[2]~reg0_emulated" and latch "q[2]~1"
    Warning (13310): Register "q[3]~reg0" is converted into an equivalent circuit using register "q[3]~reg0_emulated" and latch "q[3]~1"禄

    Todas las advertencias descritas anteriormente corresponden al hecho de que se usaron pestillos en lugar de disparadores.

    prueba 4 cuartos primos

  3. Vivado 2017.4.1

    El circuito fue sintetizado con una advertencia:

    "[Sintetizador 8-5788] Registrar q_reg en la prueba del m贸dulo tiene tanto Establecer como restablecer con la misma prioridad. Esto puede causar desajustes de simulaci贸n. Considere reescribir el c贸digo ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11]". El texto de este error repite el texto de error para el m贸dulo test2.

    test4 vivado


De todos los experimentos descritos, se pueden sacar las siguientes conclusiones:

  1. El lenguaje Verilog es un lenguaje de descripci贸n de hardware universal, cuyas limitaciones son las capacidades de los propios entornos de desarrollo;
  2. Para la correcta descripci贸n del equipo, es necesario conocer la sintaxis del lenguaje, as铆 como analizar las listas de advertencias y errores que ocurren en cada etapa de la construcci贸n del proyecto.

Source: https://habr.com/ru/post/es413007/


All Articles