欢迎光临散文网 会员登陆 & 注册

Verilg 2001相对于Verilog 1995的改进(内含乘方运算符)

2023-08-21 11:32 作者:有AI野心的电工和码农  | 我要投稿

原文:http://blog.csdn.net/xiaqiang2006/archive/2010/10/28/5971787.aspx

Verilog HDL作为描述电子电路行为和结构的一种语言,其实是一种IEEE标准(IEEE Std.1364-1995).在IEEE Std.1364-1995标准的基础上,又发展出了Verilog IEEE 1364-2001标准,简称Verilog 2001标准,它在完全兼容Verilog 1995标准的基础上,对Verilog 1995标准进行了增强,使Verilog HDL使用起来更加方便,功能更加强大,进一步适应现在大规模集成电路设计的需要。

下面就分别介绍Verilog 2001标准改进的部分内容.

1. 对敏感列表所做的增强

always块在采用电平敏感事件时,所有的输入信号,也就是位于赋值语句中等号右边的信号,都必须在敏感列表中列出,否则就有可能发生错误。如下例,一个四输入与门,always后面的敏感列表中必须全部列出4个输入信号.

Verilog 2001对此作出增强,可以通过一个符号“*”来代替敏感列表的内容,表示将所有输入信号都加入敏感列表。这样做的好处是,避免设计人员因为疏忽而在敏感列表中漏掉了某个信号,丛而导致错误发生。如下例所示,功能和上例一样。

除了可以通过“*”代替电平敏感事件的敏感列表外,Verilog 2001还有一项针对敏感列表的增强之处,就是使用逗号代替原来敏感列表中的关键字or。如下例。

2. 对端口声明所作的增强

在一个模块的开始部分包含有该模块的端口声明(说明是输入端口或输出端口或是双向端口)和端口类型声明(说明端口变量是线网型的或是寄存器型的),Verilog 2001标准规定可以将这两部分合二为一。如下例所示。

这一改动确实使代码在书写上省去了不少麻烦,但还有更简单的书写方式。Verilog 2001标准允许在定义模块时就声明端口及其类型。如下例所示.

这种书写方式最大限度地减少了书写模块开头时的工作量,同时由于在定义模块时就将各个端口都声明好,因此避免了分开声明时容易漏掉端口的现象。

3. 对有符号型变量所作的增强

Verilog 1995标准规定只有用Interger定义的寄存器型变量才是有符号的,用reg定义的寄存器型变量和线网型变量都是无符号的。因为Interger型变量有着固定的位宽,一般为32位,因而使用起来不是很方便。

Verilog 2001对此进行了增强,允许用户将线网型变量、寄存器型变量以及函数等定义为有符号的。定义一个有符号的变量使用关键字“signed”。如

reg      signed    [63:0]    data;    

wire      signed    [7:0]    data;    

input      signed    [9:0]    data;    

function  signed    [127:0]    alu;    

除了可以将变量定义为有符号数以外,Verilog 2001还允许直接书写有符号数。Verilog 1995规定不包含进制的数是有符号的,也就是指直接书写的十进制数是有符号的,其余包含进制的数被认为是无符号的,这也给有符号数的使用带来了一定的局限性。Verilog 2001规定在进制前加上字母“s”即表示有符号数。

16'h12a0    //一般的书写方式被认为是无符号数    

16'sh12a0    //在进制前加上字母“s”被认为是有符号数

4.增加乘方操作符“**”

Verilog 2001添加了一个新的操作符“**”,用于执行乘方运算,其一般使用形式为

   result=base**exponent;

其中,base表示底数,exponent表示指数。

5.对给寄存器型变量赋初值所作的增强

Verilog 1995不允许在定义寄存器变量时为其赋初值,如果需要为寄存器型变量赋初值,可以通过在Initial块内赋值的办法实现。Verilog 2001对此作出增强,允许用户在定义寄存器变量的同时为其赋初值。

6.对自动位宽扩展所作的增强

在为变量赋值的时候,省略数的位宽将会自动进行位宽扩展,作用是将数调整为和变量匹配的位宽。

reg    [7:0]    data;    

initial    

data='bz;    //根据data的位宽自动进行扩展,data=8'hzz

但是在Verilog 1995中,当对一个位宽大于32的变量采用这种方法将其赋值为高阻态或者不定态时会出现问题,赋值的结果是较低的32位被赋值为高阻态或者不定态,而较高的其他位被赋值为0。只有在赋值的时候指明数的位宽才能解决这一问题。

//Verilog 1995中存在的问题    

reg    [63:0]    data;    

initial    

begin            

    data='bz;    //data=64'h0000_0000_zzzz_zzzz        

    data=64'bz;    //data=64'hzzzz_zzzz_zzzz_zzzz    

end

Verilog 2001对此作出了修正,解决了这一问题。

//Verilog 2001中不存在上述问题    

reg    [63:0]    data;    

initial     

   data='bz;    //data=64'hzzzz_zzzz_zzzz_zzzz


Verilg 2001相对于Verilog 1995的改进(内含乘方运算符)的评论 (共 条)

分享到微博请遵守国家法律