【问题标题】:How can I create a task which drives an output across time without using globals?如何在不使用全局变量的情况下创建一个跨时间驱动输出的任务?
【发布时间】:2013-12-14 05:23:27
【问题描述】:

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

其中一项任务会触发复位信号。任务为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确实)。

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

【问题讨论】:

  • 什么是全局变量。您可以使用 testbench.rst 进行分层控制。
  • 选词不正确。我的意思是说,如果在模块内声明,任务将与信号在同一范围内。

标签: system-verilog


【解决方案1】:

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

task reset_board(ref logic rst);

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

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

【讨论】:

  • 谢谢,戴夫!哇,那里有很多好信息。我想知道 SV 是否有类似的参考,但我认为这对语言来说太陌生了。现在阅读你的论文...
猜你喜欢
  • 2020-08-02
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2012-08-18
  • 2013-04-18
  • 2013-04-10
相关资源
最近更新 更多