2010-11-09 09:25:02| 分类: SystemVerilog | 标签: |举报 |字号大中小 订阅
之前看过《Thinking In C++》这本书,再看此文章,语言和语言之间,互有借鉴,但是却互不相同。
来源:http://systemverilog.co/wiki/Constants
Contents |
const限制符
SystemVerilog允许声明常量描述符。通过在变量定义前增加const关键字来声明此变量为常量。当定义为常量的时候,必须给其提供一个值,在之后的代码里面,SystemVerilog编译器将禁止任何对此变量进行修改的动作。
In addition to a normal identifier declaration, 除了对通常的变量进行常量声明意外,the const限制符还可以用来声明函数/任务的参数为常量型。函数的参数可以是值传递,或者是引用传递。当是值传递的时候,const限制符和平常意义一样,本地参数绑定的值不能被改变。
当使用引用传递的时候,SystemVerilog编译器保证其引用不会被函数修改。普通数组(包括动态数组)是通过值传递。由于数组有可能很大,SystemVerilog允许通过关键字“ref”声明数组参数为引用方式。但是这种方式会造成一定风险,用户可能会破坏性的修改数组的值。通过const关键字来限制数组参数,可以避免此危险。编译器将保证在函数内部,用户不能修改此数组。
Scott Meyers在他的经典作品"Effective C++[1]"中展示了在C++中使用常量的多种情况。但是,现在我们看来,大多数情况并不适用于Systemverilog中的const限制符——主要原因是当前SystemVerilog的区域(scope)限制符功能太有限。
const限制符的基本使用是用来声明常量. 可以保证值不被错误的代码改变。
// Barker Code for FCS
const bit [63:0] fcs_barker='hB6AB31E0;
// do not change bus width dynamically
const int bus_width = 8;
// Nobody should replace Janick
const string name = "Janick Bergeron";
// no need to modify data while calculating fcs
function int fcs (const ref bytes[]);
更有趣的是使用const进行数组引用传递 for passing arrays by reference. 一个典型的使用方式是声明类的接口(通过虚函数—不要和SystemVerilog中的interface结构相混淆). 将类接口想象为一个契约,const限制符能帮助我们强化这个契约.
看下面xactn基类, 虚函数定义了类的接口,任何由此类扩展而来的类必须实现这两个方法。
方法pack要求要求返回一个字节序列,其值等于所引用的数组. 另一方面, unpack方法从给定的字节序列重建交易(transaction). 从方法的功能上可以看到,不能修改给定的字节序列。为了满足这个要求被满足,用户在继承xactn基类的事哦胡,参数bytes需要被声明为const.在虚函数unpack中使用const来限制bytes参数, 可以确保任何unpack的实现都不能够修改给定的字节序列参数.
// virtual base class
class xactn;
// user functions
virtual function void pack(ref bytes[]);
virtual function void unpack(const ref bytes[]);
// other function declarations omitted
endclass
Gotchas
// const标识符并不是编译时常量,所以不能用来作为数组的范围定义
// const int unsigned bus_width = 32;
// 使用参数作为数组的范围定义是合法的。
parameter bus_width = 32;
// 下面的声明如果bus_width是const常量,则不合法,如果是参数,就合法
logic [bus_width-1:0] data[];
评论