Seltsame Synthese bei der Arbeit mit FPGA

Heute gibt es zwei der häufigsten Hardwarebeschreibungssprachen: Verilog / SystemVerilog und VHDL. Die Hardwarebeschreibungssprachen selbst sind ziemlich universelle Mittel, aber ist dies immer der Fall? Und wovon kann „nicht Universalität“ der Hardwarebeschreibungssprache abhängen?

Die Idee, diesen Artikel zu schreiben, entstand während der Synthese eines Projekts in verschiedenen Entwicklungsumgebungen, wodurch unterschiedliche Ergebnisse erzielt wurden. Da das Quellmodul ziemlich umfangreich ist, wurde ein Testmodul mit kleinerem Volumen geschrieben, um die Ergebnisse zu demonstrieren, dessen Synthese jedoch dieselben Warnungen / Fehler verursachte. Als Testmodul wurde ein 4-Bit-Register mit asynchronem Reset verwendet, und Libero SoC 18.1, Quartus Prime 17.1, Vivado 2017.4.1 wurden als Entwicklungsumgebungen ausgewählt.

Zunächst wird eine Variante zur Beschreibung eines solchen Moduls in der Verilog-Sprache vorgestellt, deren Text von den ausgewählten Entwicklungsumgebungen korrekt wahrgenommen wird:

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 

Als Ergebnis der Synthese dieses Moduls wurden die folgenden Schemata erhalten:

  1. Libero SoC v11.8

    test1 Libero SoC

  2. Quartus Prime 17.1

    test1 quartus prime

  3. Vivado 2017.4.1

    test1 vivado


In allen synthetisierten Schaltkreisen für Test1 wurden D-Trigger entweder mit einem inversen Reset-Eingang (Quartus Prime) oder mit einem zusätzlichen Wechselrichter (VERIFIC_INV im Fall von Libero SoC und LUT1 im Fall von Vivado) verwendet.

Wird die synthetisierte Schaltung anders sein, wenn die Statusprüfung des asynchronen Zurücksetzens geändert wird? Ändern Sie dazu den Text des Moduls test1 in die Beschreibung des Moduls 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 

Es ist davon auszugehen, dass sich die Synthese des Moduls test2 nicht von der Synthese des Moduls test1 unterscheiden sollte, da sich die Logik der Beschreibung beider Module nicht widerspricht. Die Synthese des Moduls test2 führte jedoch zu folgenden Ergebnissen:

  1. Libero SoC v11.8
    Die Schaltung wurde synthetisiert, aber die folgende Warnmeldung "Edge and Condition Mismatch (CG136)" wurde in den Meldungen angezeigt. Diese Warnung zeigt eine Nichtübereinstimmung der Empfindlichkeitsliste und die Überprüfung des Rücksetzzustands an. Die synthetisierte Schaltung unterscheidet sich jedoch nicht vom Modul test1.

    test2 Libero SoC

  2. Quartus Prime 17.1

    Die Synthese der Schaltung schlug mit dem Fehler fehl:

    "Fehler (10200): Verilog HDL-Fehler bei bedingten Anweisungen bei test2.v (10): Operand (en) in der Bedingung können nicht mit den entsprechenden Kanten in der umschließenden Ereignissteuerung des Always-Konstrukts abgeglichen werden." Der Fehlertext ähnelt der Warnung von Libero SoC.
  3. Vivado 2017.4.1

    Die Synthese der Schaltung wurde mit der Warnung durchgeführt:

    "[Synth 8-5788] Das Register q_reg im Modultest hat sowohl das Setzen als auch das Zurücksetzen mit derselben Priorität. Dies kann zu Fehlanpassungen bei der Simulation führen. Überlegen Sie, ob Sie den Code ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test2.v":10] neu schreiben möchten." Ähnlich wie bei Libero SoC und Quartus Prime wurde eine ähnliche Warnung ausgegeben. Darüber hinaus wurde in der Warnung auf die mögliche Diskrepanz zwischen den Ergebnissen der Modellierung und der Arbeit in der Hardware hingewiesen, weshalb vorgeschlagen wurde, den Modulcode neu zu schreiben.

    test2 vivado


