在 Verilog 和 SystemVerilog 中,位宽运算(bitwise operations)是对二进制数字进行操作的常见操作。这些运算符直接对操作数的每一位进行计算,常用于硬件设计和数字电路仿真。以下是常见的位宽运算符及其说明:
1. 按位与(Bitwise AND) &
- 符号:
&
- 作用:对两个操作数的每一位进行“与”运算。只有当两个操作数的对应位都为
1
时,结果才为1
,否则为0
。
示例:
// 8位数的按位与 8'b11001010 & 8'b10111001 // 结果: 8'b10001000
2. 按位或(Bitwise OR) |
- 符号:
|
- 作用:对两个操作数的每一位进行“或”运算。只要其中一个操作数的对应位为
1
,结果就为1
,否则为0
。
示例:
// 8位数的按位或 8'b11001010 | 8'b10111001 // 结果: 8'b11111011
3. 按位异或(Bitwise XOR) ^
- 符号:
^
- 作用:对两个操作数的每一位进行“异或”运算。当且仅当两个操作数的对应位不同(一个为
1
,一个为0
)时,结果为1
,否则为0
。
示例:
// 8位数的按位异或 8'b11001010 ^ 8'b10111001 // 结果: 8'b01110011
4. 按位取反(Bitwise NOT) ~
- 符号:
~
- 作用:对操作数的每一位进行反转。所有的
0
变为1
,所有的1
变为0
。
示例:
// 8位数的按位取反 ~8'b11001010 // 结果: 8'b00110101
5. 按位与归约(AND Reduction) &
(带有归约操作)
- 符号:
&
(带有归约操作) - 作用:对一个多位数的所有位进行归约“与”运算,结果只有一个位。如果所有位都为
1
,则结果为1
,否则为0
。
示例:
// 8位数的按位与归约 &8'b11001010 // 结果: 0 (因为有0位)
6. 按位或归约(OR Reduction) |
(带有归约操作)
- 符号:
|
(带有归约操作) - 作用:对一个多位数的所有位进行归约“或”运算,结果只有一个位。如果任何位为
1
,则结果为1
,否则为0
。
示例:
// 8位数的按位或归约 |8'b11001010 // 结果: 1 (因为有1位)
7. 按位异或归约(XOR Reduction) ^
(带有归约操作)
- 符号:
^
(带有归约操作) - 作用:对一个多位数的所有位进行归约“异或”运算,结果为
1
,当位中1
的个数为奇数时;否则为0
。
示例:
// 8位数的按位异或归约 ^8'b11001010 // 结果: 1 (因为1的个数是奇数)
8. 按位左移(Bitwise Left Shift) <<
- 符号:
<<
- 作用:将操作数的所有位向左移动指定的位数。左移时,低位用
0
填充,符号位(如果有)不变。
示例:
// 8位数的左移 8'b11001010 << 2 // 结果: 8'b00101000
9. 按位右移(Bitwise Right Shift) >>
- 符号:
>>
- 作用:将操作数的所有位向右移动指定的位数。右移时,高位用符号位(对于有符号数)或
0
(对于无符号数)填充。
示例:
// 8位数的右移 8'b11001010 >> 2 // 结果: 8'b00110010
10. 算术右移(Arithmetic Right Shift) >>>
- 符号:
>>>
- 作用:与普通右移类似,但算术右移会根据符号位进行填充。对于有符号数,移位时高位会填充符号位,而不是
0
。
示例:
// 有符号数的算术右移 8'b11001010 >>> 2 // 结果: 8'b11110010