を書くには、あなた自身の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
のビルドがあります。
あなたのコードをフォーマットしました。コードブロックの各行の先頭に4つのスペースを追加するだけです。 'vbiash'を2回参照したイメージから正確にコピーしました。 – Grod