操作符类型下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。本章将对每个操作符用一个例子作出解释。操作符类型符号连接及复制操作符一元操作符算术操作符逻辑移位操作符关系操作符相等操作符按位操作符逻辑操作符条件操作符{}{{}}!~&|^*/%+-=======!=!==&^~^|&&||?:最高最低优先级Verilog中的大小(size)与符号Verilog根据表达式中变量的长度对表达式的值自动地进行调整。Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算modulesign_size;reg[3:0]a,b;reg[15:0]c;initialbegina=-1;//a是无符号数,因此其值为1111b=8;c=8;//b=c=1000#10b=b+a;//结果10111截断,b=0111#10c=c+a;//c=10111#10c=b+a;endendmodule算术操作符modulearithops();parameterfive=5;integerans,int;reg[3:0]rega,regb;reg[3:0]num;initialbeginrega=3;regb=4'b1010;int=-3;//int=1111……1111_1101endinitialfork#10ans=five*int;//ans=-15#20ans=(int+5)/2;//ans=1#30ans=five/int;//ans=-1#40num=rega+regb;//num=1101#50num=rega+1;//num=0100#60num=int;//num=1101#70num=regb%rega;//num=1#80$finish;joinendmodule+加-减*乘/除%模•将负数赋值给reg或其它无符号变量使用2的补码算术。•如果操作数的某一位是x或z,则结果为x•在整数除法中,余数舍弃•模运算中使用第一个操作数的符号注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。按位操作符modulebitwise();reg[3:0]rega,regb,regc;reg[3:0]num;initialbeginrega=4'b1001;regb=4'b1010;regc=4'b11x0;endinitialfork#10num=rega&0;//num=0000#20num=rega®b;//num=1000#30num=rega|regb;//num=1011#40num=regb®c;//num=10x0#50num=regb|regc;//num=1110#60$finish;joinendmodule~not&and|or^xor~^xnor^~xnor•按位操作符对矢量中相对应位运算。regb=4'b1010regc=4'b1x10num=regb®c=1010;•位值为x时不一定产生x结果。如#50时的or计算。当两个操作数位数不同时,位数少的操作数零扩展到相同位数。a=4'b1011;b=8'b01010011;c=a|b;//a零扩展为8'b00001011逻辑操作符modulelogical();parameterfive=5;regans;reg[3:0]rega,regb,regc;initialbeginrega=4‘b0011;//逻辑值为“1”regb=4‘b10xz;//逻辑值为“1”regc=4‘b0z0x;//逻辑值为“x”endinitialfork#10ans=rega&&0;//ans=0#20ans=rega||0;//ans=1#30ans=rega&&five;//ans=1#40ans=regb&®a;//ans=1#50ans=regc||0;//ans=x#60$finish;joinendmodule!not&&and||or•逻辑操作符的结果为一位1,0或x。•逻辑操作符只对逻辑值运算。•如操作数为全0,则其逻辑值为false•如操作数有一位为1,则其逻辑值为true•若操作数只包含0、x、z,则逻辑值为x逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。逻辑反与位反的对比modulenegation();reg[3:0]rega,regb;reg[3:0]bit;reglog;initialbeginrega=4'b1011;regb=4'b0000;endinitialfork#10bit=~rega;//num=0100#20bit=~regb;//num=1111#30log=!rega;//num=0#40log=!regb;//num=1#50$finish;joinendmodule!logicalnot逻辑反~bit-wisenot位反•逻辑反的结果为一位1,0或x。•位反的结果与操作数的位数相同逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。一元归约操作符modulereduction();regval;reg[3:0]rega,regb;initialbeginrega=4'b0100;regb=4'b1111;endinitialfork#10val=®a;//val=0#20val=|rega;//val=1#30val=®b;//val=1#40val=|regb;//val=1#50val=^rega;//val=1#60val=^regb;//val=0#70val=~|rega;//(nor)val=0#80val=~®a;//(nand)val=1#90val=^rega&&®b;//val=1$finish;joinendmodule&and|or^xor~^xnor^~xnor•归约操作符的操作数只有一个。•对操作数的所有位进行位操作。•结果只有一位,可以是0,1,X。移位操作符moduleshift();reg[9:0]num,num1;reg[7:0]rega,regb;initialrega=8'b00001100;initialfork#10num=rega5;//num=01_1000_0000#10regb=rega5;//regb=1000_0000#20num=rega3;//num=00_0000_0001#20regb=rega3;//regb=0000_0001#30num=10'b11_1111_0000;#40rega=num2;//rega=1100_0000#40num1=num2;//num1=11_1100_0000#50rega=num2;//rega=1111_1100#50num1=num2;//num1=00_1111_1100#60$finish;joinendmodule逻辑右移逻辑左移•移位操作符对其左边的操作数进行向左或向右的位移位操作。•第二个操作数(移位位数)是无符号数•若第二个操作数是x或z则结果为x在赋值语句中,如果右边(RHS)的结果:位宽大于左边,则把最高位截去位宽小于左边,则零扩展将左边的操作数左移右边操作数指定的位数将左边的操作数右移右边操作数指定的位数左移先补后移右移先移后补建议:表达式左右位数一致关系操作符modulerelationals();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b0x10;endinitialfork#10val=regcrega;//val=x#20val=regbrega;//val=0#30val=regb=rega;//val=1#40val=regbregc;//val=1#50$finish;joinendmodule大于小于=大于等于=小于等于•其结果是1’b1、1’b0或1’bx。无论x为何值,regbregcrega和regc的关系取决于x相等操作符赋值操作符,将等式右边表达式的值拷贝到左边。注意逻辑等与case等的差别=逻辑等====01xz010xx101xxxxxxxzxxxxcase等=====01xz0100010100x0010z00012‘b1x==2’b0x值为0,因为不相等2‘b1x==2’b1x值为x,因为可能不相等,也可能相等2‘b1x===2’b0x值为0,因为不相同2‘b1x==2’b1x值为1,因为相同a=2'b1x;b=2'b1x;if(a==b)$display(aisequaltob);else$display(aisnotequaltob);a=2'b1x;b=2'b1x;if(a===b)$display(aisidenticaltob);else$display(aisnotidenticaltob);Case等只能用于行为描述,不能用于RTL描述。相等操作符逻辑等逻辑不等==!=moduleequalities1();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega==regb;//val=0#20val=rega!=regc;//val=1#30val=regb!=regc;//val=x#40val=regc==regc;//val=x#50$finish;joinendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边为确定值并且相等,则结果为1。•如果左边及右边为确定值并且不相等,则结果为0。•如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。•!=的结果与==相反值确定是指所有的位为0或1。不确定值是有值为x或z的位。相等操作符相同(case等)不相同(case不等)===!==moduleequalities2();reg[3:0]rega,regb,regc;regval;initialbeginrega=4'b0011;regb=4'b1010;regc=4'b1x10;endinitialfork#10val=rega===regb;//val=0#20val=rega!==regc;//val=1#30val=regb===regc;//val=0#40val=regc===regc;//val=1#50$finish;joinendmodule•其结果是1’b1、1’b0或1’bx。•如果左边及右边的值相同(包括x、z),则结果为1。•如果左边及右边的值不相同,则结果为0。•!==的结果与===相反综合工具不支持条件操作符条件?:modulelikebufif(in,en,out);inputin;inputen;outputout;assignout=(en==1)?in:'bz;endmodulemodulelike4to1(a,b,c,d,sel,out);inputa,b,c,d;input[1:0]sel;outputout;assignout=sel==2'b00?a:sel==2'b01?b:sel==2'b10?c:d;endmodule如果条件值为x或z,则结果可能为x或z条件操作符条件操作符的语法为:LHS=condition?true_expression:false_expressionregistger=condition?true_value:false_value;其意思是:ifconditionisT