而不是这个任务只是切换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);是否有可能做到这一点。如果是这样,我真的很感激我将如何实现这一目标。
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 :(得分:1)
您无法将单个名称传递给任务。但是你可以创建一个宏来做到这一点。
`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)
答案 1 :(得分:0)
如果你不害怕进入一个小C编程,你可以编写自己的PLI / VPI。我建议查看IEEE Std 1800-2012关于PLI / VPI(§36,37和38)的部分。你的到来可能看起来像下面这样(注意,代码是一个起始参考。我还没有测试过它):
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);
}
您可以用verilog调用您的PLI / VPI任务:
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
。
答案 2 :(得分:0)
你走了。以下代码将信号名称作为参数传递给任务,然后将信号名称作为字符串输出。经过iverilog
测试。
reg this_is_some_signal_name;
`define NAME(net) `"net`"
task print;
input reg [32*8] str;
begin
$display(">>> %0s", str);
end
endtask
initial begin
print(`NAME(this_is_some_signal_name));
$finish;
end
输出:
>>> this_is_some_signal_name