在SystemVerilog中所有类的方法都可以定义于类内,也可以定义于类外。一般将比较复杂的方法的实现放在类外,这样可以增加代码的可读性,而比较简单的方法在类内实现。如果什么方法的定义都放于类内部的话,那么查找一个方法将会比较麻烦。所以在实际使用时,经常将方法定义于类外,方法定义于类外一般分为两步实现:
第一步:在类内完成方法原型的声明,此时在方法原型前要使用关键字extern;
第二步:在类外实现方法,此时方法名前需要加上“类名::”,用于限定了该方法属于哪个类;
在完成了上述两步后,就完成了类内方法在类外实现的步骤。在完成了类内声明和类外定义之后,在使用时还需要注意类内和类外方法的匹配问题,也就是方法原型与实现的声明匹配问题,下面将通过示例说明常遇到的声明匹配问题。
1 方法原型有参数默认值,方法实现也有参数默认值,且默认值匹配
【示例】
【仿真结果】
示例中仿真结果显示d1和d2的值为方法参数列表中设置的默认值,所以当方法原型与方法实现的参数默认值匹配,且在调用该方法时没有传递对应的实参,那么这些参数将采用原型中设置的默认值。
2 方法原型有参数默认值,方法实现也有参数默认值,但默认值不匹配
【示例】
【仿真结果】
示例编译报错,当方法原型与方法实现中各自设置的默认值不匹配时,编译将报错。
3 方法原型有参数默认值,方法实现没有参数默认值
【示例】
【仿真结果】
示例中仅在方法原型中设置默认值,在方法实现时没有指定默认值,此时仿真时参数d1和d2将采用原型设置的默认值。所以当方法运行有默认值而实现没有设置参数默认值时,那么这些参数将采用方法原型中设置的默认值。
4 方法原型没有参数默认值,方法实现有参数默认值
【示例】
【仿真结果】
示例中仅在方法实现中设置默认值,在方法原型中没有指定默认值,此时仿真时参数d1和d2将采用实现中设置的默认值,但是仿真器编译提示:这种设置方法默认参数的方式将在以后的软件版本中报错,所以不推荐使用这种设置默认值的方式。
5 方法原型没有参数默认值,方法实现没有参数默认值
【示例】
【仿真结果】
示例中在方法原型和方法实现中都没有设置参数默认值,此时方法中参数的值取决于调用时传递给参数的实参值,并且此时必须要传递对应的实参值,否则编译报错,如下。
综上所述,当类中方法原型参数设置有默认值,方法在类外的实现可以不设置默认值,如果设置了默认值,默认值必须与方法原型设置的参数的默认值相同。如果类中方法原型和方法实现都没有设置参数默认值,那么方法在调用时必须设置对应的参数值。
更多内容请关注下面公众号!
本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通!