//----------------------------------------------------------------------------- // Title : テストベンチ // Project : 例題 //----------------------------------------------------------------------------- // File : tb.v // Author : hoge@foo // Created : 04.12.2005 // Last modified : 04.12.2005 //----------------------------------------------------------------------------- // Description : // Verilog-mode、Icarus Verilog、そしてGTKWave の説明の為に書いたコードで // 検証はされていません。 //----------------------------------------------------------------------------- // Copyright (c) 2005 by Ryusai This model is the confidential and // proprietary property of Ryusai and the possession or use of this // file requires a written license from Ryusai. //----------------------------------------------------------------------------- // Modification history : // 04.12.2005 : created //----------------------------------------------------------------------------- `timescale 10ps / 10ps // 波形表示の為のダンプファイルの選択 `define GTK // 波形表示はVCD(Value Change Dump) ファイル module test; // 入力信号 reg clk; reg reset; reg PStrobe; reg PRW; reg [15:0] PAddress; wire PReady; top TOP(/*AUTOINST*/ // Outputs .PReady (PReady), .oen (oen), .wen (wen), // Inputs .PAddress (PAddress[15:0]), .PRW (PRW), .PStrobe (PStrobe), .clk (clk), .reset (reset)); parameter CLKP = 5000; // クロック周期 50ns parameter CLKH = CLKP/2; // H レベル時間 parameter CLKL = CLKP-CLKH; // L レベル時間 // クロック always begin #CLKH clk = 0; #CLKL clk = 1; end // ダンプファイル出力 `ifdef GTK initial begin $dumpfile("test.vcd"); $dumpvars(0,test.TOP); end `endif initial begin : test sys_reset; cpu_write(16'h0000); cpu_read(16'h0000); cpu_write(16'hffff); $display("*** Simulation Complete! ***"); $finish; end task sys_reset; begin #1 reset = 0; clk = 0; PStrobe = 0; PRW = 1; PAddress = 16'hffff; repeat(3) @(posedge clk); reset = 1; @(posedge clk); end endtask // sys_reset task cpu_write; input [15:0] adr; integer i; begin #1 PStrobe = 1; PAddress = adr; PRW = 0; $display("*** Write Transaction Start ***"); @(posedge clk); #1 PStrobe = 0; i=1; while (PReady == 0) begin @(posedge clk); if (i==10) begin $display("Timeout Error"); $display("Simulation Stopped!"); $finish; end else i=i+1; end #1 PRW = 1; $display("*** Write Transaction End ***"); @(posedge clk); PAddress = 16'hffff; @(posedge clk); end endtask // cpu_write task cpu_read; input [15:0] adr; integer i; begin #1 PStrobe = 1; PAddress = adr; PRW = 1; $display("*** Read Transaction Start ***"); @(posedge clk); #1 PStrobe = 0; i=1; while (PReady == 0) begin @(posedge clk); if (i==10) begin $finish; $display("Timeout Error"); $display("Simulation Stopped!"); end else i=i+1; end $display("*** Read Transaction End ***"); @(posedge clk); #1 PAddress = 16'hffff; @(posedge clk); end endtask // cpu_read endmodule // test