Ich habe die folgenden 2 Prozedurzuweisungsblöcke, die sehr ähnliche Aufgaben ausführen.
Erster
reg s, i;
reg out;
always @(*)
begin
out = 0;
if (s) out = i;
end
das Zweite
reg s, i;
reg out;
always @(*)
begin
if (s) out = i;
else out = 0;
end
Sie scheinen mir beide synthetisierbar zu sein (und erzeugen kein Latch), aber der zweite ist eindeutig ein Mux, der erste scheint mehr als ein Mux zu sein, da sogar ein ? oder der x-Wert für das s-Signal macht das Signal so, dass es einen Nullwert hat ... wie würde die synthetisierte Schaltung für das erste aussehen?
Sie müssen erkennen, dass es viele Möglichkeiten gibt, genau das gleiche funktionale Verhalten in verilog oder einem anderen hdl auszudrücken . Die Aufgabe eines Synthesewerkzeugs besteht darin, diese HDL in einen Satz Boolescher Gleichungen und Zustandszuweisungen umzuwandeln. Es reduziert diese Gleichungen auf eine optimale Form und das Endergebnis sollte dasselbe sein.
Die Simulation muss den Code so ausführen, wie er geschrieben ist, und kann nur bestimmte Garantien für sein Verhalten in Bezug auf andere gleichzeitig ablaufende Prozesse geben. Zum Beispiel ist es möglich, 1→0→1
beim Verwenden des ersten Beispiels einen Übergang zu haben out
. Die Simulation kann nicht garantieren, ob der 0
Fehler von anderen Prozessen gesehen wird oder nicht.
Übrigens interpretieren Synthesewerkzeuge keine X-Werte auf Signalen, sie werden nur in Literalen für Don't-Care- Ausdrücke verwendet. Wenn in der Simulation s
X ist, erzeugen beide Beispiele eine 0 auf out
.
asdfex
Hardware-Noob
mmmm
Elliot Alderson
David Tweed