C++ 的位运算 与 Verilog有相似之处,也有区别。
C++ 的& | 是双目操作,表示按bit对每一bit都进行& |操作; Verilog 不仅可以是双目操作(双目操作 同C++),还可以是单目操作,表示 对自己本身按位 与操作、按位或操作。比如 wire [5:0] test_v = 6’b101011, |test_v = 1’b1, &test_v = 1’b0。(C++的&| 不能是单目操作)
C++ 和verilog中的 ~ 都是单目运算符,按位取反,就是单纯的每bit都进行01翻转。
比如verilog,wire [5:0] test_v = 6’b101011, ~test_v = 6’b010100。 wire test_v_bit =0, ~test_v_bit = 1。
比如C++,unsigned int test_c = 0, ~test_c = 4294967295,也就是FFFFFFFF。
需要注意的是,如果C++中对bool变量求~,会出现问题。比如,bool test_c_bit = 0; ~test_c_bit = -1, test_c_bit = 1; ~test_c_bit = -2。这个结果跟我们想的怎么不太一样呢。
这是因为:C++中的bool类型虽然只用1bit就可以表示0和1的值,但在内存存储时占用1byte,高7bit初始为0,平时我们用不到罢了。在执行~test_c_bit时,会将8bit全部进行01翻转,当test_c_bit值为0时,0x00翻转变成了0xFF,正好是有符号数-1的十六进制表示。test_c_bit值为1时,0x01翻转变成了0xFE,为 有符号数-2的十六进制表示。
C++的移位操作 同 Verilog,不过要注意C++的变量类型,是否带有符号标准位。
运算符 |
C++ |
Verilog |
& |
双目位运算,按位 与运算,结果位数不变 例:0xF0 & 0x8F = 0x80 |
双目位运算,按位& 同C++ 单目操作,对自身按位&,例:wire [5:0] test_v = 6’b101011, &test_v = 1’b0 |
I |
双目位运算,按位 或运算,结果位数不变 例:0xF0 | 0x8F = 0xFF |
双目位运算,按位| 同C++ 单目操作,对自身按位|,例:wire [5:0] test_v = 6’b101011, |test_v = 1’b1 |
^ |
双目位运算,按位异或 异或运算:相同为0,不同为1 例:0xF0 ^ 0x8F = 0x7F |
双目位运算,按位异或,同C++ |
~ |
单目位运算,按位取反 不要对bool变量进行此操作,否则结果错误。 |
单目位运算,按位取反 |
<< |
左移,位运算符 |
同C++ |
>> |
右移,位运算符 |
同C++ |
&& |
双目,逻辑运算符,与,结果是bool值 |
同C++,结果是1bit的值 |
|| |
双目,逻辑运算符,或,结果是bool值 |
同C++,结果是1bit的值 |
! |
单目,逻辑运算符,取非 例bool a = false, !a = true |
同C++,但一般好像用的很少,更多时候,直接用 ~ |
{} |
C++无 拼接运算符 |
拼接运算符 例{wire_a, wire_b} 5{wire_1bit} |
= |
赋值运算符,C++没有阻塞赋值和非阻塞赋值的说法 |
非阻塞赋值 |
<= |
无 |
阻塞赋值 |
算术运算符 +,-,*,/,% |
C++ 同verilog |
|
关系运算符 > ,<,>=,<= |
C++ 同verilog |
|
条件运算符 ?: |
C++ 同verilog |
Verilog运算符优先级 参考 https://www.cnblogs.com/SYoong/p/5850060.html