【问题标题】:How to handle the interface with package in systemverilog如何处理systemverilog中的包接口
【发布时间】:2018-05-16 17:58:23
【问题描述】:

这些天我正在创建一个简单的 uvm tb,但遇到了界面使用问题。这是我的代码。

在 /my_proj/tb_uvm/intf/my_if.svh 文件中:(接口定义)

interface my_if (
    input iCLK,
    input iRSTb,
    inout data
);
clocking monitor_cb @(posedge iCLK);
    input iRSTb;
    input data;
endclocking
modport monitor_mp(
    clocking monitor_cb
); 
endinterface : my_if

我需要在 /my_proj/tb_uvm/agent/my_driver.svh 文件中实例化这个接口:

class my_driver extends uvm_driver;
    `uvm_component_utils(my_driver)
    virtual my_if m_vif;
    ...
endclass

我试图在 /my_proj/tb_uvm/agent/ 下定义一个包文件(名为 my_agt_pkg.sv),因为这个目录中有几个驱动程序/监视器文件,包括我上面提到的 my_driver.svh。

package my_agt_pkg;
    import uvm_pkg::*;

    `include "my_driver.svh"
    `include "../intf/my_if.svh"
     ....
endpackage

但由于以下错误,我无法编译。谁能帮我解决这个问题?

在“endpackage”之前的包内找到“interface”。 'package' 中的'interface' 是不允许的。

【问题讨论】:

    标签: system-verilog


    【解决方案1】:

    错误消息的意思是:不允许在包中声明接口

    virtual interface 是一个特殊的概念。它的行为类似于类变量,但 interface 像模块一样被定义和实例化。

    只需将你的接口声明移到package之外

    【讨论】:

    • 嗨 Dave,如果我想在当前的 sv 文件中实例化这个接口并且这个 sv 文件包含在包中,我该如何处理? (我的意思是如何在包外声明接口?)
    • 我试图在 my_agt_pkg.sv 文件中排除这个 my_if.svh。并重试编译但失败并出现以下错误:错误-[SV-UIOT] 未定义接口或类型 ../agent/my_driver.svh, 10 my_if, "m_vif" 缺少前向引用接口“my_if”的定义或'my_if' 是未定义用户类型的名称。
    • 哦,如果我将 include 语句移到包定义之前,它会起作用。现在虽然弹出下一个错误,但这个错误消失了。我会在我身边进一步看看..无论如何,非常感谢你!