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