2.语法
(1)空白符和注释
空白符包括 空格、Tab、换行和换页符号。
注释用来解释语句中的变量的含义或者语句的作用等。注释分为行注释和块注释两种方式:
行注释用符号//(两个斜杠)开始,注释到本行结束;
块注释用/*开始,用*/结束。块注释可以跨越多行,但它们不能嵌套
(2)常量包括整数、字符串和参数
整数 4种进制表示形式:
二进制整数(b或B) 十进制整数(d或D或默认) 十六进制整数(h或H) 八进制整数(o或O)
整数的3种表达方式 | 说 明 | 举 例 |
<位宽> ’<进制符号> <数字> | 完整的表达方式 | 8’b11000101或8’hc5 |
<进制符号> <数字> | 缺省位宽,则位宽为相应值中定义的位数 | hc5 |
<数字> | 缺省进制为十进制,位宽默认为32位 | 197 |
这里位宽指对应二进制数的宽度
合法的书写整数的例子
5’o27 //5位八进制数27
4’D2 //4位十进制数2
5’Hx // 5位x,即xxxxx
8 ’h 2A //在位宽和’之间、进制和数值之间允许出现空格
(1)在较长的数之间可以用下划线“_”分开
如16’b1010_1101_0010_1001 数字的第1个字符不能是下划线,下划线也不可用在位宽和进制处,只能用在具体的数字之间
(2)如果没有定义一个整数的位宽,其宽度为相应值中定义的位数
‘o721 //9位八进制数
‘hAF //8位十六进制数
(3)如果定义的位宽比实际的位数长,通常在左边填0补位。但如果数最左边一位为x或z,则用x或z在左边补位
10‘b10 //左边补0 ,变成0000000010
10‘bx0x1 //左边补x ,变成xxxxxxx0x1
(4)如果定义的位宽比实际的位数小,则左边的位被截掉
3‘b1001_0011 //与3‘b011相等
5‘H0FFF //与5‘H1F相等
(5)x和z值 x表示不定值,z表示高阻值;(不懂)
x和z代表的二进制位数取决于所用的进制——x(或z)在二进制中代表1位的x(或z),在八进制中代表3位的x(或z),在十六进制中代表4位的x(或z)
(6)整数可以带符号(正负号),并且正、负号应写在最左边 在位宽前加一个负号,即表示负数,负数通常表示为该负数的二进制补码
如:-8’d5 //-5的补码,= 8‘b11111011
字符串是用双引号括起来的可打印字符序列,不能多行书写。 作用:在仿真时显示一些相关信息,或者指定显示的格式。 例:”INTERNAL ERROR”, ”this is an example for Verilog HDL”
【例】reg[8*12:1] stringvar;//字符串
initial
begin
stringvar = “Hello world!”;
end
参数
在Verilog中是用参数parameter来定义符号常量,即用parameter定义一个参数名来代表一个常量。
例:parameter SEL = 8, CODE =8‘ha3; //为参数SEL 赋值 8,为参数CODE 赋值 a3(十六进制)
标识符是用户编程时给Verilog HDL语言描述的对象起的名字。标识符可由字母、数字、下划线和$符号构成
如模块名、端口名、变量名、常量名、实例名等
定义标识符时应遵循如下规则
① 首字符必须是字母或下划线,不能是数字或$符号!
② 字符数不能多于1023个。
③ 标识符是区分大小写的。
④ 标识符不要与关键字同名!
(3)运算符及表达式
1、算术运算符
进行整数除法运算时,结果值略去小数部分,只取整数部分!
求模即是求一个数被另一个数相除后所得的余数。%称为求模(或求余)运算符,要求%两侧均为整型数据。
求模运算结果值的符号位取第一个操作数的符号位!
【例】 -11%3 结果为-2 进行算术运算时,若某操作数为不定值x,则整个结果也为x 。
2、逻辑运算符
逻辑运算符把它的操作数当作布尔变量(逻辑1、逻辑0或不定值):
非零的操作数被认为是真(1‘b1)
零被认为是假(1‘b0)
不确定的操作数如4’bxx00, 被认为是不确定的(可能为零,也可能为非零)(记为1’bx); 但4’bxx11被认为是真(记为1’b1,因为它肯定是非零的)。
3.位运算符
位运算符中的双目运算符要求对两个操作数的相应位逐位进行逻辑运算。位运算其结果与操作数位数相同。
两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。 【例】若A = 5’b11001,B = 3’b101, 则A & B = (5’b11001)&(5’b00101)= 5’b00001
4.关系运算符
关系运算的结果为1位的逻辑值1或0或x
关系运算时,若结果为真,则返回值为1;若关系为假,则返回值为0;若某操作数为不定值x,则关系运算的结果是模糊的,返回值为x。
所有的关系运算符优先级别相同。
关系运算符的优先级低于算术运算符。
【例】 a<size - 1 等同于: a<(size - 1) size -(1<a) 不等同于: size-1<a
5.等值运算符
等于运算符(==)和全等运算符(===)的区别:
使用等于运算符时,两个操作数必须逐位相等,结果才为1;若某些位为x或z,则结果为x;
使用全等运算符时,若两个操作数的相应位形式上完全一致(如同是1,或同是0,或同是x,或同是z),则结果为1;否则为0。