Frage

Ich muss eine 4-zu-1-Funktion in Veriog implementieren.Die Eingabe besteht aus 4 Bits, einer Zahl von 0-15.Die Ausgabe ist ein einzelnes Bit, 0 oder 1.Jede Eingabe liefert eine andere Ausgabe und die Zuordnung von Eingaben zu Ausgaben ist bekannt, die Eingaben und Ausgaben selbst jedoch nicht.Ich möchte, dass vcs den Code erfolgreich optimiert und ihn so kurz/sauber wie möglich macht.Meine Lösung bisher:

wire [3:0] a;
wire b;
wire [15:0] c;

assign c = 16'b0100110010111010; //for example but could be any constant
assign b = c[a];

C deklarieren zu müssen ist hässlich und ich weiß nicht, ob vcs die K-Map dort erkennt.Funktioniert dies genauso gut wie eine Fallaussage oder eine Aufgabe in konjunktiver Normalform?

War es hilfreich?

Lösung

Was Sie haben, ist in Ordnung.Eine Fallerklärung würde auch genauso gut funktionieren.Es kommt nur darauf an, wie ausdrucksstark Sie sein möchten.

Ihre Lösung, die Indizierung, funktioniert einwandfrei, wenn die ausgewählten Codierungen keine besondere Bedeutung haben (z. B. einen Speicheradressenselektor).Wenn die ausgewählten Kodierungen für Sie als Designer eine besondere semantische Bedeutung haben (und es davon nicht allzu viele gibt), verwenden Sie eine case-Anweisung und Aufzählungen.

Was die Synthese angeht, spielt es keine Rolle, welches Sie verwenden.Jedes anständige Synthesetool liefert das gleiche Ergebnis.

Andere Tipps

Ich stimme Dallas voll und ganz zu.Verwenden Sie eine Fallaussage – sie macht Ihre Absicht klarer.Das Synthesetool erstellt es als Nachschlagetabelle (sofern es parallel ist) und optimiert alles, was es kann.

Außerdem würde ich mir nicht so viele Gedanken darüber machen, Ihren RTL-Code kurz zu halten.Ich würde zuerst auf Klarheit achten.Synthesewerkzeuge sind cleverer als Sie denken ...

Ich bevorzuge – wenn es für Ihr Problem sinnvoll ist – eine case-Anweisung, die Aufzählungen oder „defines“ verwendet.Alles, was die Überprüfung, Wartung und Verifizierung des Codes erleichtert.

Bei solchen Dingen übertrifft die Klarheit von RTL alle mit großem Abstand.SystemVerilog verfügt über spezielle Always-Block-Anweisungen, um klarzustellen, wann der Block zu kombinatorischer Logik, Latches oder Flops synthetisiert werden soll (und Ihr Synthesetool sollte einen Fehler auslösen, wenn Sie RTL geschrieben haben, das damit in Konflikt steht (z. B.(nicht alle Signale in die Empfindlichkeitsliste eines Always-Blocks aufnehmen).Beachten Sie auch, dass das Tool wahrscheinlich Ihre gesamte Codierung durch die hardwareeffizienteste Codierung ersetzt (diejenige, die den Bereich Ihres gesamten Designs minimiert), es sei denn, die Codierung selbst wird an die Pins Ihres Moduls der obersten Ebene weitergegeben.

Dieser Rat gilt auch allgemein.Sorgen Sie dafür, dass Ihr Code für Menschen leicht verständlich ist, und er wird wahrscheinlich auch für das Synthesetool verständlicher sein, was ihm eine effektivere Umsetzung ermöglicht Tausende Mannjahre an Algorithmenforschung, die sich auf Ihr RTL auswirken.

Sie können es auch mit ternären Operatoren codieren, wenn Sie möchten, aber ich würde so etwas bevorzugen:

always_comb //or "always @*" if you don't have an SV-enabled tool flow
begin 
  case(a)
  begin
    4'b0000: b = 1'b0;
    4'b0001: b = 1'b1;
    ...
    4'b1111: b = 1'b0;
    //If you don't specify a "default" clause, your synthesis tool
    //Should scream at you if you didn't specify all cases,
    //Which is a good thing (tm)
  endcase //a
end //always

Anscheinend verwende ich ein mieses Synthesetool.:-) Ich habe gerade beide Versionen synthetisiert (nur das Modul, das ein Modell verwendet, das auf Fan-Outs für Leitungsverzögerungen basiert) und die Indizierungsversion aus der Frage lieferte bessere Timing- und Flächenergebnisse als die Case-Anweisungen.Verwendung von Synopsys DC Z-2007.03-SP.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top