我想在一个包中编写一些任务,然后在一些使用这些任务的文件中导入该包。
其中一项任务切换复位信号。任务是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一样工作)一样)。
那么,是否有任何方法可以在执行期间使用不同的值来驱动输出,而不必引用全局变量?
答案 0 :(得分:2)
快速解决方案是使用ref
通过引用传递任务参数,而不是从任务返回后复制的output
参数。
任务reset_board(参考逻辑rst);
这样做有一些缺点。您只能通过引用传递匹配类型的变量,因此当您致电reset_board(*signal*)
时,信号不能成为电汇。另一个问题是你不能使用NBA <=
来分配通过引用传递的变量,你必须使用阻塞任务=
。这是因为您可以通过引用任务来传递自动变量,但不允许由NBAs分配自动变量。任务无法检查传递给它的参数的存储类型。
像UVM这样的标准方法建议使用虚拟接口或抽象类来创建从测试平台到DUT的这些类型的连接。有关详细信息,请参阅我的DVCon paper。