// (C) Tomonori Izumi , Oct. 2007 // リハビリ問題 順序回路(ステートマシン)編 信号機 // テストベンチの例 // Icarus Verilog の場合のシミュレーション実行例 // iverilog -o tb_trafficsignal.vvp tb_trafficsignal.v trafficsignal.v ; vvp tb_trafficsignal.vvp // NC-Verilog + SimVision の場合のシミュレーション実行例 // ncverilog tb_trafficsignal.v trafficsignal.v +gui +ncdebug -s // 順序回路シミュレーションのアドバイス // 入力信号の変化とクロックが同時に発生すると混乱しがちなので少しタイミングをずらすとよい。 `timescale 1ns / 1ns module top; reg xreset; reg clock; reg switch, timeout; wire [2:0] light; trafficsignal_module sig1(.xreset(xreset), .clock(clock), .walker(switch), .next(timeout), .light_blue(light[2]), .light_yellow(light[1]), .light_red(light[0])); always #5 clock = ~clock; always @(posedge clock) begin $display("time=%5d xreset=%b light=%3b switch=%b timeout=%b",$time, xreset, light, switch, timeout); end initial begin $dumpfile("tb_trafficsignal.vcd"); $dumpvars; clock <= 1'b1; #2; timeout <= 1'b0; switch <=1'b0; xreset <=1'b1; #30; xreset <=1'b0; #30; xreset <=1'b1; #10; timeout <= 1'b1; #10; timeout <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; switch <= 1'b1; #10; switch <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; switch <= 1'b1; #10; switch <= 1'b0; #30; switch <= 1'b1; #10; switch <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; switch <= 1'b1; #10; switch <= 1'b0; #30; timeout <= 1'b1; #10; timeout <= 1'b0; #30; #30; $finish; end endmodule