如何在不使用全局变量的情况下创建跨时间驱动输出的任务?

时间:2013-12-14 05:23:28

标签: system-verilog

我想在一个包中编写一些任务,然后在一些使用这些任务的文件中导入该包。

其中一项任务切换复位信号。任务是reset_board,代码如下:

package tb_pkg;
    task reset_board(output logic rst);
        rst <= 1'b0;
        #1;
        rst <= 1'b1;
        #1;
        rst <= 1'b0;
        #1;
    endtask
endpackage

但是,如果我understand this correctly,输出仅在执行结束时分配,因此在这种情况下,rst信号将在任务执行结束时设置为0,显然不是我想要的。

如果此任务在使用它的模块中本地声明,我可以直接引用rst信号(因为它在模块中声明)。但是,这不允许我将任务放在单独的包中。我可以把任务放在一个文件中,然后把它包含在模块中,但是我试图避免SystemVerilog处理包含的方式带来的令人讨厌的复杂问题(长篇简短,它不像C一样工作)一样)。

那么,是否有任何方法可以在执行期间使用不同的值来驱动输出,而不必引用全局变量?

1 个答案:

答案 0 :(得分:2)

快速解决方案是使用ref通过引用传递任务参数,而不是从任务返回后复制的output参数。

任务reset_board(参考逻辑rst);

这样做有一些缺点。您只能通过引用传递匹配类型的变量,因此当您致电reset_board(*signal*)时,信号不能成为电汇。另一个问题是你不能使用NBA <=来分配通过引用传递的变量,你必须使用阻塞任务=。这是因为您可以通过引用任务来传递自动变量,但不允许由NBAs分配自动变量。任务无法检查传递给它的参数的存储类型。

像UVM这样的标准方法建议使用虚拟接口或抽象类来创建从测试平台到DUT的这些类型的连接。有关详细信息,请参阅我的DVCon paper