⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_bench_top.v

📁 usb1.1的设备控制器IP核
💻 V
字号:
////////////////////////////////////////////////////////////////////////                                                             ////////  Top Level Test Bench                                       ////////                                                             ////////                                                             ////////  Author: Rudolf Usselmann                                   ////////          rudi@asics.ws                                      ////////                                                             ////////                                                             ////////  D/L from: http://www.opencores.org/cores/generic_fifos/    ////////                                                             /////////////////////////////////////////////////////////////////////////////                                                             //////// Copyright (C) 2000-2002 Rudolf Usselmann                    ////////                         www.asics.ws                        ////////                         rudi@asics.ws                       ////////                                                             //////// This source file may be used and distributed without        //////// restriction provided that this copyright statement is not   //////// removed from the file and that any derivative work contains //////// the original copyright notice and the associated disclaimer.////////                                                             ////////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     //////// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   //////// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   //////// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      //////// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         //////// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    //////// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   //////// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        //////// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  //////// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  //////// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  //////// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         //////// POSSIBILITY OF SUCH DAMAGE.                                 ////////                                                             /////////////////////////////////////////////////////////////////////////`include "timescale.v"module test;/////////////////////////////////////////////////////////////////////// Local IOs and Vars//reg		clk;reg		rd_clk, wr_clk;reg		rst;/////////////////////////////////////////////////////////////////////// Test Definitions///////////////////////////////////////////////////////////////////////// Misc test Development vars//integer		n,x,rwd;reg		we, re;reg	[7:0]	din;reg		clr;wire	[7:0]	dout;wire		full, empty;wire		full_r, empty_r;wire		full_n, empty_n;wire		full_n_r, empty_n_r;wire	[1:0]	level;reg		we2, re2;reg	[7:0]	din2;reg		clr2;wire	[7:0]	dout2;wire		full2, empty2;wire		full_n2, empty_n2;wire	[1:0]	level2;reg	[7:0]	buffer[0:1024000];integer		wrp, rdp;/////////////////////////////////////////////////////////////////////// Initial Startup and Simulation Begin//real		rcp;initial   begin	$timeformat (-9, 1, " ns", 12);`ifdef WAVES  	$shm_open("waves");	$shm_probe("AS",test,"AS");	$display("INFO: Signal dump enabled ...\n\n");`endif	rcp=5;   	clk = 0;   	rd_clk = 0;   	wr_clk = 0;   	rst = 1;	we = 0;	re = 0;	clr = 0;	we2 = 0;	re2 = 0;	clr2 = 0;	rwd=0;	wrp=0;	rdp=0;   	repeat(10)	@(posedge clk);   	rst = 0;   	repeat(10)	@(posedge clk);   	rst = 1;   	repeat(10)	@(posedge clk);	if(1)	   begin		test_sc_fifo;		test_dc_fifo;	   end	else	   begin		rwd=4;		wr_dc(256);		rd_dc(256);		wr_dc(256);		rd_dc(256);	   end   	repeat(500)	@(posedge clk);$display("rdp=%0d, wrp=%0d delta=%0d", rdp, wrp, wrp-rdp);   	$finish;   endtask test_dc_fifo;begin$display("\n\n");$display("*****************************************************");$display("*** DC FIFO Sanity Test                           ***");$display("*****************************************************\n");for(rwd=0;rwd<5;rwd=rwd+1)	// read write delayfor(rcp=10;rcp<100;rcp=rcp+10.0)   begin	$display("rwd=%0d, rcp=%0f",rwd, rcp);	$display("pass 0 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_dc;		wr_dc(1);	   end	$display("pass 1 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_dc;		rd_dc(1);	   end	$display("pass 2 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_dc;		wr_dc(1);	   end	$display("pass 3 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_dc;		rd_dc(1);	   end   end$display("");$display("*****************************************************");$display("*** DC FIFO Sanity Test DONE                      ***");$display("*****************************************************\n");endendtasktask test_sc_fifo;begin$display("\n\n");$display("*****************************************************");$display("*** SC FIFO Sanity Test                           ***");$display("*****************************************************\n");for(rwd=0;rwd<5;rwd=rwd+1)	// read write delay   begin	$display("rwd=%0d",rwd);	$display("pass 0 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_sc;		wr_sc(1);	   end	$display("pass 1 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_sc;		rd_sc(1);	   end	$display("pass 2 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_sc;		wr_sc(1);	   end	$display("pass 3 ...");	for(x=0;x<256;x=x+1)	   begin		rd_wr_sc;		rd_sc(1);	   end   end$display("");$display("*****************************************************");$display("*** SC FIFO Sanity Test DONE                      ***");$display("*****************************************************\n");endendtask/////////////////////////////////////////////////////////////////////// Data tracker//always @(posedge clk)	if(we & !full)	   begin		buffer[wrp] = din;		wrp=wrp+1;	   endalways @(posedge clk)	if(re & !empty)	   begin		#3;		if(dout != buffer[rdp])			$display("ERROR: Data (%0d) mismatch, expected %h got %h (%t)",			 rdp, buffer[rdp], dout, $time);		rdp=rdp+1;	   endalways @(posedge wr_clk)	if(we2 & !full2)	   begin		buffer[wrp] = din2;		wrp=wrp+1;	   endalways @(posedge rd_clk)	if(re2 & !empty2)	   begin		#3;		if(dout2 != buffer[rdp] | ( ^dout2 )===1'bx)			$display("ERROR: Data (%0d) mismatch, expected %h got %h (%t)",			 rdp, buffer[rdp], dout2, $time);		rdp=rdp+1;	   end/////////////////////////////////////////////////////////////////////// Clock generation//always #5 clk = ~clk;always #(rcp) rd_clk = ~rd_clk;always #50 wr_clk = ~wr_clk;/////////////////////////////////////////////////////////////////////// Module Instantiations//generic_fifo_sc_b #(8,8,9) u0(		.clk(		clk		),		.rst(		rst		),		.clr(		clr		),		.din(		din		),		.we(		(we & !full)	),		.dout(		dout		),		.re(		(re & !empty)	),		.full(		full		),		.empty(		empty		),		.full_r(	full_r		),		.empty_r(	empty_r		),		.full_n(	full_n		),		.empty_n(	empty_n		),		.full_n_r(	full_n_r	),		.empty_n_r(	empty_n_r	),		.level(		level		)		);generic_fifo_dc #(8,8,9) u1(		.rd_clk(	rd_clk		),		.wr_clk(	wr_clk		),		.rst(		rst		),		.clr(		clr		),		.din(		din2		),		.we(		(we2 & !full2)	),		.dout(		dout2		),		.re(		(re2 & !empty2)	),		.full(		full2		),		.empty(		empty2		),		.full_n(	full_n2		),		.empty_n(	empty_n2	),		.level(		level2		)		);/////////////////////////////////////////////////////////////////////// Test and test lib //task wr_dc;input	cnt;integer	n, cnt;begin@(posedge wr_clk);for(n=0;n<cnt;n=n+1)   begin	#1;	we2 = 1;	din2 = $random;	@(posedge wr_clk);	#1;	we2 = 0;	din2 = 8'hxx;	repeat(rwd)	@(posedge wr_clk);   endendendtasktask rd_dc;input	cnt;integer	n, cnt;begin@(posedge rd_clk);for(n=0;n<cnt;n=n+1)   begin	#1;	re2 = 1;	@(posedge rd_clk);	#1;	re2 = 0;	repeat(rwd)	@(posedge rd_clk);   endendendtasktask rd_wr_dc;integer		n;begin   		repeat(10)	@(posedge wr_clk);		// RD/WR 1		for(n=0;n<20;n=n+1)		   fork			begin				wr_dc(1);			end			begin				@(posedge wr_clk);				@(posedge wr_clk);				rd_dc(1);			end		   join   		repeat(50)	@(posedge wr_clk);		// RD/WR 2		for(n=0;n<20;n=n+1)		   fork			begin				wr_dc(2);			end			begin				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				rd_dc(2);			end		   join   		repeat(50)	@(posedge wr_clk);		// RD/WR 3		for(n=0;n<20;n=n+1)		   fork			begin				wr_dc(3);			end			begin				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				rd_dc(3);			end		   join   		repeat(50)	@(posedge wr_clk);		// RD/WR 4		for(n=0;n<20;n=n+1)		   fork			begin				wr_dc(4);			end			begin				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				@(posedge wr_clk);				rd_dc(4);			end		   join   		repeat(50)	@(posedge wr_clk);endendtasktask wr_sc;input	cnt;integer	cnt;begin@(posedge clk);	for(n=0;n<cnt;n=n+1)	   begin		//@(posedge clk);		#1;		we = 1;		din = $random;		@(posedge clk);		#1;		we = 0;		din = 8'hxx;		repeat(rwd)	@(posedge clk);	   endendendtasktask rd_sc;input	cnt;integer	cnt;begin@(posedge clk);	for(n=0;n<cnt;n=n+1)	   begin		//@(posedge clk);		#1;		re = 1;		@(posedge clk);		#1;		re = 0;		repeat(rwd)	@(posedge clk);	   endendendtasktask rd_wr_sc;begin   		repeat(10)	@(posedge clk);		// RD/WR 1		for(n=0;n<10;n=n+1)		   begin			@(posedge clk);			#1;			re = 0;			we = 1;			din = $random;			@(posedge clk);			#1;			we = 0;			din = 8'hxx;			re = 1;		   end		@(posedge clk);		#1;		re = 0;   		repeat(10)	@(posedge clk);		// RD/WR 2		for(n=0;n<10;n=n+1)		   begin			@(posedge clk);			#1;			we = 1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			we = 0;			din = 8'hxx;			re = 1;			@(posedge clk);			@(posedge clk);			#1;			re = 0;		   end		// RD/WR 3		for(n=0;n<10;n=n+1)		   begin			@(posedge clk);			#1;			we = 1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			we = 0;			din = 8'hxx;			re = 1;			@(posedge clk);			@(posedge clk);			@(posedge clk);			#1;			re = 0;		   end		// RD/WR 4		for(n=0;n<10;n=n+1)		   begin			@(posedge clk);			#1;			we = 1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			din = $random;			@(posedge clk);			#1;			we = 0;			din = 8'hxx;			re = 1;			@(posedge clk);			@(posedge clk);			@(posedge clk);			@(posedge clk);			#1;			re = 0;		   endendendtaskendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -