我想在包中编写一些任务,然后将该包导入到使用这些任务的一些文件中。
这些任务之一会切换复位信号。任务为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
Run Code Online (Sandbox Code Playgroud)
但是,如果我理解正确的话,输出仅在执行结束时分配,因此在这种情况下,rst
信号将在任务执行结束时设置为 0,这显然不是我想要的。
如果该任务是在使用它的模块中本地声明的,我可以直接引用该rst
信号(因为它是在模块中声明的)。但是,这不允许我将任务放入单独的包中。我可以将任务放入一个文件中,然后将其包含在模块中,但我试图避免 SystemVerilog 处理包含的方式带来的令人讨厌的复杂情况(长话短说,它不像 C 那样工作)做)。
那么,有没有什么方法可以让任务在执行期间驱动具有不同值的输出,而不必引用全局变量呢?
一个快速的解决方案是使用ref
通过引用传递任务参数的 a ,而不是output
从任务返回后复制的参数。
任务reset_board(参考逻辑第一);
这样做有一些缺点。您只能通过引用传递匹配类型的变量,因此当您调用 时reset_board(*signal*)
,信号不能是电线。另一个问题是你不能使用 NBA<=
来分配通过引用传递的变量,你必须使用阻塞赋值=
。这是因为允许您通过引用任务来传递自动变量,但自动变量不允许由 NBA 分配。任务无法检查传递给它的参数的存储类型。(* 请注意,IEEE 1800-2023 LRM 添加了一个ref static
强制静态变量类型作为实际参数的参数 *)
UVM 等标准方法建议使用虚拟接口或抽象类来创建从测试平台到 DUT 的此类连接。请参阅我的DVCon 论文了解更多信息。