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

Verilg 2001相对于Verilog 1995的改进(Z) (内含 乘方 运算符** )相关推荐

  1. (47)System Verilog 类中变量随机激励inside运算符

    (47)System Verilog 类中变量随机激励inside运算符 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机 ...

  2. 编码器z相 C语言代码,编码器的Z相是什么?

    有些编码器有Z相,有些没有.一般Z相是编码器的一转信号,即编码器没转一圈就产生一个脉冲,可以作为运动装置的零点. 回答者: 大杰 - 高级顾问&nbsp&nbsp第14级 2008-1 ...

  3. H.266 JEM相对于HEVC HM的改进

    参考文献:JEM algorithm description editing 注意 JEM可以看做H.265到H.266的过度阶段参考软件,把很多有效果的算法都收纳进去了,与目前的H.266/VVC是 ...

  4. java int相除向上取整_Java基础篇——Java运算符

    Java运算符按功能可分为:算数运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和条件运算符. 算数运算符 算术运算符包括通常的加(+).减(-).乘(*).除(/).取模(%),完成整数型和浮点 ...

  5. Verilog中的逻辑运算符与按位运算符的区分

    我们在写Verilog的时候经常会用到的是低电平复位问题,例如: always@(posedge clk or negedge rst_n) beginif(~rst_n) ...;else ...; ...

  6. FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?

    前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...

  7. Verilog中task使用

    使用Verilog-2001语法,格式更简洁: Verilog 1995:Using the Task Function, Combine Port List, Type Information, a ...

  8. (筆記) 如何使用Debussy與ModelSim做Co-Simulation? (SOC) (Verilog) (VHDL) (Debussy) (ModelSim)

    Abstract 本文介紹如何使用Debussy與ModelSim做Co-Simulation,並使用Verilog.VHDL以及Verilog搭配VHDL交叉一起simulation. Introd ...

  9. Verilog parameter 参数

    文章目录 语法 注意 示例:支持递增或递减的计数器 localparam Verilog支持使用参数来指定数据位宽或表示某些有特殊含义的常量,可以便于实现模块的通用性和以后的维护,对于同一个模块,可以 ...

最新文章

  1. 提交svn的时候,提示丢失了预定增加的xxxx
  2. Linux下如何进行FTP设置
  3. Debug时如何跳过(不执行)某些代码
  4. 简单纯文字浮动信息-Tooltip
  5. Hibernate学习——建立一个简单的Hibernate项目
  6. openwrt 编译时提示缺少libstdc++,libpthread.so.0文件
  7. 循环的中断操作(C#基础回顾03)
  8. 服务器系统的安装方法,服务器的操作系统安装方法
  9. uniapp 表单提交图片跟其他填写数据_记录第一次实现表单数据提交到数据库
  10. ElasticSearch学习(三):配置与集群
  11. 前端js下载mp4、flv格式的文件流
  12. lena-ts 图像处理和卷积操作
  13. Envi处理大气校正时报错,怎么解决呀
  14. java/poi 调整Excel 列宽支持自适应中文字符宽度
  15. 计算机网络——集线器与交换机
  16. Sphinx 简单应用
  17. orc识别 语音识别 云真机 内网穿透快速调研
  18. Win10(64位)系统清除BIOS密码的方法
  19. 金蝶EAS,KSQL,执行数据库方言
  20. java javascript数组_浅谈javascript和java中的数组

热门文章

  1. 别给小偷可乘之机!日本山形县警方呼吁民众“锁门”
  2. 函数与导数题目类型和解法思路的总结
  3. 环境变量PATH、mv命令、cp命令、文档查看命令(cat、more、less、head、tail)
  4. CentOS6.5系统重启后宕机
  5. IOS学习笔记——Objective-c基础(一)
  6. excel2003 java_java 读取 excel 2003 或 excel 2007
  7. 吉林省计算机二级证书用英语怎么说,吉林省全国高等学校计算机水平考试二级...
  8. python 取一个字前的文本的_python删除某一行字符前面的内容
  9. 物联网卡linux,Server Develop (六) Linux epoll总结
  10. mysql双节点安装_快速安装及配置MySQL Replication双主节点集群--及改变数据保存目录...