Étrange synthèse en travaillant avec FPGA

Aujourd'hui, il existe deux des langages de description matérielle les plus courants: Verilog / SystemVerilog et VHDL. Les langages de description du matériel eux-mêmes sont des moyens assez universels, mais est-ce toujours le cas? Et de quoi peut dépendre «pas l'universalité» du langage de description matérielle?

L'idée d'écrire cet article est née lors de la synthèse d'un projet dans différents environnements de développement, à la suite de quoi différents résultats ont été obtenus. Comme le module source est assez volumineux, un module de test plus petit a été écrit pour démontrer les résultats, mais dont la synthèse a provoqué les mêmes avertissements / erreurs. Un registre 4 bits avec réinitialisation asynchrone a été utilisé comme module de test, et Libero SoC 18.1, Quartus Prime 17.1, Vivado 2017.4.1 ont été choisis comme environnements de développement.

Tout d'abord, une variante de description d'un tel module en langage Verilog est présentée, dont le texte est correctement perçu par les environnements de développement sélectionnés:

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 

À la suite de la synthèse de ce module, les schémas suivants ont été obtenus:

  1. Libero SoC v11.8

    test1 Libero SoC

  2. Quartus Prime 17.1

    test1 quartus prime

  3. Vivado 2017.4.1

    test1 vivado


Dans tous les circuits synthétisés pour test1, les déclencheurs D ont été utilisés soit avec une entrée de réinitialisation inverse (Quartus Prime) soit avec l'ajout d'un onduleur (VERIFIC_INV dans le cas de Libero SoC et LUT1 dans le cas de Vivado).

Le circuit synthétisé sera-t-il différent si la vérification d'état de la réinitialisation asynchrone est modifiée? Pour ce faire, remplacez le texte du module test1 par la description du module 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 

On peut supposer que la synthèse du module test2 ne doit pas différer de la synthèse du module test1, car les logiques de description des deux modules ne se contredisent pas. Cependant, la synthèse du module test2 a conduit aux résultats suivants:

  1. Libero SoC v11.8
    Le circuit a été synthétisé, mais le message d'avertissement suivant «Incompatibilité de bord et de condition (CG136)» est apparu dans les messages. Cet avertissement indique une incompatibilité de la liste de sensibilité et une vérification de la condition de réinitialisation. Cependant, le circuit synthétisé n'est pas différent du module test1.

    test2 Libero SoC

  2. Quartus Prime 17.1

    La synthèse du circuit a échoué avec l'erreur:

    "Erreur (10200): erreur de l'instruction conditionnelle Verilog HDL à test2.v (10): ne peut pas faire correspondre les opérandes de la condition aux bords correspondants dans le contrôle d'événement englobant de la construction Always." Le texte d'erreur est similaire à l'avertissement émis par Libero SoC.
  3. Vivado 2017.4.1

    La synthèse du circuit a été réalisée avec l'avertissement:

    "[Synth 8-5788] Le registre q_reg dans le test de module est à la fois défini et réinitialisé avec la même priorité. Cela peut entraîner des décalages de simulation. Envisagez de réécrire le code ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10]." Semblable à Libero SoC et Quartus Prime, un avertissement similaire a été émis. En outre, l'avertissement indiquait la possible divergence entre les résultats de la modélisation et le travail dans le matériel, à la suite de quoi il a été proposé de réécrire le code du module.

    test2 vivado


Après avoir décrit les modules test1 et test2, l'idée est venue de vérifier ce qui se passerait si nous synthétisions le code suivant:

 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 description d'un tel registre n'est pas logique, car la réinitialisation des déclencheurs se produit dans ce cas lorsque la ligne de réinitialisation est inactive.

Les résultats de la synthèse sont les suivants:

  1. Libero SoC v11.8

    La synthèse du circuit n'a pas été effectuée avec l'erreur: «La logique pour q [3: 0] ne correspond pas à une bascule standard (CL123)», refusant ainsi de synthétiser le circuit, citant l'absence du type de déclencheurs nécessaires à la synthèse.
  2. Quartus Prime 17.1

    Le circuit n'a pas été synthétisé avec l'erreur suivante: «Erreur (10200): erreur de déclaration conditionnelle Verilog HDL à test3.v (9): ne peut pas faire correspondre les opérandes dans la condition aux bords correspondants dans le contrôle d'événement englobant de la construction Always» . Le texte de cette erreur ne diffère pas du texte d'erreur du module test2.
  3. Vivado 2017.4.1

    Le schéma a été synthétisé sans erreur:

    test3 vivado


Cependant, que se passera-t-il si nous décrivons un module dans lequel la liste de sensibilité ne contredit pas la vérification de la condition de réinitialisation, mais les déclencheurs sont réinitialisés lorsque la ligne de réinitialisation est inactive, comme dans le cas de la description du module test3. La description d'un tel module test4 est la suivante:

 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 

Au cours de la synthèse, les résultats suivants ont été obtenus:

  1. Libero SoC v11.8

    La synthèse du circuit a été réalisée avec l'avertissement:

    «Signal trouvé identifié comme horloge système qui contrôle 4 éléments séquentiels, y compris q_1 [3]. L'utilisation de cette horloge, qui n'a pas de contrainte de temps spécifiée, peut nuire aux performances de conception. (MT532). "

    test4 Libero SoC

  2. Quartus Prime 17.1

    À la suite de la synthèse du circuit, des avertissements ont été reçus:

    «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"»

    Tous les avertissements décrits ci-dessus correspondent au fait que des verrous ont été utilisés à la place des déclencheurs.

    test4 quartus prime

  3. Vivado 2017.4.1

    Le circuit a été synthétisé avec un avertissement:

    "[Synth 8-5788] Le registre q_reg dans le test de module est à la fois défini et réinitialisé avec la même priorité. Cela peut entraîner des décalages de simulation. Envisagez de réécrire le code ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11]." Le texte de cette erreur répète le texte d'erreur du module test2.

    test4 vivado


De toutes les expériences décrites, les conclusions suivantes peuvent être tirées:

  1. Le langage Verilog est un langage de description matérielle universel, dont les limites sont les capacités des environnements de développement eux-mêmes;
  2. pour la description correcte de l'équipement, il est nécessaire de connaître la syntaxe du langage, ainsi que d'analyser les listes d'avertissements et d'erreurs qui se produisent à chaque étape de la construction du projet.

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


All Articles