21 / 37 · Konzept
function automatic und wiederverwendbare Ausdrücke
Schreiben Sie zeitlose Funktionen und prüfen Sie Rückgabebreite, Vorzeichen und unabhängige Referenzen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Berechnung wiederverwenden und den Vertrag sichtbar halten
Eine SystemVerilog-Funktion liefert einen Wert, ohne Simulationszeit zu verbrauchen. Verwenden Sie in synthetisierbarer kombinatorischer RTL ausdrückliche Eingänge, belegen Sie den Rückgabewert auf jedem Pfad und vermeiden Sie Verzögerungen und Ereignissteuerung. automatic trennt Argumente und lokale Variablen je Aufruf, erzeugt aber weder Register noch Taktzyklus. Die feste Schleife berechnet die XOR-Parität von acht Bits kombinatorisch.
module parity_function (
input logic [7:0] data,
output logic parity,
output logic [7:0] with_parity
);
function automatic logic parity8(input logic [7:0] value);
logic p;
integer bit_index;
begin
p = 1'b0;
for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
p = p ^ value[bit_index];
parity8 = p;
end
endfunction
assign parity = parity8(data);
assign with_parity = {data[6:0], parity8(data)};
endmodulewith_parity verwirft data[7] und hängt Parität an. Es bleibt acht Bits breit und ist keine Neun-Bit-Codierung, die alle Eingangsdaten erhält. Eine korrekte Funktion kann einen Informationsverlust beim Aufrufer nicht verhindern.
Breite und Vorzeichen der Rückgabe
Hier ist die Rückgabe ein Bit vom Typ logic. Die Summe zweier vorzeichenloser Acht-Bit-Eingänge benötigt zum Erhalt des Übertrags neun Rückgabebits. Ein Funktionsaufruf erweitert weder Ziel noch Übertrag automatisch. Halten Sie Breitenregeln und Konstanten bei der Schnittstelle. Versteckte Abhängigkeiten von veränderlichen globalen Signalen erschweren Wiederverwendung und Prüfung.
Aufrufe bedeuten keine serielle gemeinsame Nutzung
Zwei Aufrufe erzwingen keinen zeitlich geteilten Operator. Die Synthese kann kombinatorische Logik optimieren. Zeitmultiplex benötigt Annahmeprotokoll, Zustand und Ergebniszeitpunkt. Leiten Sie Fläche oder Durchsatz nicht aus der Aufrufzahl ab. Testbench-Tasks dürfen auf Ereignisse warten; Funktionen und zeitbehaftete Tasks haben unterschiedliche Aufgaben. Die nächste Einheit verwendet einen Task für Stimuli an fallenden Flanken und Beobachtung nach steigenden Flanken.
Übung: eine andere Referenz
Für data=0,1,3,8'h80,8'hFF erwarten Sie Parität 0,1,0,1,0. Bei 8'h80 ist with_parity=8'h01, weil das höchste Datenbit entfällt und parity=1. Prüfen Sie alle 256 Werte, indem Sie Einsen in einer Ganzzahl zählen und den Rest modulo 2 bilden, ohne parity8 aus dem DUT aufzurufen. Ändern Sie die Schleifengrenze auf 7:8'h80 muss fehlschlagen, auch wenn kleine Werte den Fehler verdecken. Erweitern Sie danach den Ausgang auf neun Bits mit {data, parity8(data)} und ändern Sie das Modell. Dies ändert die Schnittstelle, keine bloße Darstellung.