# Operator Types ###### tags: `Digital IC Design` [回到主頁面](https://hackmd.io/@derek8955/BkK2Nb5Jo/https%3A%2F%2Fhackmd.io%2FdpcBlBL8TlShpQ-wSi9Quw) ![](https://i.imgur.com/AmN5KPE.png) 大部分的 operator 都跟其他 programing language 雷同,以下將不再說明: > 推薦一個線上寫 verilog code 的網站,可以自己動手試試看: [Online Verilog](https://www.tutorialspoint.com/compile_verilog_online.php) - 連結運算子 ```verilog= // {} module example1(); wire [1:0] a, b; wire [3:0] c; // assume a = 2'b01, b= 2'b11 assign c = {a,b}; // c = 4'b0111 endmodule ---------------------------------------------------------------------------------------- // {} module example2(); wire [1:0] a, b; wire [3:0] c; // assume a = 2'b01, b= 2'b11 assign c = {a+2'b1,b}; // correct // c = 4'b1011 // 在連結運算子中計算,切記一定要把資料的情形寫清楚 assign c = {a+1,b};// error endmodule ---------------------------------------------------------------------------------------- // {{}} module example3(); wire [1:0] a; wire [3:0] b; // assume a = 2'b01 assign b = {2{a}}; // 等同於 assign b = {a,a}; // c = 4'b0101 endmodule ``` - 精簡運算子 : 意旨對自己做運算 ```verilog= initial begin $displayb( !4'b0110 ); // 0 $displayb( ~4'b0110 ); // 4'b1001 $displayb( &4'b0110 ); // 0,對每個 bit 做 and $displayb( &4'b1111 ); // 1 $displayb( |4'b0010 ); // 1,對每個 bit 做 or $displayb( |4'b0000 ); // 0 $displayb( ^4'b0110 ); // 0,對每個 bit 做 xor $displayb( ^4'b1110 ); // 1 end ``` - 位移運算子 ```verilog module shift(); reg [3:0] a; initial begin a = 4'b1011; a = a << 1; $displayb(a); // a = 4'b0110 end endmodule ``` - 等於運算子 == 、 !=:不執行 X、Z 的比對 === 、 !==:執行 X、Z 的比對 ```verilog= initial begin $displayb( 4'b1110 == 4'b1110 ); // 1 $displayb( 4'b1100 == 4'b1110 ); // 0 $displayb( 4'b1000 != 4'b1110 ); // 1 $displayb( 4'b1110 != 4'b1110 ); // 0 $displayb( 4'b1x10 === 4'b1110 ); // 1 $displayb( 4'b1x11 === 4'b1110 ); // 0 $displayb( 4'b1x10 !== 4'b1110 ); // 0 $displayb( 4'b1x11 !== 4'b1110 ); // 1 end ``` - 位元邏輯運算子 : 對彼此作運算 ```verilog= initial begin $displayb( 4'b0010 | 4'b1010 ); // 4'b1010 $displayb( 4'b0zx1 & 4'b1011 ); // 4'b0001 end ``` - 條件運算子 ```verilog module coditional(); wire [3:0] a; reg [3:0] b; reg flag; initial begin flag = 1'b1; b = 4'd7; end assign a = ( flag )? b : 4'd0 ; // 若 flag 為 true 則執行 a = b; // 若 flag 為 false 則執行 a = 4'd0; endmodule ```