2016-07-06 5 views
0

Ich habe mehrere Funktionen und Prozeduren in einem VHDL-Paket. Ich wollte fragen, ob es einen Weg gibt, die Out-Items von diesen zu ignorieren. Ich kenne das open-Schlüsselwort für Port-Maps. Ich verwende Dummy-Signale, die dem Verfahren zugewiesen sind. Aber es könnte effizienter sein, dies zu tun.ignoriere Rückgabewert Prozedur/Funktion VHDL

¿Gibt es so etwas für VHDL? Wenn stelle ich die Signale aus ich die folgende Fehlermeldung erhalten zu öffnen:

„Formal e5 von Modus heraus muss ein zugehöriges tatsächlichen haben“

Vielen Dank im Voraus, Antonio

EDITED: Code

procedure reg2ind 
(signal reg : in std_logic_vector(15 downto 0); 
    signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic; 
    signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is 
begin 
    e1 <= reg(0); 
    e2 <= reg(1);  
    e3 <= reg(2); 
    e4 <= reg(3); 
    e5 <= reg(4); 
    e6 <= reg(5); 
    e7 <= reg(6); 
    e8 <= reg(7); 
    e9 <= reg(8); 
    e10 <= reg(9); 
    e11 <= reg(10); 
    e12 <= reg(11); 
    e13 <= reg(12); 
    e14 <= reg(13); 
    e15 <= reg(14); 
    e16 <= reg(15); 
end reg2ind; 

Wenn ich es verwenden:

reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18, 
ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open, 
open,open,open,open, open,open); 
+1

Bitte fügen Sie einen Code hinzu, so dass wir sehen können, wo der Fehler von –

+0

kam Mit so vielen Argumenten würde ich für den Anfang auf benannte Assoziation bestehen. –

+0

Ja, ich habe mehrere Datensatzdatentypen deklariert. Aber ich kann den ganzen Code, den ich will, nicht anpassen. Ich deklarierte diese Prozedur, um ein 16-Bit-Register in ein Datenfeld in meinem Datensatzdatentyp zu verschieben, um mehr Daten zu komprimieren. – antonio92

Antwort

1

Das Fehlen eines MCVE ist nicht entscheidend unter der Analysefehler steht.

siehe IEEE Std 107-2008, 10,7 Procedure Call-Anweisung, para 4:

For each formal parameter of a procedure, a procedure call shall specify exactly one corresponding actual parameter. This actual parameter is specified either explicitly, by an association element (other than the actual open) in the association list or, in the absence of such an association element, by a default expression (see 6.5.2).

4,2 Subprogram Erklärungen siehe Parameter 4.2.2.3 Signal para 1:

For a formal parameter of class signal, references to the signal, the driver of the signal, or both, are passed into the subprogram call.

und para 6:

If an actual signal is associated with a signal parameter of any mode, the actual shall be denoted by a static signal name. It is an error if a conversion function or type conversion appears in either the formal part or the actual part of an association element that associates an actual signal with a formal signal parameter.

siehe auch 14.6 Dynamische Ausarbeitung Abs 2, b) (teilweise):

Execution of a subprogram call involves the elaboration of the parameter association list. ...

Dynamische Ausarbeitung ist unvereinbar mit offen die Treiber, die andere Anrufe auf die gleiche Prozedur entfernt möglicherweise erforderlich.

Die Regel, wie in 4.2 Unterprogramm Deklarationen, 4.2.2.3 Signalparameter Absatz 6 gezeigt, erfordert den tatsächlichen Namen eines statischen Signals.

Dieses spezielle Beispiel einer Prozedur ist uninteressant und weist den Signalausgängen einfach Elemente eines Array-Eingangs zu.

Ein MCVE:

library ieee; 
use ieee.std_logic_1164.all; 

entity foo is 
end entity; 

architecture fum of foo is 
    procedure reg2ind 
    (signal reg : in std_logic_vector(15 downto 0); 
     signal e1,e2,e3,e4,e5,e6,e7,e8 : out std_logic; 
     signal e9,e10,e11,e12,e13,e14,e15,e16 : out std_logic) is 
    begin 
     e1 <= reg(0); 
     e2 <= reg(1);  
     e3 <= reg(2); 
     e4 <= reg(3); 
     e5 <= reg(4); 
     e6 <= reg(5); 
     e7 <= reg(6); 
     e8 <= reg(7); 
     e9 <= reg(8); 
     e10 <= reg(9); 
     e11 <= reg(10); 
     e12 <= reg(11); 
     e13 <= reg(12); 
     e14 <= reg(13); 
     e15 <= reg(14); 
     e16 <= reg(15); 
    end procedure reg2ind; 

    signal val183: std_logic_vector (15 downto 0); 
    type err_record is 
     record 
      err_17: std_logic; 
      err_18: std_logic; 
      err_19: std_logic; 
      err_20: std_logic; 
     end record; 
    type some_record is 
     record 
     err: err_record; 
     end record; 

    signal ord_p: some_record; 

    signal open5, open6, open7, 
      open8, open9, open10, 
      open11, open12, open13, 
      open14, open15, open16:  std_logic; 
begin 

    reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18, 
    ord_p.err.err_19,ord_p.err.err_20,open5,open6,open7,open8,open5,open6, 
    open7,open8,open9,open10, open11,open12); -- with dummy outputs 

    -- reg2ind(val183,ord_p.err.err_17,ord_p.err.err_18, 
    -- ord_p.err.err_19,ord_p.err.err_20,open,open,open,open,open,open, 
    -- open,open,open,open, open,open); -- as presented FAILS 


end architecture; 

Der interessierte Leser der Einschränkungen bei der Verwendung Signal basierten Parameter erkunden.

könnte Die einfachste Lösung ein Aggregat Zuweisungsziel mit Elementen neu arrangiert zu benutzen, die anstelle eines Prozeduraufruf Bestellung tatsächlichen übereinstimmen:

(ord_p.err.err_20, ord_p.err.err_19, ord_p.err.err_18, ord_p.err.err_17) <= 
     val183(3 downto 0); 

Re-Arrangieren Seite ermöglicht die rechte Hand das Ziel zu sein ein Slice-Name anstelle eines Aggregats, für das auch ein qualifizierter Ausdruck erforderlich wäre. Dies ist weniger textliche Komplexität als ein Prozeduraufruf.

Jeder Impuls zum Ausblenden von Details mithilfe eines Prozeduraufrufs könnte mit einer Prozedur mit weniger Parametern einhergehen.

Funktionsaufrufe sind Ausdrücke und es ist nicht semantisch möglich, deren Ergebniswert zu ignorieren. Sie könnten eine Anweisung, die einen Funktionsaufruf oder eine Prozeduraufrufanweisung enthält, in eine bedingt ausgeführte Anweisung einschließen (z. B. if-Anweisung, case-Anweisung).