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

📄 tb_infifo_rev0.2.v

📁 Verilog jpec coder encoder source code
💻 V
字号:
////////////////////////////////////////////////////
//	
//	Module Name:	tb_infifo
//	Description:	Testbench for input fifo.
//	Author:			James Rosenthal
//	Date:			10/28/04
//
//
//	Notes:
//	
//	4 Cycle Cases to Test:
//	----------------------
//	- Different Clock Cycle Cases to Test.
//	- Assume DSP Cycle starts on first posedge
//	DSP Cycle |--__--__--__--__--__--__--__--__
//	FPGA (1)  |----------------________________
//	FPGA (2)  |__----------------______________
//	FPGA (3)  |____----------------____________
//	FPGA (4)  |______----------------__________
//
//	
//	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
//						
//						
//		
////////////////////////////////////////////////////

`timescale 1ns / 10ps

module tb_infifo();

	reg sysclk;
	reg nce, awe, rd_en, rst;
	reg [12:0] din;
	
	wire [12:0] dout;
	wire full, empty, error;

	integer i, expected, recieved;
	reg [12:0] exp;
	reg [12:0] in [255:0];

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

	always #5 sysclk <= ~sysclk;

	initial
	begin
		in[0] <= 13'h1fff;
		for(i=1; i<256; i=i+1)
			in[i] <= i;
	end
	
	always @ (posedge sysclk)
	begin
		if(error)
		begin
			$display("%t: ERROR In FIFO State Machine", $time);
		end
	end
	
	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_full;
		test_error;
		
	end
	
	task test_reset;
	begin
		@(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
	end
	endtask

	task check_full;
	begin
		if(!full) $display("%t: ERROR: FIFO Not Full",$time);
		if(empty) $display("%t: ERROR: FIFO Empty", $time);
	end
	endtask

	task check_empty;
	begin
		if(full) $display("%t: ERROR: FIFO is Full", $time);
		if(!empty) $display("%t: ERROR: FIFO is not Empty", $time);
	end
	endtask
	
	task check_noflag;
	begin
		if(full) $display("%t: ERROR: FIFO is Full", $time);
		if(empty) $display("%t: ERROR: FIFO is Empty", $time);
	end
	endtask

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

		// Write 255 Values, Check Full
		write_255;

		// Read 255 Values, Verify Reads
		read_255;

		// Adjust Address Pointers (Write 20, Read 20)
		repeat(5)@(posedge sysclk);
		for(i=10; i<30; i=i+1)
		begin
			@(posedge sysclk);
			nce <= 1'b0;
			#2 awe <= 1'b0;
			#1 din <= in[i];
			repeat(3)@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
			repeat(2)@(posedge sysclk);
		end

		check_noflag;
		
		for(i=10; i<30; 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)
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			@(posedge sysclk);
		end

		check_empty;
		
		// Write 255 Values, Check Full
		write_255;

		// Read 255 Values, Verify Reads
		read_255;
		
		// FIFO Reset
		test_reset;
		
	end
	endtask

	task write_255;
	begin
		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];
			repeat(3)@(posedge sysclk);
			nce <= 1'b1;
			awe <= 1'b1;
		end

		check_full;
	end
	endtask

	task read_255;
	begin
		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) 
				$display("%t: ERROR: Expected: %x, Recieved: %x",$time,in[i],dout);
			@(posedge sysclk);
		end
		
		check_empty;	
	end
	endtask

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

		// Write 256 Values
		write_255;
		@(posedge sysclk);
		$display("ERROR SHOULD OCCUR HERE");
		nce <= 1'b0;
		#2 awe <= 1'b0;
		#1 din <= 13'h1ABC;
		repeat(3) @(posedge sysclk);
		nce <= 1'b1;
		awe <= 1'b1;
//		if(!error) 
//			$display("%t: ERROR: Write on Full did not raise error flag", $time);

		// Read one value to check if write was successful
		repeat(5)@(posedge sysclk);
		rd_en <= 1'b1;
		@(posedge sysclk);
		rd_en <= 1'b0;
		@(negedge sysclk);
		if(dout == 13'h1ABC)
			$display("%t: ERROR: Write on Full was Successful",$time);

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

		// Read On Empty - An error would require read_sm for this fifo. 
		@(posedge sysclk);
		rd_en <= 1'b1;
		@(posedge sysclk);
		rd_en <= 1'b0;
		@(negedge sysclk);
		if(!error)
			$display("%t: ERROR: Read On Empty did not raise error flag",$time);

	end
	endtask
	
endmodule

⌨️ 快捷键说明

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