4.1 逻辑运算符
(1)&&逻辑与;
(2)||逻辑或;
(3)!逻辑非。
逻辑与、或的优先级别低于关系运算符,逻辑非高于算数运算符。建议使用括号来明确表达优先关系。
4.2 关系运算符
(1) a<b,小于;
(2) a>b,大于;
(3) a<=b,小于等于;
(4) a>=b,大于等于;
若关系为假,返回0;为真,返回1;某个操作数不定,返回不定值。所有关系运算符优先级别相同,低于算术运算符。
4.3 等式运算符
(1)==
(2)!=
又称逻辑等式运算符。若操作数某些位可能为不定值x和高阻值z,结果可能为不定值x。
(3)===
(4)!==
会将不定值x和高阻值z也进行比较,必须完全一致才返回1,否则为0。常用于case表达式判别。
它们的字符之间不能有空格。
if(A == 1'bx) $display("Aisx"); //判别为x,不执行 if(A === 1'bx) $display("Aisx"); //判别为1,执行
4.4 移位运算符
有左移(a>>n)和右移(a<<n),a为操作数,n为移的位数。两种都用0来填补。
4.5 位拼接运算符
位拼接运算符“{}”可以将多个信号的某些位拼接起来。
{信号1的某几位,信号2的某几位,...,信号n的某几位} {a,b[3:0],w,3'b101} //相当于{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1}
计算拼接信号位宽大小时必须知道每个信号的位宽。
{4{w}} //等于{w,w,w,w} {b,{3{a,b}}} //等于{b,a,b,a,b,a,b}
4.6 缩减运算符
缩减运算符为单目运算符,也有与、或、非,其规则类似于位运算符,但运算过程不同。缩减运算为递推运算,先将操作数第1位与第2位进行与、或、非,再将结果与第3位与、或、非,...,直至最后一位,得到一个1位二进制数。例如
reg [3:0] B; reg C; C = &B;
相当于:
C = ((B[0] & B[1]) & B[2]) & B[3];
4.7 优先级别
4.8 关键词
都是小写。变量定义不要与关键词冲突。
always, and, assign, begin, buf, bufifO, bufifl, case, casex, casez, cmos, deassign, default, defparam, disable, edge, else, end, endcase, endmodule, endf unction, end primitive, endspecify, end table, end task, event, for, force, forever, fork, function, highzO, highzl, if, initial, inout, input, integer,join, large, macromodule, medium, module, nand, negedge, nmos, nor, not, notifO,notifl, or, output, parameter, pmos, posedge, primitive, pullO, pulll, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos, rtran, rtranifO, rtranifl, scalared, small, specify,specparam,strength,strongO, strongl, supplyO, supplyl, table, task, time, tran, tranifO, tranifl, tri, triO, tril, triand, trior, trireg, vectored, wait, wand, weakO, weakl, while,wire,wor, xnor,xor
4.9 赋值语句和块语句
4.9.1 赋值语句
1.非阻塞(Non_Blocking)赋值(如b<=a)
(1)语句块中上面语句所赋变量值不能立即为下面语句所用;
(2)块结束后才完成这次赋值,所赋变量值是上一次赋值得到的,例如:
always @(posedge clk) begin b <= a c <= b end
c的值为b的初始值,而非a的值。
(3)编写可综合的时序逻辑模块时最常用。
2.阻塞(blocking)赋值方式(如b=a)
(1)赋值语句执行完后块才结束;
(2)b的值在赋值语句执行完后立刻就改变;
(3)在时序逻辑中使用时可能会产生意想不到的结果。
4.9.2 块语句
用来将2或多条语句组合在一起。
1.顺序块
用begin和end标识。
(1)所有语句顺序执行,上一条结束才执行下面的;
(2)每条语句的延迟时间相对于前一条语句的仿真时间而言;
(3)最后一条语句执行完才跳出该语句块。
块内声明语句可以是参数、reg型、integer型和real型。
begin areg = breg; creg = areg; //creg的值为breg的值 end
2.并行块
用folk和join标识。
(1)块内语句同时执行;
(2)每条语句延迟时间相对于程序流程进入块内的仿真时间而言;
(3)延迟时间用来给赋值语句提供执行时序;
(4)按延迟时间排序在最后的语句执行完后或一个disable语句执行时,跳出该程序块。
块内声明语句可为参数、reg型、integer型、real型、time型和事件说明语句。
fork #50 r = 'h35; #100 r = 'hE2; #150 r = 'h00; #200 r = 'hF7; #250 -> end_wave; //触发事件 join
上面代码生成一个波形。
3.块名
可给每个块取一个名字,将名字加在begin或fork后面。
(1)可以在块内定义局部变量;
(2)可以允许块被其它语句调用;
(3)Verilog中变量都是静态的,只有唯一的存储地址,进出块不影响变量内的值。