... | @@ -15,7 +15,7 @@ Verilogでの基本構成は以下のようになります: |
... | @@ -15,7 +15,7 @@ Verilogでの基本構成は以下のようになります: |
|
- `assign`:**組み合わせ回路の論理式を記述するための代入文**。`wire` 型の信号に対して使用され、いつでも右辺の論理式に応じて出力が変化します。
|
|
- `assign`:**組み合わせ回路の論理式を記述するための代入文**。`wire` 型の信号に対して使用され、いつでも右辺の論理式に応じて出力が変化します。
|
|
- `always`:**条件に基づく処理(順序回路や条件に基づいた組み合わせ回路)を記述するブロック**。
|
|
- `always`:**条件に基づく処理(順序回路や条件に基づいた組み合わせ回路)を記述するブロック**。
|
|
- `always @(posedge clk)` などクロックを指定して、**順序回路**の動作を記述することができます。
|
|
- `always @(posedge clk)` などクロックを指定して、**順序回路**の動作を記述することができます。
|
|
- `always @(*)` のようにセンシティビティリストに `*` を使って、**条件に基づいた組み合わせ回路**を記述することができます。assignでは記述が難しい、複雑な条件分岐を伴う組み合わせ回路の記述に適しています。
|
|
- `always @(*)` のようにセンシティビティリストに `*` を使って、**条件に基づいた組み合わせ回路**を記述することができます。
|
|
|
|
|
|
```verilog
|
|
```verilog
|
|
wire a, b, y;
|
|
wire a, b, y;
|
... | @@ -33,7 +33,6 @@ end |
... | @@ -33,7 +33,6 @@ end |
|
|
|
|
|
Verilog HDLでは`module`を使って回路ブロックを作成します。
|
|
Verilog HDLでは`module`を使って回路ブロックを作成します。
|
|
|
|
|
|
#### 例:ANDゲート
|
|
|
|
```verilog
|
|
```verilog
|
|
module and_gate (
|
|
module and_gate (
|
|
input wire inA, // 1bitの入力信号
|
|
input wire inA, // 1bitの入力信号
|
... | @@ -52,7 +51,6 @@ endmodule |
... | @@ -52,7 +51,6 @@ endmodule |
|
|
|
|
|
テストベンチは、記述した回路が正しく動作するかを検証するためのVerilog HDLコードです。
|
|
テストベンチは、記述した回路が正しく動作するかを検証するためのVerilog HDLコードです。
|
|
|
|
|
|
### 例:ANDゲート用テストベンチ
|
|
|
|
```verilog
|
|
```verilog
|
|
module testbench;
|
|
module testbench;
|
|
// パラメータ
|
|
// パラメータ
|
... | @@ -60,29 +58,30 @@ module testbench; |
... | @@ -60,29 +58,30 @@ module testbench; |
|
parameter HALF_CYCLE = 500;
|
|
parameter HALF_CYCLE = 500;
|
|
parameter DLY = 500;
|
|
parameter DLY = 500;
|
|
|
|
|
|
// シグナル
|
|
// 信号の定義
|
|
reg clk;
|
|
reg clk;
|
|
reg inA, inB;
|
|
reg inA, inB;
|
|
wire out_and_gate;
|
|
wire out_and_gate;
|
|
|
|
|
|
// テスト対象モジュール
|
|
// テスト対象モジュールのANDゲートをインスタンス化
|
|
and_gate and_gate_0 (
|
|
and_gate and_gate_0 (
|
|
.inA(inA),
|
|
.inA(inA),
|
|
.inB(inB),
|
|
.inB(inB),
|
|
.out(out_and_gate)
|
|
.out(out_and_gate)
|
|
);
|
|
);
|
|
|
|
|
|
// クロック生成
|
|
// クロック生成: HIGH/LOWを繰り返す
|
|
always begin
|
|
always begin
|
|
clk = 1'b1;
|
|
clk = 1'b1;
|
|
#(HALF_CYCLE) clk = 1'b0;
|
|
#(HALF_CYCLE) clk = 1'b0;
|
|
#(HALF_CYCLE);
|
|
#(HALF_CYCLE); // #によって時間遅延を表現できる、#のあとに指定した単位時間だけ待って次の処理に移る
|
|
end
|
|
end
|
|
|
|
|
|
// テストシナリオ
|
|
// テストシナリオ
|
|
initial begin
|
|
initial begin
|
|
inA = 1'b0; inB = 1'b0;
|
|
inA = 1'b0; inB = 1'b0; // 初期化
|
|
|
|
|
|
|
|
// 入力を変化させ、出力を表示
|
|
inA = 1'b0; inB = 1'b0;
|
|
inA = 1'b0; inB = 1'b0;
|
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
inA = 1'b1; inB = 1'b0;
|
|
inA = 1'b1; inB = 1'b0;
|
... | @@ -91,7 +90,7 @@ module testbench; |
... | @@ -91,7 +90,7 @@ module testbench; |
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
inA = 1'b1; inB = 1'b1;
|
|
inA = 1'b1; inB = 1'b1;
|
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
#100 $display("inA=%b inB=%b out=%b", inA, inB, out_and_gate);
|
|
|
|
// クロックの立ち上がり10回待って終了
|
|
repeat(10) @(posedge clk); // 10回繰り返し
|
|
repeat(10) @(posedge clk); // 10回繰り返し
|
|
$finish;
|
|
$finish;
|
|
end
|
|
end
|
... | | ... | |