テストベンチの作成
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 82/90。
チャレンジ
このレッスンでは、信号機コントローラ(traffic light controller)が正しく動作することを確認するためのテストベンチを作成します。
やるべきこと:
以下の手順でテストベンチを作成してください:
- シグナルを宣言します(
clkとresetにはreg、red、yellow、greenにはwire) traffic_lightモジュール(module)をuutという名前でインスタンス化します- 1 時間単位(time unit)ごとに反転するクロック(
clk)を生成します - 2 時間単位(time units)の間リセット(
reset)を適用し、その後解除します - 100 時間単位(time units)の間シミュレーション(
simulation)を実行します
自分で試してみよう
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
reg [5:0] counter;
// 出力の割り当て
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// タイミング付きステートマシン
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2;
counter <= 0;
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
counter <= 10;
end
1: begin
state <= 2;
counter <= 40;
end
2: begin
state <= 0;
counter <= 30;
end
endcase
end else begin
counter <= counter - 1;
end
end
end
endmodule
module testbench;
// TODO: clk と reset の reg を宣言する
// TODO: red, yellow, green の wire を宣言する
// TODO: traffic_light モジュールを uut という名前でインスタンス化する
// clk, reset, red, yellow, green を接続する
// TODO: クロックを生成する(1 time unit ごとにトグル)
initial begin
$display("Traffic Light Test");
// TODO: clk を 0 に初期化する
// TODO: リセットを適用する(reset=1 を 2 time units、その後 reset=0)
// TODO: 100 time units のシミュレーションを実行する
$display("Test complete");
$finish;
end
endmodule