std_logic oder std_ulogic?

24

Es scheint, dass die Welt entschieden hat, dass std_logic(und std_logic_vector) die Standardmethode für die Darstellung von Bits in VHDL sind. Die Alternative wäre std_ulogic, die nicht gelöst wird.

Das überrascht mich , weil in der Regel, sind Sie nicht eine Beschreibung von Bus , so dass Sie tun Sie nicht wollen , mehrere Treiber und Sie nicht brauchen , zu lösen ein Signal aus . Der Vorteil std_ulogicwäre, dass der Compiler Sie frühzeitig warnt, wenn Sie mehrere Treiber haben.

Frage: Ist das nur eine kulturhistorische Sache oder gibt es noch technische Gründe, std_logic zu verwenden?

Philippe
quelle
3
Die Welt ist falsch. Intelligente Ingenieure verwenden std_ulogic, weil es die richtige Semantik hat.
WJL
@wjl Ich interpretiere das als "es ist eine kulturhistorische Sache". Ihre Antwort unten ist viel hilfreicher als der Kommentar hier oben.
Philippe
Ich habe den Kommentar zuerst geschrieben und dann gedacht, dass es angemessener wäre, eine Antwort mit genaueren Angaben zu hinterlassen. Tut mir leid, ich denke, es klingt ein wenig leichtfertig. Mein Kommentar ist insofern wörtlich, als die meisten Leute anfangen, std_logic zu verwenden, weil sie es auf diese Weise gelernt haben, und sich nach einer Weile über std_ulogic wundern, es nachschlagen, erkennen, dass es semantisch ist, und es dann konvertieren. =)
wjl

Antworten:

16

Std_logic ist ein Subtyp von std_ulogic und hat genau eine zusätzliche Eigenschaft: Es wird aufgelöst, wenn mehrere Treiber vorhanden sind.

Unabhängig von der üblichen Vorgehensweise ist std_ulogic der richtige Typ für nicht aufgelöste Signale, die eine 9-wertige Logik benötigen. (Oft ist die Verwendung von "bit" sogar noch korrekter - zum Beispiel bei einigen FPGA-Architekturen, die kein "X" oder "U" haben.)

Grundsätzlich ist es am besten, den richtigen Typ für den Job zu verwenden. Oft werden schlechte Praktiken von Leuten verbreitet, die nur den Stil nachahmen, den andere verwenden, ohne zu verstehen, warum.

wjl
quelle
8
Die Architektur hat möglicherweise kein 'U', aber es ist oft nützlich zu simulieren, als ob dies der Fall wäre, da Sie falsche Initialisierungen finden können. +1 für "das Beste, was zu tun ist, verwenden Sie den richtigen Typ für den Job", aber wir neigen dazu, zu lernen, wie wir gehen, was "am besten" :)
Martin Thompson
8

Meine Geschichte ist folgende:

Ich habe angefangen (ungefähr 1999 IIRC) die std_ulogic*ganze Zeit damit zu arbeiten - weil es das Richtige ist, nur aus den von Ihnen beschriebenen Gründen.

Dann musste ich eine Schnittstelle zu einer Reihe von Wizard generierten Vendor-IPs herstellen, die alle über die std_logicgesamte Schnittstelle verteilt waren. Was bedeutete, dass die Port-Zuordnungen (für die _vectorElemente) konvertiert wurden , und ich wurde faul und wechselte zur Verwendung std_logic*.

Allerdings mache ich anscheinend nur sehr wenige "Doppelfahrer" -Fehler, sodass ich nicht std_ulogicso viel verpasst habe, wie ich gedacht hätte. Und Modelsims driversBefehl macht es sehr einfach, "wer fährt was" zu finden, wenn ich gelegentlich ...

Martin Thompson
quelle
Ja, IP-Cores (und insbesondere solche, die automatisch aus Verilog übersetzt werden) verwenden in der Regel std_logic. Ihre Antwort scheint darauf hinzudeuten, dass der Grund hauptsächlich "kulturhistorisch" ist.
Philippe
Sie müssen auf Ports niemals zwischen std_logic und std_ulogic konvertieren. Meinten Sie, Sie mussten zwischen std_logic_vector und std_ulogic_vector konvertieren?
WJL
@wjl: sorry ja das habe ich gemeint Ich werde den Beitrag aktualisieren.
Martin Thompson
AFAIK, std_logic und std_ulogic sind zuweisungskompatibel, da sie denselben Basistyp haben. Daher sollte keine manuelle Konvertierung erforderlich sein.
Val
@Val: das ist was wjl gesagt hat (und ich stimme dem zu) - aber die Portteile *vectormüssen noch umgebaut werden
Martin Thompson
4

IIRC Das berühmte Handbuch zur Wiederverwendung von Methoden wird empfohlen std_logic(_vector), sodass möglicherweise Methodengruppen in Unternehmen usw. dies in Form von (obligatorischen) Codierungsleitfäden weiter verbreiten. Persönlich +1 für die Verwendung, std_ulogicwenn möglich.

cmarqu
quelle