Operator Verilog: Aritmatika & Kontrol Esensial untuk Sintesis
Data yang tidak dapat diproses cukup berguna, pasti akan ada bentuk perhitungan yang diperlukan dalam sirkuit digital dan sistem komputer. Mari kita lihat beberapa operator dalam Verilog yang akan memungkinkan alat sintesis merealisasikan elemen hardware yang sesuai.
Operator Aritmatika Verilog
Jika operand kedua dari operator pembagian atau modulus adalah nol, maka hasilnya akan X. Jika salah satu operand operator perpangkatan adalah real, maka hasilnya juga akan real. Hasilnya akan 1 jika operand kedua operator perpangkatan adalah 0 (a0).
| Operator | Deskripsi |
| a + b | a ditambah b |
| a - b | a dikurangi b |
| a * b | a dikalikan b |
| a / b | a dibagi b |
| a % b | a modulo b |
| a ** b | a dipangkatkan b |
Contoh penggunaan operator aritmatika diberikan di bawah ini.
module des; reg [7:0] data1; reg [7:0] data2; initial begin data1 = 45; data2 = 9; $display ("Add + = %d", data1 + data2); $display ("Sub - = %d", data1 - data2); $display ("Mul * = %d", data1 * data2); $display ("Div / = %d", data1 / data2); $display ("Mod %% = %d", data1 % data2); $display ("Pow ** = %d", data2 ** 2); end endmodule
Simulation Log
ncsim> run Add + = 54 Sub - = 36 Mul * = 149 Div / = 5 Mod % = 0 Pow ** = 81 ncsim: *W,RNQUIE: Simulasi selesai.
Operator Relasional Verilog
Sebuah ekspresi dengan operator relasional akan menghasilkan 1 jika ekspresi dievaluasi sebagai benar, dan 0 jika salah. Jika salah satu operand adalah X atau Z, maka hasilnya akan X. Operator relasional memiliki prioritas lebih rendah daripada operator aritmatika dan semua operator relasional memiliki prioritas yang sama.
| Operator | Deskripsi |
| a < b | a kurang dari b |
| a > b | a lebih besar dari b |
| a <= b | a kurang dari atau sama dengan b |
| a >= b | a lebih besar dari atau sama dengan b |
module des; reg [7:0] data1; reg [7:0] data2; initial begin data1 = 45; data2 = 9; $display ("Result for data1 >= data2 : %0d", data1 >= data2); data1 = 45; data2 = 45; $display ("Result for data1 <= data2 : %0d", data1 <= data2); data1 = 9; data2 = 8; $display ("Result for data1 > data2 : %0d", data1 > data2); data1 = 22; data2 = 22; $display ("Result for data1 < data2 : %0d", data1 < data2); end endmodule
Simulation Log
ncsim> run Result for data1 >= data2 : 1 Result for data1 <= data2 : 1 Result for data1 > data2 : 1 Result for data1 < data2 : 0 ncsim: *W,RNQUIE: Simulasi selesai.
Operator Kesetaraan Verilog
Operator kesetaraan memiliki prioritas yang sama di antara mereka dan lebih rendah dalam prioritas daripada operator relasional. Hasilnya adalah 1 jika benar, dan 0 jika salah. Jika salah satu operand dari logical-equality (==) atau logical-inequality (!=) adalah X atau Z, maka hasilnya akan X. Anda dapat menggunakan case-equality operator (===) atau case-inequality operator (!==) untuk mencocokkan termasuk X dan Z dan akan selalu memiliki nilai yang diketahui.
| Operator | Deskripsi |
| a === b | a sama dengan b, termasuk x dan z |
| a !== b | a tidak sama dengan b, termasuk x dan z |
| a == b | a sama dengan b, hasil bisa tidak diketahui |
| a != b | a tidak sama dengan b, hasil bisa tidak diketahui |
module des; reg [7:0] data1; reg [7:0] data2; initial begin data1 = 45; data2 = 9; $display ("Result for data1(%0d) === data2(%0d) : %0d", data1, data2, data1 === data2); data1 = 'b101x; data2 = 'b1011; $display ("Result for data1(%0b) === data2(%0b) : %0d", data1, data2, data1 === data2); data1 = 'b101x; data2 = 'b101x; $display ("Result for data1(%0b) === data2(%0b) : %0d", data1, data2, data1 === data2); data1 = 'b101z; data2 = 'b1z00; $display ("Result for data1(%0b) !== data2(%0b) : %0d", data1, data2, data1 !== data2); data1 = 39; data2 = 39; $display ("Result for data1(%0d) == data2(%0d) : %0d", data1, data2, data1 == data2); data1 = 14; data2 = 14; $display ("Result for data1(%0d) != data2(%0d) : %0d", data1, data2, data1 != data2); end endmodule
Simulation Log
ncsim> run Result for data1(45) === data2(9) : 0 Result for data1(101x) === data2(1011) : 0 Result for data1(101x) === data2(101x) : 1 Result for data1(101z) !== data2(1z00) : 1 Result for data1(39) == data2(39) : 1 Result for data1(14) != data2(14) : 0 ncsim: *W,RNQUIE: Simulasi selesai.
Operator Logis Verilog
Hasil dari logical and (&&) adalah 1 atau benar ketika kedua operandnya benar atau non-nol. Hasil dari logical or (||) adalah 1 atau benar ketika salah satu operandnya benar atau non-nol. Jika salah satu operand adalah X, maka hasilnya juga akan X. Operator logical negation (!) akan mengubah operand non-nol atau benar menjadi 0 dan operand nol atau salah menjadi 1, sementara X akan tetap sebagai X.
| Operator | Deskripsi |
| a && b | dievaluasi sebagai benar jika a dan b benar |
| a || b | dievaluasi sebagai benar jika a atau b benar |
| !a | Mengubah nilai non-nol menjadi nol, dan sebaliknya |
module des; reg [7:0] data1; reg [7:0] data2; initial begin data1 = 45; data2 = 9; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2); data1 = 0; data2 = 4; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2); data1 = 'dx; data2 = 3; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2); data1 = 'b101z; data2 = 5; $display ("Result of data1(%0d) && data2(%0d) : %0d", data1, data2, data1 && data2); data1 = 45; data2 = 9; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2); data1 = 0; data2 = 4; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2); data1 = 'dx; data2 = 3; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2); data1 = 'b101z; data2 = 5; $display ("Result of data1(%0d) || data2(%0d) : %0d", data1, data2, data1 || data2); data1 = 4; $display ("Result of !data1(%0d) : %0d", data1, !data1); data1 = 0; $display ("Result of !data1(%0d) : %0d", data1, !data1); end endmodule
Simulation Log
ncsim> run Result of data1(45) && data2(9) : 1 Result of data1(0) && data2(4) : 0 Result of data1(x) && data2(3) : x Result of data1(Z) && data2(5) : 1 Result of data1(45) || data2(9) : 1 Result of data1(0) || data2(4) : 1 Result of data1(x) || data2(3) : 1 Result of data1(Z) || data2(5) : 1 Result of !data1(4) : 0 Result of !data1(0) : 1 ncsim: *W,RNQUIE: Simulasi selesai.
Operator Bitwise Verilog
Operator ini akan menggabungkan bit dalam satu operand dengan bit yang sesuai dalam operand lainnya untuk menghasilkan satu bit tunggal.
| & | 0 | 1 | x | z |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | x | x |
| x | 0 | x | x | x |
| z | 0 | x | x | x |
| | | 0 | 1 | x | z |
| 0 | 0 | 1 | x | x |
| 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x |
| z | x | 1 | x | x |
module des; reg data1 [4] ; reg data2 [4] ; int i, j; initial begin data1[0] = 0; data2[0] = 0; data1[1] = 1; data2[1] = 1; data1[2] = 'x; data2[2] = 'x; data1[3] = 'z; data2[3] = 'z; for (i = 0; i < 4; i += 1) begin for (j = 0; j < 4; j += 1) begin $display ("data1(%0d) & data2(%0d) = %0d", data1[i], data2[j], data1[i] & data2[j]); end end end endmodule
Simulation Log
ncsim> run data1(0) & data2(0) = 0 data1(0) & data2(1) = 0 data1(0) & data2(x) = 0 data1(0) & data2(z) = 0 data1(1) & data2(0) = 0 data1(1) & data2(1) = 1 data1(1) & data2(x) = x data1(1) & data2(z) = x data1(x) & data2(0) = 0 data1(x) & data2(1) = x data1(x) & data2(x) = x data1(x) & data2(z) = x data1(z) & data2(0) = 0 data1(z) & data2(1) = x data1(z) & data2(x) = x data1(z) & data2(z) = x ncsim: *W,RNQUIE: Simulasi selesai.
Operator Shift Verilog
Ada dua macam operator shift:
- Logical shift operators     : <<  and >>
- Arithmetic shift operators : <<< and >>>
module des; reg [7:0] data; int i; initial begin data = 8'h1; $display ("Original data = 'd%0d or 'b%0b", data, data); for (i = 0; i < 8; i +=1 ) begin $display ("data << %0d = 'b%b", i, data << i); end data = 8'h80; $display ("Original data = 'd%0d or 'b%0b", data, data); for (i = 0; i < 8; i +=1 ) begin $display ("data >> %0d = 'b%b", i, data >> i); end data = 8'h1; $display (" data >> 1 = 'b%b", data >> 1); end endmodule
Simulation Log
ncsim> run Original data = 'd1 or 'b00000001 data << 0 = 'b00000001 data << 1 = 'b00000010 data << 2 = 'b00000100 data << 3 = 'b00001000 data << 4 = 'b00010000 data << 5 = 'b00100000 data << 6 = 'b01000000 data << 7 = 'b10000000 Original data = 'd128 or 'b10000000 data >> 0 = 'b10000000 data >> 1 = 'b01000000 data >> 2 = 'b00100000 data >> 3 = 'b00010000 data >> 4 = 'b00001000 data >> 5 = 'b00000100 data >> 6 = 'b00000010 data >> 7 = 'b00000001 data >> 1 = 'b00000000 ncsim: *W,RNQUIE: Simulasi selesai.