Verilg 2001相对于Verilog 1995的改进

时间:2014年10月30日

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个输入信号.

module and4(

a,//与门的输入

b,//与门的输入

c,//与门的输入

d,//与门的输入

out//结果输出

);

inputa,b,c,d;

outputout;

wirea,b,c,d;

regout;

always@(a or b or c or d)//敏感列表中必须列出所有的输入信号

begin

out=a&b&c&d;

end

endmodule

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

module and4(

a,//与门的输入

b,//与门的输入

c,//与门的输入

d,//与门的输入

out//结果输出

);

inputa,b,c,d;

outputout;

wirea,b,c,d;

regout;

always@*//“*”表示将所有输入信号加入到敏感列表中

begin

out=a&b&c&d;

end

endmodule

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

//带异步复位的D触发器

module d_flipflop(

d,//输入数据信号

clk,//输入时钟信号

rst,//输入复位信号,低电平有效

q,//输出数据信号

);

inputclk;

inputrst;

inputd;

inputq;

wireclk;

wirerst;

wired;

wireq;

always@(posedge clk,negedge rst)//用逗号代替了关键字or

begin

if(!rst)

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

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

//2位二进制数的加法

module adder(

a,//加数

b,//加数

sum,//和

);

//经过增强的端口声明部分同时包含了端口类型声明

inputwire[1:0]a,b;

outputreg[2:0]sum;

always@*

begin

sum=a+b;

end

endmodule

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

moduleadder(

inputwire[1:0]a,//加数

inputwire[1:0]b,//加数

outputreg[2:0]sum//和

);

always @*

begin

sum=a+b;

end

endmodule

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

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

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

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

regsigned[63:0]data;

wiresigned[7:0]data;

inputsigned[9:0]data;

functionsigned[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对此作出增强,允许用户在定义寄存器变量的同时为其赋初值。

//Verilog 1995为寄存器型变量赋初值的方法

reg[1:0]a,b;

initial

begin

a=2'b01;

b=2'b11;

end

//Verilog 2001为寄存器型变量赋初值的方法

reg[1:0]a=2'b01;

reg[1:0]b=2'b11;

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

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

reg[7:0]data;

initial

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

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