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

问题描述 投票:0回答:1

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

其中一项任务会切换复位信号。任务是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

但是,如果我理解正确的话,输出仅在执行结束时分配,因此在这种情况下,

rst
信号将在任务执行结束时设置为0,这显然不是什么我想要。

如果此任务是在使用它的模块中本地声明的,我可以直接引用

rst
信号(因为它是在模块中声明的)。但是,这不允许我将任务放入单独的包中。我可以将任务放入一个文件中,然后将其包含在模块中,但我试图避免 SystemVerilog 处理包含的方式带来的令人讨厌的复杂情况(长话短说,它不像 C 那样工作)确实)。

那么,有没有什么方法可以让任务在执行期间驱动具有不同值的输出,而不必引用全局变量?

system-verilog
1个回答
5
投票

一个快速解决方案是使用通过引用传递任务参数的

ref
,而不是从任务返回后复制的
output
参数。

任务重置板(参考逻辑第一);

这样做有一些缺点。您只能通过引用传递匹配类型的变量,因此当您调用

reset_board(*signal*)
时,signal 不能是电线。另一个问题是您不能使用 NBA
<=
来分配通过引用传递的变量,您必须使用阻塞赋值
=
。这是因为允许您通过引用任务来传递自动变量,但自动变量不允许由 NBA 分配。任务无法检查传递给它的参数的存储类型。 (* 请注意,IEEE 1800-2023 LRM 添加了一个
ref static
参数,强制静态变量类型作为实际参数 *)

UVM 等标准方法建议使用虚拟接口或抽象类来创建从测试平台到 DUT 的此类连接。请参阅我的 DVCon 论文 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.