2016-04-23 4 views
0

このタスクの代わりに、tb.stimulus.top.Ichip0.vbiashを10回高低に切り替えるだけで、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

あなたのコードをフォーマットしました。コードブロックの各行の先頭に4つのスペースを追加するだけです。 'vbiash'を2回参照したイメージから正確にコピーしました。 – Grod

答えて

0

単一のタスクの名前をpasすることはできません。しかし、これを行うマクロを作成することができます。

`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 

、あなたは少しのCプログラミングに飛び込むん恐れていない場合は、

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

そのような作品。私はトグル信号を定義し、タスク内で 'toggle_signal(vbiash) 'を呼び出すことができますが、それはうまく動作しますが、その行をタスクにハードコードする必要があります。 'toggle_signalに渡される文字列を定義しようとすると、私はこの動的にすることができます、それでもそれは失敗し、私は同じ場所に戻ります。私は間違って何かをしているのですか、またはVerilogは私にこの動的なことを許さず、その周りに道がありません。 – matt

0

を書くには、あなた自身のPLI/VPIを書くことができます。 PLI/VPI(§ 36,37、& 38)のIEEE Std 1800-2012のセクションをチェックすることをお勧めします。

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 
:あなたはVerilogであなたのPLI/VPIタスクを呼び出すことができます

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を作成したくない場合は、SystemVerilogを有効にしてUVMを追加することをお勧めします(主要なシミュレータにはUVMが組み込まれています)。 UVMライブラリには、メソッドuvm_hdl_force/uvm_hdl_releaseのビルドがあります。

関連する問題