$unit声明空间

描述

$unit是一个危险的共享名称空间,充满危险。它的使用会导致设计难以编译和维护。
下列unit代表$unit
笔记

在将包添加到SystemVerilog标准之前,SV提供了一种不同的机制来创建多个模块共享的定义。这个机制是一个名为unit的伪全局名称空间,也称unit 编译单元或声明空间。声明空间之外的任何声明都在unit声明空间中。在下面的示例中,bool_t的定义在两个模块之外,因此在unit声明空间中。

编译

unit声明空间可以包含与包相同类型的用户定义,并且具有相同的综合限制。然而,与包不同的是,unit声明空间可能导致设计代码难以维护,EDA也难以编译。使用unit的一些危险包括

以unit声明空间的定义可能分散在许多文件中,使代码维护和代码重用成为一场噩梦,当引用包中用户自定义类型、任务、函数或其他标识符名称时,相对容易找到和维护标识符名称的定义。总是有一个显式的包引用或包导入语句来显示在哪里可以找到定义。当在unit声明空间中定义了用户自定义类型、任务、函数或其他标识符时,该定义可以位于构成设计和验证测试台源代码的任何文件、任何目录、任何服务器中。定位、维护和重新定义是困难的。

当unit声明空间中的定义位于多个文件中时,必须按照特定的顺序编译这些文件。

SystemVerilog要求在引用定义之前对其进行编译。当unit声明分散在许多文件中时,按照正确的顺序编译所有文件可能会很困难,甚至是不可能的。

更改unit定义需要重新编译所有源代码文件。

对unit声明空间中定义的任何更改都需要重新编译构成设计和验证测试台的所有源代码,因为任何地方的任何文件都可以无需导入地使用该定义。许多软件工具不会强制要求重新编译所有文件,但如果不重新编译,设计模块最终可能使用过时的定义。

对于仿真和综合,unit声明空间可以是相同,但通常是不同的。

编译器的每次调用都会启动一个新的unit声明空间,该空间不共享其他unit声明空间中的声明。许多SystemVerilog仿真器一起编译多个文件。这些工具将看到一个unit空间。一个文件中的unit定义对于单个编译中的任何后续文件都是可见的。大多数SystemVerilog综合编译器和一些仿真器都支持单独的文件编译,每个文件都可以独立编译。这些工具将看到几个断开连接的unit声明空间。一个文件中的unit定义对任何其他文件都不可见。

很容易出现定义不同的重复标识符名称。

在SystemVerilog中,在同一名称空间中多次定义同一名称是非法的。如果一个文件在unit声明空间中定义了bool_t用户自定义类型,而另一个文件在unit声明空间中也定义了bool_t用户自定义类型,那么这两个文件永远不能一起编译,因为这两个定义最终会在相同的unit空间中结束。为了避免这种冲突,工程师必须使用’define 和 ’ifdef添加条件编译指令,以便只编译编译器遇到的第一个定义。

包可以导入到unit中,但其危害与直接在unit中定义的危害相同。此外,必须注意不要将同一个包多次导入同一unit声明空间,这是非法的。

避免像Bubonic plague一样使用$unit!相反,使用包来共享定义。
包避免了$unit的所有危害,包提供了一个易于维护和重用的受控声明空间。
最佳实践指南4-2

编译

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分