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



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

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

我在测试台上尝试做什么的更新示例。我意识到这不是合适的SystemVerilog,它只是为了展示我试图获得的功能。TOP是在其他.csv文件中定义的模块,该文件包含名为T:的任务的定义

module tb();
TOP TIPTOP(), TIPITTYTOP();
task myTask(input TOP T);
begin
T.T;
end
endtask

initial begin

myTask(TIPTOP);
myTask(TIPITTYTOP);

end

endmodule

更新问题的另一个答案

只有当模块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

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

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中的任务:

ANOTHER_TOP.bot.T;

注意我是如何声明各种任务和模块";以错误的顺序";。这是可以的,因为Verilog需要3次编译,并且各种任务和模块之间的关系在第2次和第3次中进行了排序。然而,必须首先编译该程序包。这是因为包裹在总体规划中有点事后考虑。


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

package P;
task T;
$display("P::T");
endtask
endpackage
module TOP;
initial
begin
T;
ANOTHER_TOP.T;
bot.T;
ANOTHER_TOP.bot.T;
P::T;
end
task T;
$display("TOP.T");
endtask
BOT bot ();
endmodule
module ANOTHER_TOP;
task T;
$display("ANOTHER_TOP.T");
endtask
BOT bot ();
endmodule
module BOT;
task T;
$display("BOT.T");
endtask
endmodule

最新更新