Verilg 2001相对于Verilog 1995的改进

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    //结果输出
        );
    input    a,b,c,d;
    output    out;

    wire    a,b,c,d;
    reg    out;

    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    //结果输出
        );
    input    a,b,c,d;
    output    out;

    wire    a,b,c,d;
    reg    out;

    always    @*    //“*”表示将所有输入信号加入到敏感列表中
    begin
        out=a&b&c&d;
    end
   
    endmodule
    除了可以通过“*”代替电平敏感事件的敏感列表外,Verilog 2001还有一项针对敏感列表的增强之处,就是使用逗号代替原来敏感列表中的关键字or。如下例。
    //带异步复位的D触发器
    module d_flipflop(
        d,    //输入数据信号
        clk,    //输入时钟信号
        rst,    //输入复位信号,低电平有效
        q,    //输出数据信号
        );
    input    clk;
    input    rst;
     input    d;
    input    q;

    wire    clk;
    wire    rst;
    wire    d;
    wire    q;

    always    @(posedge clk,negedge rst)    //用逗号代替了关键字or
    begin
        if(!rst)
            q<=0;
        else
            q<=d;
    end
   
    endmodule
   
2.对端口声明所作的增强
    在一个模块的开始部分包含有该模块的端口声明(说明是输入端口或输出端口或是双向端口)和端口类型声明(说明端口变量是线网型的或是寄存器型的),Verilog 2001标准规定可以将这两部分合二为一。如下例所示。
    //2位二进制数的加法
    module adder(
        a,    //加数
        b,    //加数
        sum,    //和
        );
    //经过增强的端口声明部分同时包含了端口类型声明
    input    wire    [1:0]    a,b;
    output    reg    [2:0]    sum;
   
    always    @*
    begin
        sum=a+b;
    end

    endmodule
    这一改动确实使代码在书写上省去了不少麻烦,但还有更简单的书写方式。Verilog 2001标准允许在定义模块时就声明端口及其类型。如下例所示.
    module     adder(
    input    wire    [1:0]    a,    //加数
    input     wire     [1:0]    b,    //加数
    output    reg    [2:0]    sum    //和
    );
       
    always @*
    begin
        sum=a+b;
    end
   
    endmodule
    这种书写方式最大限度地减少了书写模块开头时的工作量,同时由于在定义模块时就将各个端口都声明好,因此避免了分开声明时容易漏掉端口的现象。

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对此作出增强,允许用户在定义寄存器变量的同时为其赋初值。
    //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。只有在赋值的时候指明数的位宽才能解决这一问题。
    //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  

你可能感兴趣的:(硬件设计/CPLD/FPGA)