C++和Verilog的运算符比较

  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

猜你喜欢

转载自blog.csdn.net/zgcjaxj/article/details/105756925