登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Design IC

慢即是快,快即是慢

 
 
 

日志

 
 

SystemVerilog——常量(const)  

2010-11-09 09:25:02|  分类: SystemVerilog |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

之前看过《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

  • SystemVerilog中常量不是编译时间常量. 因此不允许使用常量(const)作为数组的范围参数。这一点不像C++, 其常量是编译时常量。但是,有两外一种选择,SystemVerilog用户允许使用参数(parameter)作为数组的范围(类似参数化的函数和类).

// const标识符并不是编译时常量,所以不能用来作为数组的范围定义
// const int unsigned bus_width = 32;
 
// 使用参数作为数组的范围定义是合法的。
parameter bus_width = 32;
 
// 下面的声明如果bus_width是const常量,则不合法,如果是参数,就合法
logic [bus_width-1:0] data[];

  • 尽管可以将方法的对象类型参数声明为const, 但是const仅仅对对象句柄有效,对对象的值并没有效果[3]. 在SystemVerilog中没有任何方式可以禁止用户修改对象本身. 但是,另一方面,在C++中,用户可以定义指针和值都是常量.
  • 由于上述限制,SystemVerilog不允许用户定义常量函数。比如将虚函数pack方法定义为常量函数或许很有用——可以保证其实现不会修改交易本身. (译者补充:可惜SystemVerilog并不支持).


参考资料

  1. Scott Meyers, Addison Wesley, July 2006, "Effective C++, third edition", accessed on August 19 2010
  2. Bertrand Meyer, Prentice Hall, 1997, "Object Oriented Software Construction", accessed on August 19 2010
  3. Janick Bergeron, Verification Guild, 2005, "Const usage in SV", accessed on August 19 2010

  评论这张
 
阅读(3148)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018