System verilog SystemVerilog:使用带有类和虚拟接口的包

System verilog SystemVerilog:使用带有类和虚拟接口的包,system-verilog,System Verilog,我是SystemVerilog的新手 我有一个定义了类a的包。此类使用虚拟接口,因为 这是一个测试台上的司机(BFM)。我正在使用一个包,这样我就可以在 其他设计 在我的测试台中,我导入A类并向其传递虚拟接口的实例。 然而,当类中的任务试图为接口中的信号赋值时,我得到了一个编译错误 我做错了什么? 如何用虚拟接口打包BFM 谢谢, RanSystemVerilog包不能在实际包中包含接口。因此,您的接口需要与包源代码一起编译。您定义的类将驻留在包中,而接口定义驻留在模块所在的全局范围中 包中的类

我是SystemVerilog的新手

我有一个定义了类a的包。此类使用虚拟接口,因为 这是一个测试台上的司机(BFM)。我正在使用一个包,这样我就可以在 其他设计

在我的测试台中,我导入A类并向其传递虚拟接口的实例。 然而,当类中的任务试图为接口中的信号赋值时,我得到了一个编译错误

我做错了什么? 如何用虚拟接口打包BFM

谢谢,
Ran

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


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

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


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

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

包中的项通常是类型定义、任务和 功能。包装内的物品不得具有层次结构 对标识符的引用,但在包或 通过导入另一个包使其可见。包装不应提及 到编译单元范围中定义的项

它没有说明任何关于设计元素名称空间的内容,而设计元素名称空间是接口声明所在的位置,但是访问接口的任何成员都需要层次引用


您应该考虑包是完全自包含的,除了预处理器指令和<代码>导入< /代码>。 严格按照规范,我认为这是不可能的,因为它添加了一个隐含的外部依赖:

包中的项通常是类型定义、任务和 功能。包装内的物品不得具有层次结构 对标识符的引用,但在包或 通过导入另一个包使其可见。包装不应提及 到编译单元范围中定义的项

它没有说明任何关于设计元素名称空间的内容,而设计元素名称空间是接口声明所在的位置,但是访问接口的任何成员都需要层次引用


您应该考虑包是完全自包含的,除了预处理器指令和<代码>导入< /代码>。 通常,在systemverilog typedef定义的帮助下解决使用前不存在的类声明。例如,“A类使用B类”和“B类使用A类”,然后使用typedef来解决僵局

现在,当您使用上述场景引入包时,需要确保A类和B类必须位于同一个包中。如果它们不是,那么编译将无法完成

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


需要注意的是,“typedef不适用于整个包”。

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

现在,当您使用上述场景引入包时,需要确保A类和B类必须位于同一个包中。如果它们不是,那么编译将无法完成

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


需要注意的是,“typedef不适用于整个软件包”。

谢谢,dwikle!这意味着在顶部模块中,我需要在包导入之前放置接口声明?不客气。如果这回答了你的问题,你应该点击复选标记接受它。谢谢,德维克尔!这意味着在顶部模块中,我需要在包导入之前放置接口声明?不客气。如果这回答了您的问题,您应该通过单击复选标记来接受它。查看代码和错误消息文本会很有帮助。查看代码和错误消息文本会很有帮助。包可能包含通过虚拟接口变量对接口的引用。这正是虚拟接口存在的原因。@dave_59,很明显,它可以工作,而且可能是为了工作,但我无法将其与LRM语句“包不应引用在编译单元范围内定义的项”相协调。接口不是在编译单元范围内定义的吗?否;接口、模块和包声明存在于单独的全局名称空间中。请参阅第3.13节名称空间。包可能包含通过虚拟接口变量对接口的引用。这正是虚拟接口存在的原因。@dave_59,很明显,它可以工作,而且可能是为了工作,但我无法将其与LRM语句“包不应引用在编译单元范围内定义的项”相协调。接口不是在编译单元范围内定义的吗?否;接口、模块和包声明存在于单独的全局名称空间中。请参阅第3.13节名称空间。此问题没有任何内容