Nach der Beschreibung der Module test1 und test2 kam die Idee auf, zu prüfen, was passieren würde, wenn wir den folgenden Code synthetisieren würden:

 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 

Die Beschreibung eines solchen Registers ist nicht logisch, da das Zurücksetzen von Triggern in diesem Fall erfolgt, wenn die Rücksetzleitung inaktiv ist.

Die Syntheseergebnisse waren wie folgt:

  1. Libero SoC v11.8

    Die Schaltungssynthese wurde nicht mit dem Fehler durchgeführt: "Die Logik für q [3: 0] stimmt nicht mit einem Standard-Flipflop (CL123) überein", wodurch die Synthese der Schaltung verweigert wurde, da die für die Synthese erforderlichen Trigger nicht vorhanden waren.
  2. Quartus Prime 17.1

    Die Schaltung wurde nicht mit dem folgenden Fehler synthetisiert: "Fehler (10200): Fehler der Verilog HDL-Bedingungsanweisung bei test3.v (9): Operand (en) in der Bedingung können nicht mit den entsprechenden Kanten in der umschließenden Ereignissteuerung des Always-Konstrukts abgeglichen werden." . Der Text dieses Fehlers unterscheidet sich nicht vom Fehlertext für das Modul test2.
  3. Vivado 2017.4.1

    Das Schema wurde fehlerfrei synthetisiert:

    test3 vivado


Was passiert jedoch, wenn wir ein Modul beschreiben, bei dem die Empfindlichkeitsliste der Überprüfung der Rücksetzbedingung nicht widerspricht, die Trigger jedoch zurückgesetzt werden, wenn die Rücksetzleitung inaktiv ist, wie im Fall der Modulbeschreibung test3. Die Beschreibung eines solchen test4-Moduls lautet wie folgt:

 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 

Während der Synthese wurden die folgenden Ergebnisse erhalten:

  1. Libero SoC v11.8

    Die Synthese der Schaltung wurde mit der Warnung durchgeführt:

    „Gefundenes Signal als Systemuhr identifiziert, die 4 aufeinanderfolgende Elemente steuert, einschließlich q_1 [3]. Die Verwendung dieser Uhr, für die keine zeitliche Einschränkung festgelegt wurde, kann sich nachteilig auf die Entwurfsleistung auswirken. (MT532).

    test4 Libero SoC

  2. Quartus Prime 17.1

    Als Ergebnis der Synthese der Schaltung wurden Warnungen empfangen:

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

    Alle oben beschriebenen Warnungen entsprechen der Tatsache, dass Latches anstelle von Triggern verwendet wurden.

    test4 quartus prime

  3. Vivado 2017.4.1

    Die Schaltung wurde mit einer Warnung synthetisiert:

    "[Synth 8-5788] Das Register q_reg im Modultest hat sowohl das Setzen als auch das Zurücksetzen mit derselben Priorität. Dies kann zu Fehlanpassungen bei der Simulation führen. Überlegen Sie, ob Sie den Code ["/home/vlasovdv0111/project_1/project_1.srcs/sources_1/new/test.v":11] neu schreiben möchten." Der Text dieses Fehlers wiederholt den Fehlertext für das Modul test2.

    test4 vivado


Aus allen beschriebenen Experimenten können folgende Schlussfolgerungen gezogen werden:

  1. Die Verilog-Sprache ist eine universelle Hardwarebeschreibungssprache, deren Einschränkungen in den Funktionen der Entwicklungsumgebungen selbst liegen.
  2. Für die korrekte Beschreibung der Ausrüstung ist es erforderlich, die Syntax der Sprache zu kennen und die Listen der Warnungen und Fehler zu analysieren, die in jeder Phase des Projektaufbaus auftreten.

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


All Articles