Verilog演算子:合成に必須の算術・制御演算子
処理できないデータは無意味です。デジタル回路とコンピュータシステムには常に何らかの計算が必要です。合成ツールが適切なハードウェア要素を実現するためのVerilog演算子を見ていきましょう。
Verilog算術演算子
除算または剰余演算子の第2オペランドが0の場合、結果はXになります。累乗演算子のいずれかのオペランドが実数なら、結果も実数になります。累乗演算子の第2オペランドが0なら結果は1(a0)です。
| 演算子 | 説明 |
|---|---|
| a + b | aプラスb |
| a - b | aマイナスb |
| a * b | a乗算b |
| a / b | a除算b |
| a % b | aモジュロb |
| a ** b | aのb乗 |
module des;
reg [7:0] data1, 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
シミュレーションログ
ncsim> run Add + = 54 Sub - = 36 Mul * = 149 Div / = 5 Mod % = 0 Pow ** = 81 ncsim: *W,RNQUIE: Simulation is complete.
Verilog関係演算子
関係演算子を含む式は、真なら1、偽なら0になります。いずれかのオペランドがXまたはZなら結果はX。関係演算子の優先順位は算術演算子より低く、すべての関係演算子は同じ優先順位です。
| 演算子 | 説明 |
|---|---|
| a < b | aはbより小さい |
| a > b | aはbより大きい |
| a <= b | aはb以下 |
| a >= b | aはb以上 |
Verilog等価演算子
等価演算子は互いに同じ優先順位で、関係演算子より低い優先順位です。結果は真なら1、偽なら0。論理等価(==)または論理不等価(!=)のいずれかのオペランドがXまたはZなら結果はX。ケース等価演算子(===)またはケース不等価演算子(!==)を使うと、XとZを含めてマッチし、常に既知の値になります。
| 演算子 | 説明 |
|---|---|
| a === b | aとbが等しい(x,z含む) |
| a !== b | aとbが等しくない(x,z含む) |
| a == b | aとbが等しい(結果は未知の可能性) |
| a != b | aとbが等しくない(結果は未知の可能性) |
Verilog論理演算子
論理積(&&)は両オペランドが真または非ゼロなら1。論理和(||)はいずれかのオペランドが真または非ゼロなら1。いずれかのオペランドがXなら結果もX。論理否定(!)は非ゼロ/真を0に、ゼロ/偽を1に変換し、XはXのまま。
| 演算子 | 説明 |
|---|---|
| a && b | aかつbが真なら真 |
| a || b | aまたはbが真なら真 |
| !a | 非ゼロをゼロに、逆も同様 |
Verilogビット演算子
この演算子は、一方のオペランドのビットと、他方の対応するビットを組み合わせて1ビットの結果を計算します。
| & | 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 |
Verilogシフト演算子
シフト演算子には2種類あります:
- 論理シフト演算子:
<<と>> - 算術シフト演算子:
<<<と>>
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
シミュレーションログ
ncsim> run Original data = 'd1 or 'b00000001 data << 0 = 'b00000001 data << 1 = 'b00000010 ... data >> 7 = 'b00000001 data >> 1 = 'b00000000 ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- C#演算子完全ガイド:C#における演算子の包括的解説
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示