Synthese Unterschied zwischen den beiden fast identischen verfahrenstechnischen Zuordnung

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?

Hast Du es versucht? Was ist das Ergebnis eines Synthesizerlaufs?
Ich habe kein Synthese-Tool installiert atm
Das ist einfacher zu beheben, als eine Antwort zu schreiben; installiere yosys oder yoWASP und synthetisiere los! Tatsächlich können Sie yosys in Ihrem Browser ausführen: clifford.at/yosys/nogit/YosysJS/snapshot/demo02.html
Denken Sie daran, dass echte Logik nicht mit ? oder X Eingangswerte, sodass die Logik nur unter der Annahme von 0- oder 1-Eingängen ausgelegt ist.
Aufgrund der Art und Weise, wie die Sprache Verilog definiert ist, drücken beide Beispiele genau dieselbe Funktionalität aus. Wenn ein Simulations- oder Synthesetool unterschiedliche Ergebnisse für die beiden Eingaben liefert, ist es defekt.

Antworten (1)

Sie müssen erkennen, dass es viele Möglichkeiten gibt, genau das gleiche funktionale Verhalten in oder einem anderen 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→1beim Verwenden des ersten Beispiels einen Übergang zu haben out. Die Simulation kann nicht garantieren, ob der 0Fehler 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 sX ist, erzeugen beide Beispiele eine 0 auf out.