Verilog系列:如何将方法定义于类外
一个设计规模巨大的集成电路,功能往往是非常复杂的,实现其的RTL代码量也是非常巨大的,为了验证这些众多和复杂的功能模块,往往也需要构建相对非常复杂的验证环境,因此,组成验证环境的代码也是巨大的,在具体管理这些代码的时候经常对代码进行划分“分而治之”,其中最常见的一种策略就是将具体环境的各个组件的声明与具体实现分开,分别存放管理.为此,在构建基于SystemVerilog的验证环境时引入了面向对象程序设计中经常用到的extern关键词,用extern标识方法后,可将方法的声明和本身实现存放在设计代码的不同地方,这样做有以下几方面优点:
-
类本身篇幅缩短,可以提高程序的可阅读理解性;
-
避免代码的冗长,便于管理;
- 隐藏了方法的实现,避免了对于设计代码的恶意修改,提高了安全性;
那么,具体如何实现方法的声明和实现的分离呢?常见的具体步骤如下:
-
在类的内部声明方法原型时,在方法原型前增加关键词“extern”,用以告诉编译器本方法的定义在其他地方;
-
在类的外部定义方法的具体实现,这里需要注意此时方法名前需要有该方法所属类的类名和作用域符“::”,并且此处的方法声明必须与在类内部声明的方法原型一直;
【示例】方法原型参数列表中的参数具有默认值,方法体实现的参数列表中没有默认值.
【仿真结果】
这里需要注意以下两点:
已经在类的内部方法原型前使用了关键词“extern”,在类外部具体实现时不用再次使用关键词“extern”;
【示例】方法原型参数列表中的参数无默认值,方法体实现部分的参数列表中的参数有参数默认值
【仿真结果】
【示例】方法原型和方法实现体的参数列表中都有参数默认值,但是默认值不同
【仿真结果】
通过上述三个示例可以看出,如果方法原型声明中参数有默认值,那么方法体实现时的参数列表可以不指定默认值.如果方法原型声明和方法体实现时都指定了参数的默认值,那么指定的默认值必须相同,否则编译错误.
【示例】
【仿真结果】
综上示例所述,在类外部实现方法体时注意以下几点将会对于实现类外定义方法很有裨益:
-
方法原型声明于方法体具体实现时的声明必须匹配;
-
为了使用确定的方法返回类型或者参数类型时可以使用作用域符限定具体使用的参数类型;
-
如果方法原型声明中参数有默认值,那么方法体实现时的参数列表可以不指定默认值;
-
如果方法原型声明中参数有默认值,那么方法体实现时的参数列表中可以不指定默认值,如果方法体也指定了参数默认值,那么其指定的默认值必须与原型声明中的相同.