Zuweisen von x in verilog

Angenommen, es gibt einen 1-Bit-Datenausgangsport und einen 1-Bit-dataValid-Ausgangsport für ein Modul. Ist es in Ordnung, der Datenausgabe 1'dx zuzuweisen, wenn dataValid 0 zugewiesen wird? Wird dies zu Syntheseproblemen führen?

BEARBEITEN: X-Optimierungen scheinen sowohl in Synopsys DC als auch in Cadence RC zu erfolgen. Betrachten Sie diesen Code (a und b sind 1-Bit-Eingänge und c ist ein 1-Bit-Ausgang).

always_comb
if ( !a && !b ) c= 0;
else if ( a && !b ) c = 1;
else if ( !a && b ) c = 1;
else c = 1'dx; // Don't care about this value.

ergibt ein ODER-Gatter, das eine optimierte Lösung im Gegensatz zu einem XOR ist, das gefolgert worden wäre, wenn c auf 1'd0 gesetzt worden wäre. Dies ist ein einfaches Beispiel, aber es scheint zu beweisen, dass Synthesewerkzeuge eine X-Optimierung durchführen. Sind X-Zuweisungen in Anbetracht der fiesen X-Propagationsfehler und Verifizierungsprobleme den eingesparten Bereich wert?

OR ist wahrscheinlich nicht mehr oder weniger effizient als XOR. Ich denke, der einzige Grund, warum XOR gewählt wird, ist, dass der if-elseif-elseif-Baum in eine Reihe von Multiplexern konvertiert wird, wobei das letzte Elseif ignoriert wird, was zu dem Wert in der vorletzten Elseif-Anweisung führt. Wenn Sie die vorletzte Zeile erstellen else if ( !a && b ) c = 0;, würde dies wahrscheinlich dazu führen, dass Sie c0 sind, wenn aund b1 sind

Antworten (4)

Weisen Sie niemals ein X in einem erreichbaren Codepfad zu, verwenden Sie X nur zum Propagieren von Simulationsunbekannten. Das wird das Leben auf Dauer etwas einfacher machen. Wenn Sie die don-t-care-Logik optimieren möchten, tun Sie dies explizit (und wählen Sie den optimalen Wert für den unbenutzten Zustand). Auf diese Weise erhalten Sie häufiger (hoffentlich immer) ein konsistentes Verhalten.

In einigen Fällen ist es sehr schwierig, die einfachste Implementierung zu identifizieren, und es kann den Code sehr verwirrend machen. Warum sollten Sie sich auch die Mühe machen, wenn das Tool dies für Sie tun kann?
Wenn Sie wissen, was Sie tun, kann es in Ordnung sein. Andernfalls kann defensiver Code sicherer und zuverlässiger sein. Es sei denn, Sie haben einen erschöpfenden Beweis der Korrektheit.
Ich bevorzuge zuverlässigen Code gegenüber Mikrooptimierung.
Obwohl ich dieser Philosophie zustimme, bin ich nicht davon überzeugt, dass sie hier zutrifft. Ich nehme an, das Problem, das Sie sehen, ist, dass die Verwendung von don't cares Ihnen eine Schaltung geben könnte, die '0 für einen bestimmten Satz von Eingängen in einer Zusammenstellung und dann '1 in der nächsten erzeugt. Wenn Sie diese Bedingung in der Simulation treffen und 'x-Propagation erhalten, sehen Sie das Problem sofort. Wenn Sie die Bedingung nicht erfüllen, was stellt Sie sicher, dass das von Ihnen codierte Verhalten ('0, '1, der alte Registerwert usw.) das richtige Verhalten liefert?
X in der Simulation wird nicht automatisch abgeholt. Ich kann Ihnen versichern, dass echte Designs mit umfassender Validierung seltsame Fehler aufdecken oder zu abweichenden Errata führen können - daher der "Fehler auf der Seite der Vorsicht".

Eine solche Zuordnung ist während der Simulation nützlich, um die Wellenform-Plots etwas klarer zu machen.

Die meisten Synthesewerkzeuge ignorieren einfach jede Zuweisung an x. YMMV.

Die Zuweisung zu einem externen Pin kann verwendet werden, um einen Tristate-Treiber zu bezeichnen, aber die meisten FPGAs unterstützen internez Tristate-Busse , wenn überhaupt, nur eingeschränkt .

Welche Synthesewerkzeuge ignorieren Zuweisungen an 'x'? Für 'z haben moderne FPGAs im Allgemeinen keine internen Tristate-Busse, wie Sie sagen, aber die Tools unterstützen im Allgemeinen immer noch Tristate-Busmodelle und synthetisieren sie zu Multiplexern.
@pc3e: Alle, soweit ich weiß. Kennen Sie welche, die das nicht tun?
Alle von ihnen, soweit ich weiß;) Siehe meine Antwort. Welche Tools verwenden Sie?
@pc3e: Ihre Antwort spricht von Simulation, die ich in meinem allerersten Satz behandelt habe.
Ich beziehe mich auf Synopsys Design Compiler, Altera Quartus und Xilinx Vivado, die alle Synthesewerkzeuge sind.
@pc3e: Alle decken sowohl die Synthese als auch die Simulation ab, die unterschiedliche Prozesse sind.
Design Compiler ist kein Simulator, Quartus auch nicht. Ich spreche von Synthesewerkzeugen, die 'x so behandeln, als wäre es ihnen egal, wenn sie das Design optimieren. Meine Antwort betrifft teilweise die Simulation, da in der Frage Probleme mit der 'x-Ausbreitung erwähnt werden. Wollen Sie mir sagen, welches Synthesewerkzeug Sie gesehen haben, wie es Zuweisungen an 'x' ignoriert hat?
Nein. Mir fällt immer noch kein einziges Beispiel dafür ein, wie eine solche Zuordnung den geringsten Unterschied in der synthetisierten Logik bewirken könnte, also mache ich das nie in der Praxis. Wenn Sie ein konkretes Beispiel dafür zeigen können, wie es hilft, sollten Sie es in Ihre Antwort einfügen, und ich werde meine Aussage zurückziehen.
Es gibt ein einfaches Beispiel in der Frage. Übrigens behauptet er, dass Cadence auch 'x optimiert, also glaube ich, dass das die vier besten Tools abdeckt.

Die Tool-Unterstützung für 'xas don't care scheint ziemlich gut zu sein. DC unterstützt es ebenso wie Intel FPGA (Altera) und Xilinx-Tools.

Ich finde es generell eine gute Idee. In der Regel und für Ihr Beispiel 'xsollte die Weitergabe in der Simulation nicht stattfinden, da sich andere Logik nicht darum kümmern sollte, was der Wert von cunter den Bedingungen ist, die schreiben 'x. (Ansonsten ist es nicht "egal", oder?) Tatsächlich kann die Verwendung von 'x, wenn Sie glauben, dass der Wert keine Rolle spielt, beim Identifizieren von Fehlern helfen.

Es gibt jedoch Fälle, in denen es zu Problemen kommen kann. Beispielsweise verwenden serielle Transceiver-Protokolle häufig selbstsynchronisierende Scrambler, die in der Simulation zusammenbrechen würden, wenn einige der Bits in den Eingangsdaten sind 'x, selbst wenn es Ihnen egal ist, wie diese Bits im Empfänger enden, selbst wenn es so ist funktioniert gut in der Hardware.

Es gibt nichts als X für die Synthese. Es wird hauptsächlich für die Simulation verwendet, um Probleme im Zusammenhang mit Datenleitungen zu erfassen.