Unreines VHDL-Schlüsselwort

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 signalsmit 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 pureFunktion, also fügte ich den impureModifikator hinzu. Meines Wissens sagt dies dem Compiler, dass die Funktion Nebenwirkungen haben könnte, obwohl ich meine constFunktion 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 impurenegative Nebenwirkungen auf das Syntheseergebnis haben?

complicatedConditionWith x1 and x2Was passiert, wenn Sie durch eine einfache Bedingung ersetzen ?
@Justin: Der Zustand ist hier nicht das Problem (glaube ich). Und es ist eigentlich eher lang als kompliziert. (es liest sich etwa wie : 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 des impureSchlüsselworts Ich bin ganz Ohr.
Ich kenne eigentlich kein VHDL, also habe ich keine Antwort für Sie ... nur Vorschläge zum Debuggen. Ich war mir nicht sicher, ob Sie zusätzliche Funktionsaufrufe in Ihrem Zustand hatten. Vielleicht tun Sie ... beziehen sich die Accessoren .state und .writeReady möglicherweise irgendwie auf den externen "unreinen" Zustand? Versuchen Sie, ein vollständiges Minimalbeispiel zu erstellen, das das Problem zeigt. Sie können die Antwort dabei selbst herausfinden. Können Sie die Bedingung durch eine Konstante wahr oder falsch ersetzen?

Antworten (1)

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.)

Der erste Satz dieses Awnsers war der Schlüssel, ich habe das gleiche Ergebnis und den gleichen Argumentteil übersehen (x1_sig und x2_sig sind nur implizite Argumente ...).