tag 标签: 命名空间

相关博文
  • 热度 16
    2015-12-13 22:23
    2084 次阅读|
    0 个评论
    关键名词解释: 编译单元(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 adder (input c, d) ; return c+d; endfunction module top (input logic a, b, output logic y); always_comb y = adder(a, b); endmodule 其中,top属于定义命名空间,adder、c、d属于块命名空间,而adder也属于编译单元域命令空间,a、b、y 属于端口命名空间,其余命令空间请各自挖掘。 后记 由于工作环境的关系(工程较小,没有良好的代码组织),命名空间是被我一直忽略的一个知识点,也可能被很多人忽略。最近为公司组建开发平台,随着需要引入工程的IP越来越多,代码、头文件在各个IP之间的相互调用,使得对命名空间的理解显得越来越重要。 下篇预告: 可综合的SystemVerilog:接口