可综合的SystemVerilog:命名空间

来源:转载

关键名词解释:

  • 编译单元(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:接口

分享给朋友:
您可能感兴趣的文章:
随机阅读: