所谓的语言要素,实际上主要包括词法和数据类型。

因为Verilog HDL与C语言很像,所以可以从C语言的角度来学习Verilog HDL。

词法

词法就是词的组成。Verilog HDL的符号流包括 空白符(White Space)、操作符(Operators)、数字(Numbers)、字符串(Strings)、注释(Comments)、标识符(Identifiers)、关键字(Keywords)。

  1. 空白符与C语言相同,如空格,制表符,换行符等,Verilog程序可以分行,也可以不分行。

  2. 操作符(运算符),与C语言基本类似,不同的有:增加了按位同或(^~,~^,这两个等价),等式运算符加了全等(===),不全等(!==),缩位运算符,位拼接运算符。

  3. 数字的表示方法与C语言有点不同。 Verilog HDL有4中基本状态:0,1,x(或X,未知态),z(或Z,高阻,或用?表示)。
    常量有3种类型:整数,实数,字符串。
    整数与C语言表示方法差异较大,完整格式为:

    +/-<size><base><value>
    

    其中size表示对应的二进制数的宽度,base表示进制,value表示基于进制的数字值。
    base(缺省为d/D):b/B,d/D,o/O,h/H。
    eg:

    8'b11000101 = 二进制的11000101
    8'hd5 = 16进制的d5
    4'B1x_01 = 二进制的1x01
    5'Hx = 16进制的x,对应于二进制的xxxxx
    

    tips
    size指的是对应的二进制的宽度,于base无关,如2’h1 = 01B,而不是 00000001B。

    我看的《Verilog程序设计教程》(王金明著)这本书P34说size省略时,默认值为32位,但是下面又说“如果没有定义一个整数的位宽,其宽度为相应值中定义的位数”,有点前后矛盾。 负数采用二进制补码。

    缺省size,缺省base,代表十进制数。 个人认为,通常情况下,size和base都缺省,应该就够用了。

    实数与C语言类似,但是没有区分单精度和双精度,可以采用科学计数法

  4. 字符串也与C语言类似,采用字符序列表示,不能多行书写。

  5. 注释与C语言类似,两种:// 和 / * * /

  6. 标识符与C语言类似,由字母,数字,$,_ 组成。首字符必须是 字母 或 _ 。区分大小写。 标识符还可以以 \ 开头,但不算作是标识符的一部分。

  7. 关键字都是小写,是C语言的好几倍。