命名空间是一组用于一个特定目的的标识符的集合。在一个命名空间中定义的标识符与该命名空间相关联。一个标识符可以在多个命名空间中定义。标识符在一个命名空间中的含义完全与在其它命名空间中的含义分隔开来。因此,一个命名空间引入了一个域,我们可以在这个命名空间中定义任何标识符而又能确保该标识符不会与其它命名空间中的标识符相混淆。
这个特性是使用命名空间的主要动机。在大的计算机程序或文档中,具有几百或几千个标识符是很普遍的。如果没有命名空间的概念(或相似的概念),那么我们很难确保标识符的唯一性。命名空间提供了一种简单的方法将逻辑上相关的标识符分组到对应的命名空间,因此也就使得系统更加模块化。
SystemVerilog中的标识符具有8个命名空间:两个是全局的(
定义命名空间和
包命名空间)、两个对于编译单元是全局的(
编译单元命名空间以及
文本宏命名空间)、四个是局部的。这8个命名空间的描述如下:
- 定义命名空间统一了所有非嵌套模块、宏模块、原语、程序、以及在所有其它声明之外定义的接口标识符。一旦一个名字在一个编译单元内定义了一个模块、宏模块、原语、程序、或接口,那么这个名字就不能在任何编译单元内再次使用来声明另外一个非嵌套模块、宏模块、原语、程序或所有其它声明之外的接口。这与IEEE 1362-2001中的定义命名空间兼容。
- 包命名空间统一了在所有编译单元内定义的所有包标识符。一旦一个名字被用于在一个编译单元内定义一个包,那么这个名字就再也不能在任何编译单元内声明另外一个包。
- 编译单元作用域命名空间存在于模块、宏模块、接口、包、程序、以及原语结构的外部。它统一了编译单元作用域内的函数、任务、参数、命名事件、线网声明、变量声明的定义。
- 文本宏命名空间在编译单元内使全局的。由于文本宏在引入和使用的时候具有前导的`所以,它们不会与任何其它命名空间混淆。文本宏名字在组成编译单元的输入文件组中以线性顺序定义。后续相同名字的定义会过载之前的定义。
- 模块命名空间由模块、宏模块、接口、包、程序和原语结构引入。它统一了模块、宏模块、接口、程序、函数、任务、命名块、实例名、参数、命名事件、线网声明、变量声明、以及在其所包围接口内的用户定义类型的定义。
- 块命名空间由命名或未命名块、specify、函数、以及任务接口引入。它统一了命名块、函数、任务、参数、命名事件、声明的变量类型、以及在其所包围接口内的用户定义类型的定义。
- 端口命名空间由模块、宏模块、接口、原语、以及程序结构引入。它提供了一种方式来结构化地定义位于两个不同命名空间中两个对象间的连接。连接可以是单向的(input 或output),也可以是双向的(inout或ref)。端口命名空间与模块命名空间以及块命名空间重叠。本质上,端口命名空间指定了不同命名空间中两个名字的连接类型。声明的端口类型包括input、output、inout、以及ref。在端口命名空间中引入的端口名字可以通过声明一个与端口相同名字的变量或线网在模块命名空间中重新引入。
- 属性命名空间由附着在一个语言元素上的(*和*)结构包围(参见2.8节)。一个属性名字只能在属性命名空间中定义和使用。任何其它类型的名字都不能在这个命名空间中定义。
0
收藏
转载于:https://blog.51cto.com/wjmd521/36042