2016-04-23 48 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