我是 SystemVerilog 的相对新手。
我有一个包,其中定义了 A 类。此类使用虚拟接口,因为它是测试台中的驱动程序 (BFM)。我正在使用一个包,所以我可以在其他设计中使用相同的 BFM。
在我的测试台中,我导入 A 类并将虚拟接口的实例传递给它。但是,当类中的任务尝试为接口中的信号分配值时,我收到编译错误。
我究竟做错了什么?如何将 BFM 与虚拟接口打包在一起?
谢谢,冉
我是 SystemVerilog 的相对新手。
我有一个包,其中定义了 A 类。此类使用虚拟接口,因为它是测试台中的驱动程序 (BFM)。我正在使用一个包,所以我可以在其他设计中使用相同的 BFM。
在我的测试台中,我导入 A 类并将虚拟接口的实例传递给它。但是,当类中的任务尝试为接口中的信号分配值时,我收到编译错误。
我究竟做错了什么?如何将 BFM 与虚拟接口打包在一起?
谢谢,冉
SystemVerilog 包不能在实际包中包含接口。所以你的接口需要和你的包源一起编译。您定义的类将驻留在包中,而接口定义驻留在模块所在的全局范围内。
包中的类可以引用虚拟接口,但除了包源之外,您需要确保接口已编译且可见。
严格按照规范,我认为这是不可能的,因为它添加了隐式的外部依赖:
包中的项目通常是类型定义、任务和函数。包中的项目不应具有对标识符的分层引用,除非在包中创建或通过导入另一个包使其可见。包不应引用在编译单元范围内定义的项目。
它没有说明设计元素命名空间,这是接口声明所在的位置,但访问接口的任何成员都需要分层引用。
除了预处理器指令和import
.
通常,在 systemverilog typedef 定义的帮助下解决使用之前不存在的类声明。例如“A 类使用 B 类”和“B 类使用 A 类”然后 typedef 用于解决僵局。
现在,当您使用上述情况引入包裹时,需要确保 A 类和 B 类必须在同一个包裹中。如果它们不是,那么编译将不会通过。
原因是 SystemVerilog 解析器将需要在包解析结束时使用 typedef 指示的类的定义。这失败了。
这个问题需要注意“typedef 不适用于跨包”。