2016-04-23 66 views
0

而不是將tb.stimulus.top.Ichip0.vbiash高低兩次切換十次,我希望能夠調用它傳遞任何信號tb.stimulus.top。 Ichip0.vbiasl,tb.stimulus.top.Ichip0.vbiasx或tb.stimulus.top.Ichip0.vbiasz並使它們切換。例如toggle_signal(tb.stimulus.top.Ichip0.vbiasl);是否有可能做到這一點。如果是這樣,我會非常感激我如何實現這一目標的一個例子。將信號名稱傳遞給verilog任務

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

我爲您設置了代碼格式 - 只需在代碼塊的每行的開頭添加四個空格即可。我完全從引用'vbiash'兩次的圖像複製它。 – Grod

回答

0

您無法將單個名稱傳遞給任務。但是你可以創建一個宏來做到這一點。

`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 

,然後寫

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

那種作品。我可以定義切換信號,然後在任務中調用toggle_signal(vbiash),它可以工作,但我必須在任務中硬編碼該行。如果我試圖定義一個傳入'toggle_signal的字符串,那麼我可以使它動態化,但它仍然失敗,我又回到了同一個位置。我做錯了什麼,或者做了什麼verilog只是不讓我做出這種動態,並沒有辦法繞過它。 – matt

0

如果你不怕你潛入一點點C語言編程,您可以編寫自己的PLI/VPI。我建議查看IEEE Std 1800-2012關於PLI/VPI的部分(§ 36,37,& 38)。你來了5月看起來像下面的(注意,該代碼是一個起始參考我沒有測試過):

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); 
} 

你可以打電話給你的PLI/VPI任務的Verilog:

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 

如果你不想編寫自己定製的PLI/VPI,那麼我建議啓用SystemVerilog並且包括UVM(主要的模擬器有UVM內置或者自己下載)。 UVM庫具有內置方法uvm_hdl_force/uvm_hdl_release