So vermeiden Sie Latches während der Synthese

9

Ich möchte einen Block kombinatorischer Logik mit VHDL entwerfen, aber gelegentlich enthält das synthetisierte Ergebnis einen unbeabsichtigten Latch.

Welche Codierungsrichtlinien muss ich befolgen, damit der Synthesizer keine Latches ableitet?

Beispiel: Soll ich in einem kleinen Codesegment if-else-Anweisungen verwenden?

W5VO
quelle
Wenn man bekommen könnte, was ich zu fragen versuche, informieren Sie mich bitte
Ich war mir nicht sicher, was Sie mit Ihrem Beispiel meinten. Bitte überprüfen Sie, ob die Umformulierung Ihrer ursprünglichen Absicht entspricht.
W5VO
@fatai, ich habe bereits kommentiert, es gibt eine spezielle Methode zum Löschen Ihres Kontos, die auf meta.stackexchange.com verfügbar ist. Ich habe auf die letzte Frage verlinkt, auf der ich markiert wurde. Moderatoren vor Ort haben diese Macht niemals. Dies erfordert die Kontaktaufnahme mit dem Entwicklerteam.
Kortuk

Antworten:

13

Um Latches zu vermeiden, müssen Sie sicherstellen, dass alle Ihre Ausgaben in allen möglichen Zweigen des Codes zugewiesen sind.

zum Beispiel,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

würde einen Latch erzeugen, da in der ersten Bedingung der Wert von b (1) nicht angegeben ist, sodass der Compiler entschieden hat, dass Sie den vorherigen Wert von b (1) dort behalten möchten. Eine Möglichkeit, dies zu schreiben, ohne dass ein Latch generiert wird, ist:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

Hier geben Sie explizit an, dass b seinen alten Wert beibehalten und dann b (0) mit dem neuen Wert überschreiben soll.

Eine andere Möglichkeit besteht darin, einen Standardwert anzugeben, wie in der Antwort von @ TomiJ.

Wenn Sie den Code veröffentlichen, für den Sie einen Latch erhalten, können wir Ihnen helfen, den spezifischen Grund zu finden.

fbo
quelle
Ich denke nicht, dass Ihr Ansatz b <= beinen Latch vermeiden wird, da der Zustand des Signals immer noch beibehalten werden muss.
Tomi Junnila
Da könntest du recht haben; Ich bin zu sehr an getaktete Logik gewöhnt. Ich werde bearbeiten.
fbo
6

Wenn Sie Prozesse für die kombinatorische Logik verwenden (und ich rate aus diesem Grund davon ab), stellen Sie sicher, dass jeder Pfad durch den Prozess jedem Signal, das der Prozess steuert, etwas zuweist. Keine der Ausgaben kann von einer der Ausgaben vom "letzten Mal" abhängig sein, als der Prozess ausgeführt wurde.

Andernfalls schließen Sie auf einen Latch, da der Prozess beim nächsten Planen den Wert des Signals beibehalten muss, das beim letzten Mal keinen neuen Wert erhalten hat.

Ich bevorzuge es, rein kombinatorische Logik als kontinuierliche Zuweisungen beizubehalten und Prozesse für getaktete Logik zu verwenden, dann bekomme ich keine Latches.

Martin Thompson
quelle
5

Vier Regeln zur Vermeidung von Latches:

  • Lesen Sie nicht aus den Signalen, in die Sie schreiben.
  • Haben Sie eine korrekte Empfindlichkeitsliste (alle Signale, die Sie lesen, sollten in der Empfindlichkeitsliste enthalten sein)
  • Stellen Sie sicher, dass alle Signale, denen Sie schreiben, in jedem Pfad zugeordnet sind. (zum Beispiel: in jedem Zweig einer if-else-Anweisung)
  • Stellen Sie bei Prozessen, die Variablen verwenden, sicher, dass für jede Variable ein Standardwert initialisiert ist, bevor Sie sie lesen (in einer anderen Variablen oder einem anderen Signal).

Wenn Sie mehrere kombinatorische Prozesse haben, stellen Sie außerdem sicher, dass Sie keine Schleife erstellen.

Verschiedene Codierungsstile können Ihnen dabei helfen, diese Regeln einzuhalten, z. B. der Stil in der Antwort von @ TomiJ. Wie @Martin Thompson betont, ist es möglicherweise besser, kombinatorische Logik insgesamt zu vermeiden. Setzen Sie stattdessen alles in einen getakteten Prozess.

Philippe
quelle
+1 Nettes Regelwerk. Würden Sie zustimmen, dass Ihre Regel Nr. 2 (über die Sensitivitätsliste) tatsächlich wichtig ist, um konsistente Ergebnisse zwischen Synthese und Simulationen sicherzustellen, aber keinen wirklichen Unterschied hinsichtlich der Inferenz von Latches macht?
Rick
@rick AFAIK, es gibt keine Garantie dafür, was ein Synthesewerkzeug mit unvollständigen Sensitivitätslisten macht. Der IEEE-Standard für die VHDL-Synthese (1076.6-1999) besagt: "Die Prozessempfindlichkeitsliste muss alle in der Prozessanweisung gelesenen Signale enthalten. Prozesse mit unvollständigen Empfindlichkeitslisten werden nicht unterstützt." Trotzdem weiß ich, dass bestimmte Synthesewerkzeuge (vielleicht alle?) Unvollständige Sensitivitätslisten akzeptieren , aber einfach die Sensitivitätsliste insgesamt ignorieren . Wenn Sie sich auf dieses Verhalten anstatt auf den strengeren IEEE-Standard verlassen würden, wäre Ihre Aussage wahrscheinlich richtig.
Philippe
Danke, das klingt richtig, es würde mein Modell nicht mit diesem Standard konform machen. Es hat mich nur neugierig gemacht, weil alle Synthesewerkzeuge, die ich bisher gesehen habe, die Sensitivitätsliste ignorieren, aber ich habe Gerüchte gehört, dass einige auf Latches schließen könnten.
Rick
3

Wie von @fbo und @Martin Thompson ausgeführt, müssen Sie sicherstellen, dass jedem vom Prozess gesteuerten Signal in jedem Zweig des Prozesses ein Wert zugewiesen wird, und dieser Wert darf nicht vom vorherigen Status eines der Ausgänge abhängig sein des Prozesses.

Der einfachste Weg, dies sicherzustellen, besteht darin, jedem Ausgang zu Beginn des Prozesses einen Standardwert zuzuweisen (z. B. das Beispiel von fbo):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;
Tomi Junnila
quelle
1
Dies ist eine gute Methode, die ich oft benutze. Manchmal kann eine Latch-Warnung jedoch darauf hinweisen, dass Sie vergessen haben, einige Bits zuzuweisen, während diese Methode das Auffinden des Fehlers möglicherweise erschwert. Zum Beispiel, wenn Sie alle Bits eines breiten Signals separat zugewiesen und versehentlich falsch gezählt haben.
fbo
2
Nur in einem kombinatorischen Prozess. In einem getakteten Prozess schließen Sie ein Flipflop, das genau das sein kann, was Sie wollen.
Martin Thompson