【问题标题】:Passing objects into SystemVerilog tasks/functions - Vivado Zynq Verification IP / API将对象传递到 SystemVerilog 任务/函数 - Vivado Zynq 验证 IP / API
【发布时间】:2021-01-05 23:05:38
【问题描述】:

我在 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

【问题讨论】:

    标签: system-verilog vivado


    【解决方案1】:

    更新问题的另一个答案

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

    【讨论】:

      【解决方案2】:

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

      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;
      

      请注意我是如何“以错误的顺序”声明各种 a 任务和模块的。这没关系,因为 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
      

      【讨论】:

      • 这是一个非常有用的工具,我不知道。实际上,我要做的是让 myTask() 中的 TIPTOP 对象可以与其他 T 实例一起调用,而不仅仅是 TIPTOP 实例。我不想为每个对象实例重写这个任务。我如何将它作为参数传递来实现这一目标?我更新了上面的问题示例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多