【问题标题】:SystemVerilog: Using packages with classes and virtual interfacesSystemVerilog:使用带有类和虚拟接口的包
【发布时间】:2013-02-28 15:37:31
【问题描述】:

我是 SystemVerilog 的新手。

我有一个包,其中定义了 A 类。此类使用虚拟接口,因为 它是测试台中的驱动程序(BFM)。我正在使用一个包,所以我可以使用相同的 BFM 其他设计。

在我的测试台中,我导入 A 类并将虚拟接口的实例传递给它。 但是,当类中的任务尝试为接口中的信号分配值时,会出现编译错误。

我做错了什么? 如何使用虚拟接口封装 BFM?

谢谢, 然

【问题讨论】:

  • 查看您的代码和错误消息的文本会很有帮助。

标签: system-verilog


【解决方案1】:

SystemVerilog 包不能在实际包中包含接口。所以你的接口需要和你的包源一起编译。您定义的类将驻留在包中,而接口定义驻留在模块所在的全局范围内。

包中的类可以引用虚拟接口,但除了包源之外,您需要确保接口已编译且可见。

【讨论】:

  • 谢谢,dwikle!所以这意味着在顶层模块中,我需要在包导入之前放置接口声明?
  • 不客气。如果这回答了您的问题,您应该点击复选标记接受它。
【解决方案2】:

严格按照规范,我认为这是不可能的,因为它添加了隐式的外部依赖:

包中的项目通常是类型定义、任务和 职能。包裹内的物品不得有层次 对标识符的引用,但在包中创建的标识符除外或 通过导入另一个包使其可见。一个包不得引用 到编译单元范围内定义的项目。

它没有说明设计元素命名空间,这是接口声明所在的位置,但访问接口的任何成员都需要分层引用。

除了预处理器指令和import 之外,您应该考虑完全独立的包。

【讨论】:

  • 包可能包含通过虚拟接口变量对接口的引用。这正是虚拟接口存在的原因。
  • @dave_59,显然它可以工作,并且可能打算工作,但我无法与 LRM 声明“包不应引用编译单元范围内定义的项目”相协调。接口不是定义在编译单元范围内吗?
  • 否;接口、模块和包声明存在于单独的全局名称空间中。请参阅第 3.13 节名称空间。
【解决方案3】:

通常,在使用 systemverilog typedef 定义的帮助下解决其使用之前不存在的类声明。比如“A 类使用 B 类”和“B 类使用 A 类”然后 typedef 用于解决僵局。

现在,当您使用上述场景引入包裹时,需要确保 A 类和 B 类必须在同一个包裹中。如果不是,则编译不会通过。

原因是 SystemVerilog 解析器需要在包解析结束时使用 typedef 指示的类的定义。这失败了。

这个问题需要注意“typedef does not apply across package”。

【讨论】:

  • 这个问题与一个类与另一个类的关系无关。它介于类和接口之间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多