SystemVerilog Neuling hier, ich habe eine Reihe von 2 APB Schnittstellen: apb_if m_apb_if[0:1]
für die Schnittstelle mit Kabelbaum in TB verwendet. Anfangs schrieb ich Aufgaben wie folgt aus:Nichtkonstante Index in Instanz-Array
task foo;
input string DUT_name;
if (DUT_name == "DUT1")
##1 m_apb_if[0].write...
else if (DUT_name == "DUT2")
##1 m_apb_if[1].write...
Der obige Code funktioniert, aber 50% davon ist überflüssig (man stelle sich gleiche Sache auf 20 if). Ich wollte die Länge des Aufgabencodes reduzieren. Ich habe versucht:
task foo;
input string DUT_name;
int dut_number;
dut_number = set_name_number(DUT_name);//function returning int
##1 m_apb_if[dut_number].write... //this line fails
Passing int als Eingabe Aufgabe den gleichen Fehler gibt, wenn man versucht .WRITE aufzurufen:
input int dut_name;
Does Index Array konstant sein muss, weil es bekannt sein zu Beginn der Simulation? Wie kann ich mein Ziel erreichen?
Nur um Gregs Antwort hinzuzufügen. Arrays von Instanzen müssen mit Konstanten indiziert werden, da sie keine echten Arrays sind, in denen jedes Element identische Eigenschaften aufweist. Konstrukte wie 'defparam' und' generate' können jeden Index sehr unterschiedlich machen. Der Verilog-Elaboration-Prozess verflacht im Prinzip alle Hierarchieebenen und erstellt Namen, die wie Array-Indizes aussehen, aber sie sind nur ein Teil des abgeflachten Namens. –