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

📄 tb_infifo_rev0.4.v

📁 Verilog jpec coder encoder source code
💻 V
字号:
////////////////////////////////////////////////////
//	
//	Module Name:	tb_infifo
//	Description:	Testbench for input fifo.
//	Author:			James Rosenthal
//	Date:			10/28/04
//
//
//	Version	Date		Modifications
//	---------------------------------
//	0.0		10/28/04	- Initial
//	0.1		11/20/04	- Fit New Design
//						- Redesigned tests
//						- Test for flags
//						- Test for Error Flags
//	0.2		11/29/04	- Remove extclk and wr_en
//						- Add nce, awe
//						- Test four clock cycle cases
//	0.3		11/30/04	- Add extclk to control DSP 
//						  signals.  sysclk is derived 
//						  from extclk						
//	0.4		12/04/04	- Remove write_255 and read_255
//						  These tasks are now part of 
//						  individual tests rw1,2,3, and 4
//						  which test the dsp write cycles
//						  occuring at different moments 
//						  with respect to the sysclk
//						- Remove extclk as it is not 
//						  used in any place.
//						- Have sysclk only and create
//						  DSP cycles based on it.
//								
////////////////////////////////////////////////////

`timescale 1ns / 10ps

module tb_infifo();

	//
	// Registers to simulate Inputs to input fifo
	//
	
	reg nce;		// Active low chip enable
	reg awe;		// Asynchronous Write Enable
	reg rd_en;		// Read Enable from FPGA
	reg rst;		// Async. Active Low Reset

	reg [12:0] din;
	
	reg sysclk;		// FPGA clock
	
	//
	// Wires to capture outputs of input FIFO
	//
	
	wire [12:0] dout;
	
	wire full;		// FIFO Full Flag
	wire empty;		// FIFO Empty Flag
	wire error;		// Error flag (for testing only)
	

	//
	// Variables
	// 
	
	integer i;			// index variable
	integer num_errors;	// # of Errors 
    integer	expected;	// expected value from read
	integer recieved;	// value recieved from read

	reg [12:0] exp;		// 13-bit expected value
	reg [12:0] in [255:0]; // input list

	//
	// Instantiate DUT
	// 
	
	input_fifo dut(
		.sysclk(sysclk),
		.awe(awe),
		.nce(nce),
		.rd_en(rd_en),		
		.din(din),
		.dout(dout),
		.full(full),
		.empty(empty),
		.rst(rst),
		.error(error)
	);

	// Create 25 MHz FPGA clock
	always #20 sysclk = ~sysclk;

	// Initialize Input List
	initial
	begin
		in[0] <= 13'h1fff;
		for(i=1; i<256; i=i+1)
			in[i] <= i;
	end
	
	// Testbench Start
	initial
	begin
		#0 sysclk <= 1'b0;
		#0 rst <= 1'b0;
		#0 din <= 13'h0;
		#0 rd_en <= 1'b0;
		#0 awe <= 1'b1;
		#0 nce <= 1'b1;
		
		#20 rst <= 1'b1;

		test_reset;
		test_rw1;
		test_rw2;
		test_error;
		$stop;

	end
	
	task test_rw1;
	// This task will test reads/writes the fifo while checking that the 
	// flags are set and unset correctly.  The DSP cycle starts at posedge 
	// of FPGA clock.
	begin
		
		$display("##### %t: Test Reads and Writes to FIFO 1 #####",$time);
		repeat(10)@(posedge sysclk);
		
		// FIFO Reset
		test_reset;

		// Write 255 Values, Check Full
		$display("%t: Write 255 Values",$time);
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(posedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		$display("%t: Finish 255 Writes, Check Full",$time);

		check_full;

		// Read 255 Values, Verify Reads, Check Empty
		$display("%t: Read/Verify 255 Values",$time);
		num_errors = 0;
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(posedge sysclk);
			rd_en <= 1'b1;
			@(posedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved) 
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
		
		check_empty;

		// Adjust Address Pointers (Write 20, Read 20)
		
		$display("%t: Adjust Address Pointers",$time);
		
		repeat(5)@(posedge sysclk);

		// Write 20 values
		$display("%t: Write 20 Values to FIFO",$time);
		for(i=70; i<90; i=i+1)
		begin
			@(posedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		
		$display("%t: Finished Writing 20 Values, Check no flags are set",$time);
		
		// Verify no flags are set
		check_noflag;

		// Read 20 Values
		$display("%t: Read/Verify 20 Values from FIFO",$time);
		num_errors = 0;
		for(i=70; i<90; i=i+1)
		begin
			@(posedge sysclk);
			rd_en <= 1'b1;
			@(posedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved)
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
	
		// Verify FIFO is empty
		check_empty;
		
		// Write 255 Values, Check Full
		$display("%t: Write 255 Values",$time);
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(posedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		$display("%t: Write 255 Values Complete, Check Full",$time);
		check_full;

		// Read 255 Values, Verify Reads
		$display("%t: Read/Verify 255 Values",$time);
		num_errors = 0;
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(posedge sysclk);
			rd_en <= 1'b1;
			@(posedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved) 
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
		check_empty;	
		
		// FIFO Reset
		test_reset;

		$display("##### %t: End Task test_rw1 #####",$time);
		
	end
	endtask //end task test_rw1

	task test_rw2;
	// This task will test reads/writes the fifo while checking that the 
	// flags are set and unset correctly.  The dsp read and write cycles
	// will start on a negative edge of the sysclk.
	begin
		
		$display("##### %t: Test Reads and Writes to FIFO 2 #####",$time);
		repeat(10)@(posedge sysclk);
		
		// FIFO Reset
		test_reset;

		// Write 255 Values, Check Full
		$display("%t: Write 255 Values",$time);
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(negedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(negedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		$display("%t: Finish 255 Writes, Check Full",$time);
		@(negedge sysclk);
		check_full;

		// Read 255 Values, Verify Reads, Check Empty
		$display("%t: Read/Verify 255 Values",$time);
		num_errors = 0;
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(negedge sysclk);
			rd_en <= 1'b1;
			@(negedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			@(posedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved) 
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
		
		check_empty;

		// Adjust Address Pointers (Write 20, Read 20)
		
		$display("%t: Adjust Address Pointers",$time);
		
		repeat(5)@(posedge sysclk);

		// Write 20 values
		$display("%t: Write 20 Values to FIFO",$time);
		for(i=70; i<90; i=i+1)
		begin
			@(negedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(negedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		
		$display("%t: Finished Writing 20 Values, Check no flags are set",$time);
		
		// Verify no flags are set
		check_noflag;

		// Read 20 Values
		$display("%t: Read/Verify 20 Values from FIFO",$time);
		num_errors = 0;
		for(i=70; i<90; i=i+1)
		begin
			@(negedge sysclk);
			rd_en <= 1'b1;
			@(negedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			@(posedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved)
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
	
		// Verify FIFO is empty
		check_empty;
		
		// Write 255 Values, Check Full
		$display("%t: Write 255 Values",$time);
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(negedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(negedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		@(negedge sysclk);
		$display("%t: Write 255 Values Complete, Check Full",$time);
		check_full;

		// Read 255 Values, Verify Reads
		$display("%t: Read/Verify 255 Values",$time);
		num_errors = 0;
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(negedge sysclk);
			rd_en <= 1'b1;
			@(negedge sysclk);
			rd_en <= 1'b0;
			exp <= in[i];
			@(negedge sysclk);
			@(posedge sysclk);
			expected = {{19{exp[12]}},exp};
			recieved = {{19{dout[12]}},dout};
			if(expected != recieved) 
			begin
				num_errors = num_errors + 1;
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			end
		end
		if(num_errors == 0) $display("%t: Read/Verified 255 Values Successfullly, Check Empty",$time);
		check_empty;	
		
		// FIFO Reset
		test_reset;

		$display("##### %t: End Task test_rw2 #####",$time);
		
	end
	endtask
	
	task test_reset;
	// This task will test the reset functionality
	begin
		$display("%t: Test Reset ",$time);
		
		@(posedge sysclk);
		rst <= 1'b0;
		repeat(5)@(posedge sysclk);
		rst <= 1'b1;
		repeat(5)@(posedge sysclk);
		if(!empty || full)
		begin
			$display("%t: ERROR: Reset Unsuccessful",$time);
			$stop;
		end
		else
			$display("%t: Reset was Successful",$time);
	end
	endtask

	task check_full;
	// This task will verify that the FIFO is full
	begin
		#5
		if(!full) $display("%t: ERROR: FIFO Not Full",$time);
		else if(empty) $display("%t: ERROR: FIFO Empty", $time);
		else if(!empty && full) $display("%t: FIFO is Full", $time);
	end
	endtask

	task check_empty;
	// This task will verify that the FIFO is empty
	begin
		#5	
		if(full) $display("%t: ERROR: FIFO is Full", $time);
		if(!empty) $display("%t: ERROR: FIFO is not Empty", $time);
		else if(empty && !full) $display("%t: FIFO is Empty",$time);
	end
	endtask
	
	task check_noflag;
	// This task will verify that no flags are set
	begin
		if(full) $display("%t: ERROR: FIFO is Full", $time);
		if(empty) $display("%t: ERROR: FIFO is Empty", $time);
		else if(!full && !empty) $display("%t: No Flags are Set",$time);
	end
	endtask

	task test_error;
	begin
		$display("##### %t: Error Tests #####",$time);
		// Reset FIFO
		repeat(10)@(posedge sysclk);
		test_reset;

		// Write 256 Values
		$display("%t: Write 255 Values",$time);
		repeat(5)@(posedge sysclk);
		for(i=0; i<255; i=i+1)
		begin
			@(posedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end
		$display("%t: Finish 255 Writes, Check Full",$time);

		check_full;	

		$display("%t: Write an additional Value",$time);
		@(posedge sysclk);
		nce <= 1'b0;
		#2 awe <= 1'b0;
		#1 din <= 13'hABC;
		@(negedge sysclk);
		if(!error)
			$display("%t: An additional write did not cause the error flag",$time);
		else $display("%t: The error flag has risen for write on full",$time);
		@(posedge sysclk);
		nce <= 1'b1;
		awe <= 1'b1;

		// Read one value to check if write was successful
		@(posedge sysclk);
		rd_en <= 1'b1;
		@(posedge sysclk);
		rd_en <= 1'b0;
		expected = {{19{exp[12]}},exp};
		recieved = {{19{dout[12]}},dout};
		if(expected != recieved) 
			$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);

		// Reset FIFO
		repeat(10)@(posedge sysclk);
		test_reset;

		$display("##### %t: Error Tests Complete #####",$time);
		
	end
	endtask

endmodule

⌨️ 快捷键说明

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