Verilog系列:class中的const属性
在SystemVerilog建模时经常会遇到一些定义在类中的部分属性在实例化后被有意或者无意的修改,从而导致一些不期望的行为发生,为此,在SystemVerilog中引入了面向对象语言中经常用到的const限定符,使用这个限定符可以把一个属性转换成为常量属性,即可以保证该属性不能被轻易修改。
const在具体的使用过程中,常以两种形式出现:全局性常量(global constants)和实例化常量(instance constants)。其中全局性常量一般在属性初始化声明时指定,指定后的全局常量不能通过任何途径进行修改。实例化常量是在构造函数(new)中对已经指定const限定符的属性进行初始化,这个属性在具体的实例化过程中调用构造函数时指定。可见,在不同的实例中,以实例化方式实现的const属性在不同的实例中指定的具体数值可以不同,但是全局const的属性在任何实例中的具体数值都是一样的,也因为这个特点,全局性的常量可以指定为static,而在实例化时在构造函数中指定初值的常量不能声明为static(也主要是因为static变量一般在仿真开始时其值就需要确定,而一般一个对象的具体实例化是在仿真的过程中动态产生的)。
【示例】const的具体使用
【仿真结果】
在具体使用const时需要特别注意以下几点:
-
如果一个变量作为instanceconst使用,那么该变量的初始化只能在构造函数中使用,不能既在其声明指定又在构造函数中指定;
-
凡事指定为const的属性,其初始化只能在类中声明时指定或者在构造函数中指定,不能在实例化后对其进行修改,例如:
p.j = 'hD; // illegal!