0

我是 System Verilog 和 UVM 的新手,我已经看过这个帖子:

SV 或 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。

4

2 回答 2

3

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

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

这两种方法都要求您打开某些工具优化,以保留您想要强制执行的信号名称。这可能是严重的性能损失。因此,您应该研究您的方法的替代方案。

于 2017-10-04T22:11:42.533 回答
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”的所有实例中强制信号(来自模块内部:-))

于 2017-10-05T01:49:01.567 回答