关键名词解释:
-
编译单元(compilation unit):SystemVerilog 源代码的集合
-
编译单元域(compilation-unit scope):即编译单元的本地范围,包含其他空间之外的所有声明
SystemVerilog有8个命名空间,其中两个为全局,两个为编译单元域内全局,剩余四个为局部,分别如下:
-
定义命名空间(definitions name space),即未被嵌入定义的module, macromodule, primitive, program, interfaces的标识符。上述标识符一旦被定义,在整个编译单元范围内不能再次使用
-
包命令空间(package name space),即所有编译单元间的package标识符。一旦标识符被定义,则该标识符不能再在任何编译单元中使用。
-
编译单元域命名空间(compilation-unit scope name space),在module, macromodule, primitive, program, interfaces结构之外的定义。即在编译单元域之内定义的functions, tasks, parameters, net declarations, user defined types等等
-
宏定义命令空间(text macro name space),编译单元间全局。如果两个宏定义使用同一个名称时,后面的宏定义覆盖前面的宏定义
-
模块命名空间(module name space),在module, macromodule, primitive, program, interfaces内定义的数据类型
-
块命名空间(block name space),在specify, function, task内定义的数据类型
-
端口命令空间(port name space),该命名空间与模块命名空间和块命名空间重叠,专用于两个不同的命名空间,且接口标识符可在模块命名空间中重新声明其网络类型
-
属性命令空间(attribute name space),包含在(* *)中,且紧跟在语句之前。属性标识符仅能在属性命名空间中使用
代码实例(example.sv):
function logic [3:0] adder (input [2:0] c, d);
return c+d;
endfunction
module top (input logic [2:0] a, b,
output logic [3:0] y);
always_comb
y = adder(a, b);
endmodule
其中,top属于定义命名空间,adder、c、d属于块命名空间,而adder也属于编译单元域命令空间,a、b、y 属于端口命名空间,其余命令空间请各自挖掘。
后记
由于工作环境的关系(工程较小,没有良好的代码组织),命名空间是被我一直忽略的一个知识点,也可能被很多人忽略。最近为公司组建开发平台,随着需要引入工程的IP越来越多,代码、头文件在各个IP之间的相互调用,使得对命名空间的理解显得越来越重要。
下篇预告:可综合的SystemVerilog:接口
文章评论(0条评论)
登录后参与讨论