Ich habe VHDL-Code in diese Richtung (Erklärung unten):
architecture arc of anEntity is
signal x1_sig : T;
signal x2_sig : T2;
function test(x1: T, x2: T2) return boolean is
begin
if complicatedConditionWith x1 and x2 then
return true;
else
return false;
end if;
end function;
begin
p1: process (...) is
impure function test return boolean is
begin
return test(x1_sig,x2_sig);
end function;
begin
...
if test then --occurs several times
...
end process;
end architecture;
Um das Schreiben und die Lesbarkeit zu erleichtern, habe ich eine komplizierte Bedingung in eine Funktion eingefügt. Da ich faul bin und immer dasselbe signals
mit dieser Funktion verwende, habe ich dem Prozess eine Abkürzung hinzugefügt, bei der ich diese Funktion hauptsächlich verwende. Modelsim beschwerte sich jedoch über Zugriffe auf ein Signal von einer pure
Funktion, also fügte ich den impure
Modifikator hinzu. Meines Wissens sagt dies dem Compiler, dass die Funktion Nebenwirkungen haben könnte, obwohl ich meine const
Funktion als frei von Nebenwirkungen betrachte, da ich auf alles nur lesend zugreife (in c könnte man die Funktionsparameter als definieren). Könnte die Zugabe von impure
negative Nebenwirkungen auf das Syntheseergebnis haben?
Eine "reine" Funktion hat nicht nur keine Nebenwirkungen, sondern gibt auch jedes Mal dasselbe Ergebnis zurück, wenn sie mit denselben Argumenten ausgewertet wird. Dies ist wichtig, um Optimierungen zu ermöglichen: Der Compiler darf das Ergebnis zwischenspeichern, es außerhalb der inneren Schleife berechnen, Berechnungen neu anordnen usw., ohne die Korrektheit zu beeinträchtigen.
Eine Funktion, die ein Signal liest (wenn Sie es aktualisieren würden, wäre das ein Nebeneffekt!), gibt abhängig von diesem Signalwert Ergebnisse zurück, daher kann es nicht rein sein. Es als unrein zu deklarieren ist richtig und wird die Syntheseergebnisse nicht beeinflussen.
(Wahrscheinlich besser ist es, es rein zu halten und das Signal als Parameter weiterzugeben; wenn dies jedoch zu Unordnung führt und die Lesbarkeit behindert, ist der aktuelle Ansatz besser.)
Justin
complicatedConditionWith x1 and x2
Was passiert, wenn Sie durch eine einfache Bedingung ersetzen ?ted
x1.state = READY_S or (x1.state = WAITMEM_S and x2.writeReady='1') or (x1.state = FETCHMEM_S and x2.check='1')
) Wenn Sie mir sagen könnten, wie Sie hoffen, dass eine Änderung der Bedingung meine Frage beantworten könnte, geht es um die Auswirkungen desimpure
Schlüsselworts Ich bin ganz Ohr.Justin