2016-06-09 16 views
2

Also habe ich generate-Anweisungen verwendet, um einige Oszillatoren in einer Testbench zu erstellen, an der ich gearbeitet habe.SystemVerilog weist generierten Blöcken Werte zu

Ich habe auch eine Reihe von Reals namens OSC_PER wo jedes Element im Array ist die Periode in ns für den Oszillator.

Ich habe versucht, meine Testbench arbeiten so, dass ich geben Sie einen Parameter (Anzahl der Geräte zu testen) und die Generate-Anweisungen in meiner Testbench und Simulation ausgehen, instanziieren die Module und alles verdrahten. Bisher ist das gut gelaufen, aber ich glaube, ich bin in eine Wand gerannt und habe meinen Oszillatoren die Perioden zugewiesen.

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    end 
endgenerate 

Also hier ist, wie ich versucht habe, die Werte zuweisen:

foreach(OSC_PER[i]) 
    generate_my_oscillators[i].osc_c_osc.per = OSC_PER[i]; 

Das gibt mir einen NOTPAR Fehler; Ich denke, es ist illegal, über die Instanznummer außerhalb einer genvar-Anweisung zu iterieren. Okay, vielleicht kann ich Brute sein und legen Sie sie einfach alle aus manuell:

generate_my_oscillators[1].osc_c_osc.per = OSC_PER[1] 
if(number_devices >= 2) 
generate_my_oscillators[2].osc_c_osc.per = OSC_PER[2] 
if(number_devices >= 3) 
generate_my_oscillators[3].osc_c_osc.per = OSC_PER[3] 
. 
. 
. 

Allerdings, wenn ich number_devices haben = 2, dann auf der dritten Bedingung, bekomme ich CUVFGS (Ungültig für generieren Index), gefolgt von CUVUNF (Fehler beim Suchen des Komponentennamens für das dritte Gerät).

Wenn ich Werte habe, die ich jeder Instanz des erzeugten Oszillators zuweisen möchte, wie soll ich das machen? Ich bin an dieser Stelle etwas ratlos. Vielleicht kann ich es in der generate-for-Schleife zugewiesen bekommen?

EDIT: Ich habe ein paar mehr Dinge ausprobiert:

Wenn ich über die Definitionen von OSC_PER meiner Testumgebung bewegen und versuchen, den Wert der Periode in der generieren Anweisung wie folgt ich aufwenden erhalten zuweisen " erwartet Stichwort 'end' ":

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    .per = OSC_PER[i]; 
    end 
endgenerate 

okay, ich versuchte, diese:

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    osc_c_osc.per = OSC_PER[i]; 
    end 
endgenerate 

... und ich EXPLA: erwarten linke Klammer.

Zeit ist ein internes Signal in jedem osc, also kann ich es nicht als solche platzieren:

generate 
    for(i=1; i<=num_duts; i++) 
    begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i]), .per(OSC_PER[i]); 
    end 
endgenerate 

Wenn ich das tue, ich CUVPOM erhalten: Portname ‚pro‘ ist ungültig oder mehrere Verbindungen hat.

Jetzt habe ich wirklich keine Ideen mehr. Irgendwelche Vorschläge?

+0

Ist 'pro' ein' Parameter', 'reg' oder' wire'? – Greg

+0

per ist ein 'real' –

Antwort

1

Wenn per ist ein parameter die Art und Weise empfehlen zuzuordnen ist:

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osC#(.per(OSC_PER[i])) osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
end 
endgenerate 

Alternativ parameter kann mit einem defparam zugeordnet werden. Dies wird discurraged da diese Funktion für die Abschreibung in Betracht gezogen wird (IEEE Std 1800-2012 § C.4.1)

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    defparam osc_c_osc.per = OSC_PER[i]; 
end 
endgenerate 

Zuordnung interne Werte über hierarchische Grenzen ist nicht synthetisierbaren.Aber es ist für die Simulation erlaubt.

Wenn per eine interne wire ist, dann sollte es mit einer assign Anweisung zugewiesen werden. Wenn per ist ein reg, integer, real usw. und OSC_PER ist eine Konstante (zB: parameter, `define), dann verwenden Sie eine initial Anweisung, sonst ein always @*.

generate 
for(i=1; i<=num_duts; i++) begin: generate_my_oscillators 
    osc osc_c_osc(.en(osc_en[i]), .out(osc_c[i])); 
    // Pick one based on the type of per and OSC_PER 
    //assign osc_c_osc.per = OSC_PER[i]; // per is a wire 
    //initial osc_c_osc.per = OSC_PER[i]; // per is non-wire and OSC_PER is a constant 
    //always @* osc_c_osc.per = OSC_PER[i]; // per & OSC_PER are non-wire variables 
end 
endgenerate 

Wenn per ist kein Parameter, und Sie wollen es synthetisierbaren sein, fügen Sie es dann an den Port-Liste. Dies erfordert das Modifizieren des osc Moduls selbst. Beachten Sie, dass Gleitkommazahlen (z. B. real) als Ports in SystemVerilog für die Simulation verwendet werden können, aber nicht synthetisierbar sind.