Verilog SV/UVM设计中的多导线强制

Verilog SV/UVM设计中的多导线强制,verilog,system-verilog,verification,uvm,system-verilog-dpi,Verilog,System Verilog,Verification,Uvm,System Verilog Dpi,我是系统Verilog和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”

我是系统Verilog和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”开头的情况下强制使用该电线。 比如(请原谅语法,这只是为了澄清我的意图):


在上述所有情况下,它都会将该连接设为1。

有两种方法可以实现您的目标:使用VPI或使用工具的命令行界面

这两种方法都需要编写一个算法,迭代整个设计中的所有实例,并选择与正则表达式匹配的名称。一旦选择了一个实例,就可以使用C中的VPI调用或工具命令(通常是Tcl)应用单个force命令。解释如何做到这一点是一个太宽泛的话题,在这个论坛上涵盖


这两种方法都需要对某些工具进行优化,以保留要强制执行的信号名称。这可能是一个严重的性能惩罚。因此,您应该研究替代方法。

有两种方法可以实现您想要做的事情:使用VPI或使用工具的命令行界面

这两种方法都需要编写一个算法,迭代整个设计中的所有实例,并选择与正则表达式匹配的名称。一旦选择了一个实例,就可以使用C中的VPI调用或工具命令(通常是Tcl)应用单个force命令。解释如何做到这一点是一个太宽泛的话题,在这个论坛上涵盖


这两种方法都需要对某些工具进行优化,以保留要强制执行的信号名称。这可能是一个严重的性能惩罚。因此,你应该研究你的方法的替代方案。

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

假设在一个顶级实例的某个地方,你定义了一个标志,比如说force_me

在您的模块中,您可以编写如下内容:

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”(从模块内部:-)的所有实例中强制发送信号。

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

假设在一个顶级实例的某个地方,你定义了一个标志,比如说force_me

在您的模块中,您可以编写如下内容:

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”的所有实例中的信号(从模块内部:-)

无法从模块外部使用该语言。我同意。我想知道
uvm\u hdl\u force
是否需要一个通配符,但看起来不像。谢谢你们的回答。你说的模块外是什么意思?你的意思是它不能作为DUT接口的一部分吗?用赋值代替强制怎么样?最后,你会建议怎么做?我想他们的意思是没有语法可以让你想要你想要的。是的,语言没有提供语法可以让你这样做。正如dave_59在回答中所建议的那样,有很多后门。但它们需要一些c/c++编程或verilog编译器供应商提供的脚本语言(最有可能像tcl一样,如果有的话)。在语言模块之外没有办法做到。我同意。我想知道
uvm\u hdl\u force
是否需要一个通配符,但看起来不像。谢谢你们的回答。你说的模块外是什么意思?你的意思是它不能作为DUT接口的一部分吗?用赋值代替强制怎么样?最后,你会建议怎么做?我想他们的意思是没有语法可以让你想要你想要的。是的,语言没有提供语法可以让你这样做。正如dave_59在回答中所建议的那样,有很多后门。但它们需要一些c/c++编程或verilog编译器供应商提供的脚本语言(如果有的话,很可能是tcl),谢谢你的回答。我将尝试为其制作一个测试用例,但也许您可以更快地回答如果不定义位“tb_top.force_me”,将会发生什么?@EEliaz如果您不定义它,该方案将无法工作。您将拥有未定义的变量。我不确定,但verilog可能会尝试为您自动定义一位变量。在这种情况下,请参阅“default_nettype指令”。但这是一个糟糕的做法。谢谢你的回答。我将尝试为其制作一个测试用例,但也许您可以更快地回答如果不定义位“tb_top.force_me”,将会发生什么?@EEliaz如果您不定义它,该方案将无法工作。您将拥有未定义的变量。我不确定,但verilog可能会尝试为您自动定义一位变量。在这种情况下,请参阅“default_nettype指令”。但这将是一种糟糕的做法。