2008-09-03 18 views
3

Ich muss eine 4-zu-1-Funktion in Veriog implementieren. Die Eingabe ist 4 Bits, eine Zahl von 0-15. Der Ausgang ist ein einzelnes Bit, 0 oder 1. Jeder Eingang gibt einen anderen Ausgang und die Zuordnung von Eingängen zu Ausgängen ist bekannt, die Ein- und Ausgänge selbst jedoch nicht. Ich möchte, dass VCS den Code erfolgreich optimiert und auch so kurz/sauber wie möglich ist. Meine Lösung so weit:Effiziente Synthese einer 4-zu-1-Funktion in Verilog

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]; 

Das Deklarieren von c ist hässlich und ich weiß nicht, ob vcs die K-map dort erkennt. Funktioniert das ebenso wie eine Fallaussage oder eine Aufgabe in konjunktiver Normalform?

Antwort

5

Was Sie haben, ist in Ordnung. Eine Fallaussage würde auch gleich gut funktionieren. Es ist nur eine Frage, wie ausdrucksstark Sie sein möchten.

Ihre Lösung, Indexierung, funktioniert gut, wenn die Auswahlcodierungen keine spezielle Bedeutung haben (z. B. eine Speicheradressauswahl). Wenn die Select-Codierungen für den Designer eine besondere semantische Bedeutung haben (und es nicht zu viele davon gibt), dann gehen Sie mit einer case-Anweisung und enums.

Syntheseweise ist es egal, welche Sie verwenden. Jedes vernünftige Synthesewerkzeug wird das gleiche Ergebnis liefern.

2

Meine Präferenz - wenn es für Ihr Problem sinnvoll ist - ist für eine Case-Anweisung, die enums verwendet oder definiert. Alles, um Code-Überprüfung, Wartung und Überprüfung zu vereinfachen.

3

Ich stimme völlig mit Dallas überein. Verwenden Sie eine Case-Anweisung - es macht Ihre Absicht klarer. Das Synthesewerkzeug wird es als eine Nachschlagetabelle aufbauen (wenn es parallel ist) und wird alles was es kann optimieren.

Außerdem würde ich mir nicht so viele Sorgen darum machen, Ihren RTL-Code kurz zu halten. Ich würde zuerst für Klarheit drehen. Synthesis-Tools sind klüger als Sie denken ...

2

Für solche Dinge trumpft RTL-Klarheit mit großem Abstand. SystemVerilog hat spezielle immer block Anweisungen, um zu verdeutlichen, wann der Block zu kombinatorischer Logik, Latches oder Flops synthetisieren sollte (und Ihr Synthesetool sollte einen Fehler erzeugen, wenn Sie RTL geschrieben haben, das damit in Konflikt steht (zB nicht alle Signale in der (Sensitivitätsliste eines Always-Blocks.) Beachten Sie auch, dass das Tool wahrscheinlich die Codierung mit der hardware-effizientesten Kodierung ersetzt, die die Fläche des gesamten Designs minimiert, es sei denn, die Kodierung selbst verteilt sich auf die Pins

Dieser Ratschlag gilt auch allgemein: Machen Sie Ihren Code für den Menschen einfach zu verstehen, und es wird wahrscheinlich auch für das Synthese-Tool verständlicher sein, das es effektiver bringt buchstäblich Tausende von Mann-Jahren der Algorithmenforschung auf deinem RTL zu tragen.

Sie können auch ternäre Operatoren codieren, wenn Sie mögen, aber ich würde es vorziehen, so etwas wie:

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 
1

Offenbar ich ein lausiges Synthese-Tool verwenden. :-) Ich synthetisierte nur beide Versionen (nur das Modul mit einem Modell basierend auf Fan-Outs für Draht Verzögerungen) und die Index-Version von der Frage gab bessere Timing und Bereich Ergebnisse als die Fall-Aussagen. Verwenden von Synopsys DC Z-2007.03-SP.