2016-03-31 8 views
3

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?

Antwort

3

Indizes für ein Array von Modulen und Schnittstellen müssen konstant sein. Die Arbeit ist eine virtuelle Schnittstelle, die einen dynamischen Index haben kann und auf eine reale Schnittstelle zeigt.

apb_if m_apb_if[0:1](); 
virtual apb_if m_apb_vif[0:1]; 
initial begin : map_physical2virtual 
    m_apb_vif[0] = m_apb_if[0]; // Note: for-loop does not work here 
    m_apb_vif[1] = m_apb_if[1]; // Index to phy-if must a constant 
end : map_physical2virtual 
... 
task foo (input string DUT_name); 
    int dut_number; 
    dut_number = set_name_number(DUT_name);//function returning int 
    ##1 m_apb_vif[dut_number].write... // should work 
endtask : foo 

Ihre virtuelle Schnittstelle kann auch ein assoziatives Array mit dem Index den Namen des dut sein sein

apb_if m_apb_if[0:1](); 
virtual apb_if m_apb_vif[string]; 
initial begin : map_physical2virtual 
    m_apb_vif["DUT1"] = m_apb_if[0]; // Note: for-loop does not work here 
    m_apb_vif["DUT2"] = m_apb_if[1]; // Index to phy-if must a constant 
end : map_physical2virtual 
... 
task foo (input string DUT_name); 
    if(!m_apb_vif.exists(DUT_name) begin 
    // throw error or something 
    end 
    else begin 
    ##1 m_apb_vif[dut_number].write... // should work 
    end 
endtask : foo 
+4

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