将对象传递到 SystemVerilog 任务/函数 - Vivado Zynq 验证 IP/API

问题描述

我在 Vivado 中有一个测试平台,它具有 IP 层次结构——一些自定义 IP 和一些 Xilinx IP,例如 Zynq 处理系统。 Zynq 处理系统还有一个相关的验证 IP 库,该库具有用于执行诸如加载 DDR 之类的有用 API。

我想编写一个利用其中的 Zynq 验证 IP(和相关 API)的任务。我不知道如何在我的测试平台中实现这个?我是 SV 的新手,我猜我需要将 zynq 处理系统对象作为参数传递,以便我可以在我的超级任务中访问它的 API。

更新示例,说明我在我的测试平台中尝试做的事情。我意识到这不是正确的 SystemVerilog,它只是为了演示我想要获得的功能。 TOP 是在其他一些 .sv 文件中定义的模块,其中包含名为 T 的任务的定义:

module tb();

  TOP TIPTOP(),TIPITTYTOP();

  task myTask(input TOP T);
    begin
        T.T;
    end
  endtask
  
initial begin
  
  myTask(TIPTOP);
  myTask(TIPITTYTOP);
  
end
  
endmodule

解决方法

您可以调用在另一个模块中声明的任务或函数。下面的代码具有以下结构:

device

P TOP ANOTHER_TOP | | BOT bot BOT bot 和所有模块都在其中声明了一个任务 P。我可以调用模块 T 中的所有任务:

我可以使用分数解析运算符TOP

调用包中的任务P
::

我可以调用本地任务:

P::T;

我可以在 T; 的实例 bot 中调用任务:

BOT

我可以在另一个顶级模块bot.T; 中调用任务:

ANOTHER_TOP

我可以在另一个顶级模块中调用 ANOTHER_TOP.T; 的实例 bot 中的任务:

BOT

请注意我是如何“以错误的顺序”声明各种 a 任务和模块的。这是可以的,因为 Verilog 需要 3 次编译,并且在第 2 次和第 3 次中整理了各种任务和模块之间的关系。但是,必须先编译包。这是因为从大局来看,包有点事后诸葛亮。


https://www.edaplayground.com/x/KpJR

ANOTHER_TOP.bot.T;
,

更新问题的另一个答案

这只能在模块 TOP 不是模块而是不同风格的模块(称为接口)时完成。有一种特殊的 SystemVerilog 变量称为虚拟接口,它是一个可以存储对接口实例的引用的变量。这就是你需要的。所以,

  1. 你需要让 TOP 成为一个界面并且
  2. 您需要将关键字 virtual 添加到您的任务中:task myTask(input virtual TOP T);

但是,接口是有限制的。 (我们在这里并没有完全将它用于正常目的。)可能影响您的主要问题是您无法在接口内实例化模块。


https://www.edaplayground.com/x/SM33

interface TOP;
  task T;
    $display("TOP.T");
  endtask
endinterface

module tb();

  TOP TIPTOP(),TIPITTYTOP();

  task myTask(input virtual TOP T);
    begin
        T.T;
    end
  endtask
  
initial begin
  
  myTask(TIPTOP);
  myTask(TIPITTYTOP);
  
end
  
endmodule
  

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...