Verilog系列:如何将方法定义于类外

一个设计规模巨大的集成电路,功能往往是非常复杂的,实现其的RTL代码量也是非常巨大的,为了验证这些众多和复杂的功能模块,往往也需要构建相对非常复杂的验证环境,因此,组成验证环境的代码也是巨大的,在具体管理这些代码的时候经常对代码进行划分“分而治之”,其中最常见的一种策略就是将具体环境的各个组件的声明与具体实现分开,分别存放管理.为此,在构建基于SystemVerilog的验证环境时引入了面向对象程序设计中经常用到的extern关键词,用extern标识方法后,可将方法的声明和本身实现存放在设计代码的不同地方,这样做有以下几方面优点:

  • 类本身篇幅缩短,可以提高程序的可阅读理解性;

  • 避免代码的冗长,便于管理;

  • 隐藏了方法的实现,避免了对于设计代码的恶意修改,提高了安全性;

那么,具体如何实现方法的声明和实现的分离呢?常见的具体步骤如下:

  1. 在类的内部声明方法原型时,在方法原型前增加关键词“extern”,用以告诉编译器本方法的定义在其他地方;

  2. 在类的外部定义方法的具体实现,这里需要注意此时方法名前需要有该方法所属类的类名和作用域符“::”,并且此处的方法声明必须与在类内部声明的方法原型一直;

但是在具体应用过程中,如果使用不注意,还是会遇到一些比较特殊的情况,下文将以具体示例说明.

【示例】方法原型参数列表中的参数具有默认值,方法体实现的参数列表中没有默认值.


【仿真结果】



这里需要注意以下两点:

已经在类的内部方法原型前使用了关键词“extern”,在类外部具体实现时不用再次使用关键词“extern”;

在类外具体实现方法时,需要在方法名前使用“类名::”;

【示例】方法原型参数列表中的参数无默认值,方法体实现部分的参数列表中的参数有参数默认值

【仿真结果】

编译不通过!

【示例】方法原型和方法实现体的参数列表中都有参数默认值,但是默认值不同

【仿真结果】

编译不通过!

通过上述三个示例可以看出,如果方法原型声明中参数有默认值,那么方法体实现时的参数列表可以不指定默认值.如果方法原型声明和方法体实现时都指定了参数的默认值,那么指定的默认值必须相同,否则编译错误.

【示例】

【仿真结果】

示例中,如果第8行的T不指定来自其类属性,那么这里引用的T将不是类中定义的,而是代码第2行定义的.这种情况在大型设计中经常出现,特别是设计由多个人员共同完成,不可避免的存在重复类型名的定义,极易导致仿真编译出现问题.示例中方法体value具体实现时明确了返回类型为cobj中指定的类型(typedef int)而不是类外指定的类型(typedef real T).如果没有明确指定使用的是类cobj中定义的(typedef int)还是类外定义的(typedef real T),那么编译时将会出现问题.

综上示例所述,在类外部实现方法体时注意以下几点将会对于实现类外定义方法很有裨益:

  • 方法原型声明于方法体具体实现时的声明必须匹配;

  • 为了使用确定的方法返回类型或者参数类型时可以使用作用域符限定具体使用的参数类型;

  • 如果方法原型声明中参数有默认值,那么方法体实现时的参数列表可以不指定默认值;

  • 如果方法原型声明中参数有默认值,那么方法体实现时的参数列表中可以不指定默认值,如果方法体也指定了参数默认值,那么其指定的默认值必须与原型声明中的相同.


全部评论

相关推荐

kl_我是东山啊:《相关公司:阿里巴巴》
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
秋国🐮🐴:拿到你简历编号然后让你知道世间险恶
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务