2016-04-23 10 views
0

Anstatt diese Aufgabe einfach tb.stimulus.top.Ichip0.vbiash hoch und niedrig zehn Mal zu wechseln, würde ich gerne in der Lage sein, es in jedem Signal tb.stimulus.top Weitergabe nennen. Ichip0.vbiasl, tb.stimulus.top.Ichip0.vbiasx oder tb.stimulus.top.Ichip0.vbiasz und sie auch umschalten lassen. Zum Beispiel toggle_signal (tb.stimulus.top.Ichip0.vbiasl); Ist es möglich, dies zu tun? Wenn dem so wäre, würde ich ein Beispiel dafür schätzen, wie ich das erreichen würde.Übergeben eines Signal-Namen in eine Verilog-Task

task toggle_signal; 

begin 

    for (monpad_index=0; monpad_index < 10; monpad_index = monpad_index + 1) 

    begin 

    #1000; 

    force tb.stimulus.top.Ichip0.vbiash = 1'b1; 

    #1000; 

    force tb.stimulus.top.Ichip0.vbiash = 1'b1; 

    #1000; 

    end 

end 
+0

Ich habe Ihren Code für Sie formatiert - fügen Sie einfach vier Leerzeichen am Anfang jeder Zeile in einem Codeblock ein. Ich habe es genau aus dem Bild kopiert, das zweimal 'vbiash' referenziert hat. – Grod

Antwort

0

Sie können den Namen eines einzelnen nicht an eine Aufgabe übergeben. Sie können dafür jedoch ein Makro erstellen.

`define toggle_signal(sig) \ 
    for (monpad_index=0; monpad_index < 10; monpad_index = monpad_index + 1) \ 
    begin \ 
    #1000 force tb.stimulus.top.Ichip0.sig = 1'b1; \ 
    #1000 force tb.stimulus.top.Ichip0.sig = 1'b0; \ 
    #1000; \ 
    end 

und dann

`toggle_signal(vbiash) 
`toggle_signal(vbiasl) 
+0

Diese Art von Arbeiten. Ich kann das Toggle-Signal definieren und dann 'toggle_signal (vbiash) in der Task aufrufen und es funktioniert, aber ich muss diese Zeile in der Task fest codieren. Wenn ich versuche, eine Zeichenfolge zu definieren, die an toggle_signal übergeben wird, damit ich diese dynamisch machen kann, schlägt sie immer noch fehl und ich bin wieder an der gleichen Stelle. Mache ich etwas falsch oder erlaubt mir Verilog einfach nicht, diese Dynamik zu erzeugen, und es gibt keinen anderen Weg. – matt

0

schreiben Wenn Sie keine Angst haben, tauchen Sie in eine kleine C-Programmierung, könnten Sie Ihre eigene PLI/VPI schreiben. Ich schlage vor, die Abschnitte IEEE Std 1800-2012 auf PLI/VPI (§ 36, 37, & 38) zu überprüfen. Ihr kommen in etwa wie folgt aussieht (Beachten Sie, ist der Code ein Startreferenz Ich habe es nicht getestet.):

static int my_vpi_force_release_calltf(PLI_BYTE* user_data) { 
    vpiHandle sys, argv, signal; 
    p_vpi_value p_value; 
    int force_release; 
    force_release = (int) user_data; 
    sys = vpi_handle(vpiSysTfCall, 0); 
    argv = vpi_iterate(vipArgument, sys); 
    signal = vpi_handle_by_name(vpi_get_str(vpi_scan(argv), 0); 
    if (force_release != 0) { 
    vpi_get_value(vpi_scan(argv), p_value); 
    vpi_put_value(signal, p_value, 0, vpiForceFlag); 
    } else { 
    vpi_get_value(signal, p_value); 
    vpi_put_value(signal, p_value, 0, vpiReleaseFlag); 
    } 
    return 0; 
} 
void register_my_vpi_force_release() 
{ 
    s_vpi_systf_data data; 
    data.type  = vpiSysTask; 
    data.calltf = my_vpi_force_release_calltf; 

    data.tfname = "$my_force"; 
    data.user_data = (PLI_BYTE8 *) 1; 
    vpi_register_systf(&data); 

    data.tfname = "$my_release"; 
    data.user_data = (PLI_BYTE8 *) 0; 
    vpi_register_systf(&data); 
} 

Sie Ihre PLI/VPI Aufgaben in Verilog anrufen:

task toggle_signal(input [80*8-1:0] path_str); 
integer index; 
begin 
    for (index=0; index < 10; index = index + 1) 
    begin 
    #1000; 
    $my_force(path_str, 1'b1); 
    #1000; 
    $my_force(path_str, 1'b0); 
    #1000; 
    end 
    $my_release(path_str); 
end 
endtask 
... 
initial begin 
    ... 
    toggle_signal("tb.stimulus.top.Ichip0.vbiash"); 
    ... 
end 

Wenn Sie nicht Ihre eigene benutzerdefinierte PLI/VPI schreiben möchten, dann empfehle ich, SystemVerilog zu aktivieren und UVM einzuschließen (die wichtigsten Simulatoren haben UVM eingebaut, oder laden Sie es selbst herunter). Die UVM-Bibliothek hat eine eingebaute Methode uvm_hdl_force/uvm_hdl_release.