文章目录
- 一、算术操作符(+?-?*?/?%?**)
- 二、相等操作符(== ?! = ? ===? ! ==? ==?? !=?)
- 三、逻辑操作符(&&?||?!)
- 四、按位操作符(~?&?|?^? ^~或 ~^)
- 五、缩减操作符(&?~&?|? ~|? ^? ~^)
- 六、移位操作符(<>>?<<>>>)
- 七、关系操作符(>?>=?<=)
- 八、条件操作符(?:)
- 九、拼接和复制操作符({expre1,expres2,...}?{repeat_number{expression}})
??1. 注意区别逻辑操作、按位操作、缩减操作;
- 逻辑操作通常使用
双符号表示 ,如逻辑与&&,逻辑等==,逻辑左移<<等,其结果可为0,1,x ; - 按位操作一般使用
单符号表示 ,如按位与&,按位或~,按位异或^等,结果一般为多比特数 ; - 缩减操作也使用
单符号表示 ,但是其操作结果区别于按位操作结果,只能为0,1,x
??2. 注意区别逻辑等操作、算术等操作;
- 逻辑等操作的比较结果可以为
0,1,x ;而算术等操作的比较只能为0,1 ;
??3. 注意理解逻辑移位的含义,区别于算术移位;
- 当移位操作一侧都为0时,逻辑左移n位相当于
乘以2^n , 逻辑右移n位相当于除以2 ^n ;
??4. 常用操作有条件操作、拼接和复制操作;
??5. 操作符的运算顺序遵循优先级从高到低执行;
一、算术操作符(+?-?*?/?%?**)
- + ( 一元加和二元加)????-(一元减和二元减)???? *(乘)????/(除)
- %(取模,即取余数)????* *(幂运算)
二、相等操作符(== ?! = ? ===? ! ==? ==?? !=?)
-
==(逻辑相等)????????????!=(逻辑不等)
-
===(算术全等,case equality)???? ! ==(算术非全等,case inequality)
-
==?(通配符逻辑相等)????????!=?(通配符逻辑不等)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 举例说明逻辑等与算术等的区别:例如: data = 'b11x0; addr = 'b11x0; data == addr; //该逻辑比较的结果未知,即为x //1. **通常在逻辑比较中,如果有一个操作数中包含有x或z,则结果必定为未知值(x)** data === addr; //该算术比较的结果为真,即为1 //2. **在算术比较中,把x和z直接当做数值(不考虑物理含义)严格按照字符值进行比较,所以结果只能是0和1** 带有通配符的逻辑等符号,会把**右侧操作数中的x和z直接屏蔽掉**;例如: data = 'b010z; addr = 'b0101; data ==? addr; //该逻辑比较的结果未知,左侧操作数含有z,不能做匹配值 addr ==? data; //该逻辑比较的结果为真,值为1 //3. **右侧操作数中含有z,被屏蔽,可以直接匹配左侧的1** |
三、逻辑操作符(&&?||?!)
- &&(逻辑与)????||(逻辑或)????!(逻辑非)
1 2 3 4 5 6 7 8 9 10 11 12 | **无论是单bit数还是多bit数,逻辑操作符运行的结果只能是0,1或者x**,例如: lock = 'b0110; port = 'b0100; lock && port; //结果为真,即值为1 lock || port; //结果为真,值为1 !lock; !port; //逻辑非的结果都为0 假设任意操作数内某一位为x或z,如果逻辑操作的结果是未定的,则运算的结果为x。 'b1 || 'bx //结果为1 'b0 && 'bz //结果为0 !x //结果为x |
四、按位操作符(~?&?|?^? ^~或 ~^)
- ~(一元非)????&(二元与)????|(二元非)
- ^(二元异或)???? ^ ~, ~ ^(二元同或)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 按位操作符区别于逻辑操作符,按位操作的结果不是单一的0或1,**结果位宽与操作数的位宽保持一致。**例如: a = 'b0110; b = 'b0100; a | b; //结果为'b0110 a & b; //结果为'b0100 如果两个操作数的位宽不等,且其中一个操作数为无符号数,则位宽较小的数用0在高位补齐。 如果两个操作数均为有符号数,则位宽较小的操作数用符号位在高位与位宽最大的数补齐,然后开始操作。例如: 'b0110 ^ 'b10000; 等价于: 'b00110 ^ 'b10000; //结果为'b10110 4'sb1010 & 8'sb01100010; 等价于: 4'sb11111010 & 8'sb01100010; //结果为8'sb01100010 |
五、缩减操作符(&?~&?|? ~|? ^? ~^)
- &(缩减与)????~ &(缩减与非)????|(缩减或)????~|(缩减或非)
- ^ (缩减异或)????~^(缩减同或)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 缩减操作符是对单一操作数上的所有位进行操作,产生1位的操作结果,其结果可以是0,1或者x,例如: a = 'b0110; b = 'b0100; |b; //结果为'b1 &b; //结果为'b0 ^a; //结果为'b0 ~^a; //结果为'b1 addr = 4'b01x0; ^addr; //结果为x 缩减异或操作可以用来确定变量中是否存在任何值为x的位;可以通过if语句进行检查: if(^addr === 'bx) $display("There is an unknown in addr variable"); 注意,此处的比较只能使用算术全等进行比较,因为逻辑等的比较结果只能是x,而算术全等比较的结果1,那才是期望的结果。 |
六、移位操作符(<>>?<<>>>)
- <<(逻辑左移)????????>>(逻辑右移)
- <<<(算术左移)????????>>>(算术右移)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 逻辑移位:由于移位而腾空的位总是填0; 算术移位:左移位腾出空位填0;右移腾出位,对于无符号数填0,对于有符号数填符号位; reg [7:0] q; reg signed [3:0] pm; q = 8'h17; pm = 4'sb1011; 则: //8'h17 = 8'b0001_0111; q >> 2; //结果为8'b0000_0101; q << 2; //结果为8'b0101_1100; q <<< 4; //结果为8'b0111_0000; q >>> 2; //结果为8'b0000_0101; pm >>> 2; //结果为4'sb1110, 用到了符号位1; 移位操作符可以被用来完成指数运算,但是有一定的约束条件。 |
七、关系操作符(>?>=?<=)
- <(小于)??????>(大于)
- <=(小于等于)????>=(大于等于)
1 | 关系操作符的结果为真(结果为1)或假(结果为0),如果操作书中有一位为x或z,则结果为x. |
八、条件操作符(?:)
- cond_expresson ? expression1 :expression2
1 2 3 4 | 条件操作符等价于if_else语句。如: always @(posedge clk) ctr = (data != 25)?(data+1):5; //即如果data != 25,则data = data+1;否则 data= 5; |
九、拼接和复制操作符({expre1,expres2,…}?{repeat_number{expression}})
- {expre1,expres2,…,expresN}(拼接操作符)????????{repeat_number{expres1,expres2,…,expresN}}(复制操作符)
1 2 3 4 | abus = {3{4'b1011}}; //结果为12'b1011_1011_1011 abus = {{4{1'b1}},4'b1011}; //结果为8'b1111_1011 name = {3{ack}}; //结果与{ack,ack,ack}相同 |