2017-10-04 113 views
0

我是新来的系统Verilog和UVM,我已经看到了这个线程:在迫使多条电线在SV设计/ UVM

Regex in SV or UVM

我找不到任何地方一个适当的例子使用正则表达式/通配符,我应该使用什么样的语法来强制设计多个连线。

例如:

比方说,我有一个名为my_fifo模块,这是在设计中多次实例化:

top.dut.my_fifo_in 
top.dut.master.my_fifo_a 
top.dut.slave.axi.my_fifo_out 

并且块my_fifo含有一种叫线:

wire force_me_to_1 = 1'b0; 

我想在所有以“my_fifo”开头的实例中强制使用此线。 喜欢的东西(请原谅我的语法,这只是为了澄清我的意图):

force "*my_fifo*.force_me_to_1" = 1'b1; 

,它会作出这样的线1在上述所有情况。

+0

从语言外部的模块外部无法做到。 – Serge

+0

我同意。我想知道'uvm_hdl_force'是否可能采用通配符,但看起来不像它。 –

+0

谢谢你们的答案。 模块外部是什么意思?你的意思是它不能作为DUT接口的一部分吗? 如何使用赋值而不是强制? 最后 - 你会建议做什么呢? – EEliaz

回答

3

有两种方法可以实现您想要执行的操作:使用VPI或使用工具的命令行界面。

这两种方法都涉及编写一个算法,该算法遍历整个设计中的所有实例并选择与正则表达式匹配的名称。一旦你有了一个选定的实例,你可以用C中的VPI调用或工具命令(通常为Tcl)应用单独的强制命令。在这个论坛上解释如何做到这一点太广泛了。

这两种方法都要求您关闭某些优化工具,以保留您要强制的信号名称。这可能是一个严重的性能损失。所以你应该研究你的方法的替代方案。

1

没有直接的方法来做你想做的事,但是有一些技巧你可以在你的案例中探索。

据说,在顶部实例某处你定义了一个标志,说force_me

module tb_top; 
    bit force_me = 0; 
    ... 
endmodule 

你的模块中,你可以写类似的流动:在您的测试平台

module my_fifo; 

    logic force_me_to_1; 

    always @(tb_top.force_me) begin 
     if (tb_top.force_me) 
      force force_me_to_1 = 1; 
     else 
      release force_me_to_1; 
    end 
    .. 
endmodule 

现在你应该可以说

tb_top.force_me = 1; 
... 
tb_top.force_me = 0; 

这应该强制在模块'my_fifo'的所有实例中(来自模块内部:-))的信号。

+0

谢谢你的答案。 我会尝试做一个测试用例,但也许你可以更快地回答如果“tb_top.force_me”位不被定义会发生什么? – EEliaz

+0

@EEliaz它你没有定义它,该计划将无法正常工作。你将会有未定义的变量。我不确定,但verilog可能会尝试在这种情况下自动为您定义一个一位变量,请参阅'default_nettype指令。但这将是一个不好的做法。 – Serge