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

📄 tests.v

📁 DMA的控制器的IP核,和ATA控制器配合,可以实现DMA方式高速传输数据.
💻 V
📖 第 1 页 / 共 4 页
字号:
/////////////////////////////////////////////////////////////////////////                                                             ////////  DMA Test Cases                                             ////////                                                             ////////                                                             ////////  Author: Rudolf Usselmann                                   ////////          rudi@asics.ws                                      ////////                                                             ////////                                                             ////////  Downloaded from: http://www.opencores.org/cores/wb_dma/    ////////                                                             /////////////////////////////////////////////////////////////////////////////                                                             //////// Copyright (C) 2000 Rudolf Usselmann                         ////////                    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.                                 ////////                                                             ///////////////////////////////////////////////////////////////////////////  CVS Log////  $Id: tests.v,v 1.3 2001/09/07 15:34:36 rudi Exp $////  $Date: 2001/09/07 15:34:36 $//  $Revision: 1.3 $//  $Author: rudi $//  $Locker:  $//  $State: Exp $//// Change History://               $Log: tests.v,v $//               Revision 1.3  2001/09/07 15:34:36  rudi////               Changed reset to active high.////               Revision 1.2  2001/08/15 05:40:29  rudi////               - Changed IO names to be more clear.//               - Uniquifyed define names to be core specific.//               - Added Section 3.10, describing DMA restart.////               Revision 1.1  2001/07/29 08:57:02  rudi//////               1) Changed Directory Structure//               2) Added restart signal (REST)////               Revision 1.1.1.1  2001/03/19 13:12:39  rudi//               Initial Release//////                        task sw_ext_desc1;input		quick;integer		quick, tot_sz_max, chunk_sz_max, del_max;reg	[7:0]	mode;reg	[15:0]	tot_sz;reg	[15:0]	chunk_sz;integer		ii, n,del;reg	[31:0]	int_src, d0, d1;begin$display("\n\n");$display("*****************************************************");$display("*** SW DMA No Buffer Ext. Descr LL ...            ***");$display("*****************************************************\n");rst = 1;repeat(10)	@(posedge clk);rst = 0;repeat(10)	@(posedge clk);if(quick)   begin	tot_sz_max = 32;	del_max = 2;	chunk_sz_max = 4;   endelse   begin	tot_sz_max = 128;	del_max = 6;	chunk_sz_max = 8;   endmode = 1;tot_sz = 64;chunk_sz=3;del = 0;for(del=0;del<del_max;del=del+1)for(mode=0;mode<4;mode=mode+1)for(tot_sz=1;tot_sz<tot_sz_max;tot_sz=tot_sz + 1)beginif(tot_sz>8)	tot_sz = tot_sz + 2;if(tot_sz>16)	tot_sz = tot_sz + 2;if(tot_sz>32)	tot_sz = tot_sz + 12;for(chunk_sz=0;chunk_sz<chunk_sz_max;chunk_sz=chunk_sz+1)begin	case(mode)	   0: $write("Mode: 0->0, ");	   1: $write("Mode: 0->1, ");	   2: $write("Mode: 1->0, ");	   3: $write("Mode: 1->1, ");	endcase	$display("Total Size: %0d, Chunk Size: %0d, Slave Delay: %0d",		tot_sz, chunk_sz, del);	ack_cnt_clr = 1;	@(posedge clk);	ack_cnt_clr = 0;	s0.delay = del;	s1.delay = del;	s0.fill_mem(1);	s1.fill_mem(1);	s0.mem[0] = (32'h000c_0000 | (mode[1:0]<<16)) + tot_sz;	s0.mem[1] = 32'h0000_0100;	s0.mem[2] = 32'h0000_0400;	s0.mem[3] = 32'h0000_0010;	s0.mem[4] = (32'h001c_0000 | (mode[1:0]<<16)) + tot_sz;	s0.mem[5] = 32'h0000_0100 + (tot_sz * 4);	s0.mem[6] = 32'h0000_0400 + (tot_sz * 4);	s0.mem[7] = 32'h0000_0000;	s0.mem[8] = (32'h000c_0000 | (mode[1:0]<<16)) + tot_sz;	s0.mem[9] = 32'h0000_0800;	s0.mem[10] = 32'h0000_0c00;	s0.mem[11] = 32'h0000_0030;	s0.mem[12] = (32'h001c_0000 | (mode[1:0]<<16)) + tot_sz;	s0.mem[13] = 32'h0000_0800 + (tot_sz * 4);	s0.mem[14] = 32'h0000_0c00 + (tot_sz * 4);	s0.mem[15] = 32'h0000_0000;	m0.wb_wr1(`REG_BASE + `INT_MASKA,4'hf,32'hffff_ffff);	m0.wb_wr1(`REG_BASE + `PTR0, 4'hf, 32'h0000_0020);	m0.wb_wr1(`REG_BASE + `CH0_TXSZ,4'hf, {chunk_sz, 12'h0});	m0.wb_wr1(`REG_BASE + `CH0_ADR0,4'hf,32'h0000_0080);	m0.wb_wr1(`REG_BASE + `CH0_ADR1,4'hf,32'h0000_4000);	m0.wb_wr1(`REG_BASE + `CH0_CSR,4'hf,	{15'h0002, 3'b000, 1'b0, 6'h1, 4'b0011, 2'b00, 1'b1});	m0.wb_wr1(`REG_BASE + `PTR1, 4'hf, 32'h0000_0000);	m0.wb_wr1(`REG_BASE + `CH1_TXSZ,4'hf, {chunk_sz, 12'h0});	m0.wb_wr1(`REG_BASE + `CH1_ADR0,4'hf,32'h0000_0080);	m0.wb_wr1(`REG_BASE + `CH1_ADR1,4'hf,32'h0000_4000);	m0.wb_wr1(`REG_BASE + `CH1_CSR,4'hf,	{15'h0002, 3'b000, 1'b0, 6'h1, 4'b0011, 2'b00, 1'b1});for(ii=0;ii<2;ii=ii+1)begin	repeat(5)	@(posedge clk);	while(!inta_o)	@(posedge clk);	m0.wb_rd1(`REG_BASE + `INT_SRCA, 4'hf, int_src);	if(int_src[0])	begin	for(n=0;n<tot_sz*2;n=n+1)	   begin		if(mode[1])	d0=s1.mem[(s0.mem[9]>>2) + n ];		else		d0=s0.mem[(s0.mem[9]>>2) + n ];		if(mode[0])	d1=s1.mem[(s0.mem[10]>>2) + n ];		else		d1=s0.mem[(s0.mem[10]>>2) + n ];			if( d1 !== d0 )		   begin			$display("ERROR: CH0: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",			n, d0, d1, $time);			error_cnt = error_cnt + 1;		   end	   end	m0.wb_rd1(`REG_BASE + `CH0_CSR, 4'hf, d1);	d0 = {24'h0064_089, 1'b1, mode[1:0], 1'b0};	if( d1 !== d0 )	   begin		$display("ERROR: CH0_CSR Mismatch: Expected: %x, Got: %x (%0t)",			d0, d1, $time);		error_cnt = error_cnt + 1;	   end	end	if(int_src[1])	begin	for(n=0;n<tot_sz*2;n=n+1)	   begin		if(mode[1])	d0=s1.mem[(s0.mem[1]>>2) + n ];		else		d0=s0.mem[(s0.mem[1]>>2) + n ];		if(mode[0])	d1=s1.mem[(s0.mem[2]>>2) + n ];		else		d1=s0.mem[(s0.mem[2]>>2) + n ];			if( d1 !== d0 )		   begin			$display("ERROR: CH1: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",			n, d0, d1, $time);			error_cnt = error_cnt + 1;		   end	   end	m0.wb_rd1(`REG_BASE + `CH1_CSR, 4'hf, d1);	d0 = {24'h0064_089, 1'b1, mode[1:0], 1'b0};	if( d1 !== d0 )	   begin		$display("ERROR: CH1_CSR Mismatch: Expected: %x, Got: %x (%0t)",			d0, d1, $time);		error_cnt = error_cnt + 1;	   end	endend	if(ack_cnt != ((tot_sz*4)+(4*2))*2 )	   begin		$display("ERROR: ACK count Mismatch: Expected: %0d, Got: %0d (%0t)",		((tot_sz*4)+(4*2)), ack_cnt, $time);		error_cnt = error_cnt + 1;	   end	repeat(5)	@(posedge clk);endendshow_errors;$display("*****************************************************");$display("*** Test DONE ...                                 ***");$display("*****************************************************\n\n");endendtasktask arb_test1;reg	[7:0]	mode;reg	[15:0]	tot_sz;reg	[15:0]	chunk_sz0;reg	[15:0]	chunk_sz1;reg	[15:0]	chunk_sz2;reg	[15:0]	chunk_sz3;integer		a,n,ptr;reg	[31:0]	d0,d1;reg	[7:0]	pri, order, finish;begin$display("\n\n");$display("*****************************************************");$display("*** SW DMA No Buffer 4 ch pri ...                 ***");$display("*****************************************************\n");mode = 0;tot_sz = 32;chunk_sz0=4;chunk_sz1=4;chunk_sz2=4;chunk_sz3=4;a=0;m0.wb_wr1(`REG_BASE + `CH0_CSR,4'hf, 32'h0);m0.wb_wr1(`REG_BASE + `CH1_CSR,4'hf, 32'h0);m0.wb_wr1(`REG_BASE + `CH2_CSR,4'hf, 32'h0);m0.wb_wr1(`REG_BASE + `CH3_CSR,4'hf, 32'h0);m0.wb_rd1(`REG_BASE + `INT_SRCA, 4'hf, d0);for(mode=0;mode<4;mode=mode+1)for(a=0;a<17;a=a+1)begin	chunk_sz0=4;	chunk_sz1=4;	chunk_sz2=4;	chunk_sz3=4;	s0.delay = 0;	s1.delay = 0;	case(a)		// ch3 ch2 ch1 ch0	   0:	     begin		pri = 8'b10_10_10_10;	// All equal 0,1,2,3		order = {2'd0, 2'd1, 2'd2, 2'd3};	     end		// One channel with High Priority		// The other depend oon the ARB state	   1:	     begin		pri = 8'b00_00_00_10;	// 3,1,0,2		order = {2'b0, 2'd3, 2'd1, 2'd2};	     end	   2:	     begin		pri = 8'b00_00_10_00;	// 2,3,0,1		order = {2'd1, 2'd0, 2'd2, 2'd3};	     end	   3:	     begin		pri = 8'b00_10_00_00;	// 1,0,2,3		order = {2'd2, 2'd0, 2'd1, 2'd3};	     end	   4:	     begin		pri = 8'b10_00_00_00;	// 0,3,1,2		order = {2'd3, 2'd0, 2'd1, 2'd2};	     end		// Specific order for all Channels	   5:	     begin		pri = 8'b10_00_01_11;	// 3,0,2,1		order = {2'd0, 2'd3, 2'd1, 2'd2};	     end	   6:	     begin		pri = 8'b00_10_11_01;	// 2,1,3,0		order = {2'd1, 2'd2, 2'd0, 2'd3};	     end	   7:	     begin		pri = 8'b00_11_01_10;	// 1,3,2,0		order = {2'd2, 2'd0, 2'd1, 2'd3};	     end	   8:	     begin		pri = 8'b00_01_10_11;	// 3,2,1,0		order = {2'd0, 2'd1, 2'd2, 2'd3};	     end		// One channel with High Priority		// The other depend oon the ARB state		// Chunk Size varies		// First channel small chunkc size	   9:	     begin		pri = 8'b00_00_00_10;	// 3,1,0,2		order = {2'd0, 2'd1, 2'd2, 2'd3};		chunk_sz3=1;	     end	   10:	     begin		pri = 8'b00_00_10_00;	// 2,0,1,3		order = {2'd1, 2'd0, 2'd3, 2'd2};		chunk_sz2=1;	     end	   11:	     begin		pri = 8'b00_10_00_00;	// 1,0,2,3		order = {2'd2, 2'd0, 2'd3, 2'd1};		chunk_sz1=1;	     end	   12:	     begin		pri = 8'b10_00_00_00;	// 0,2,3,1		order = {2'd3, 2'd1, 2'd2, 2'd0};		chunk_sz0=1;	     end		// First channel large chunkc size	   13:	     begin		pri = 8'b00_00_00_10;	// 3,0,2,1		order = {2'd0, 2'd3, 2'd1, 2'd2};		chunk_sz3=8;	     end	   14:	     begin		pri = 8'b00_00_10_00;	// 2,0,3,1		order = {2'd1, 2'd2, 2'd0, 2'd3};		chunk_sz2=8;	     end	   15:	     begin		pri = 8'b00_10_00_00;	// 1,0,3,2		order = {2'd2, 2'd1, 2'd0, 2'd3};		chunk_sz1=8;	     end	   16:	     begin		pri = 8'b10_00_00_00;	// 0,2,3,1		order = {2'd3, 2'd0, 2'd1, 2'd2};		chunk_sz0=8;	     end	endcasecase(mode)   0: $write("Mode: 0->0, ");   1: $write("Mode: 0->1, ");   2: $write("Mode: 1->0, ");   3: $write("Mode: 1->1, ");endcase$display("a: %0d", a);	ack_cnt_clr = 1;	@(posedge clk);	ack_cnt_clr = 0;	s0.fill_mem(1);	s1.fill_mem(1);	m0.wb_wr1(`REG_BASE + `CH0_CSR,4'hf,		{17'h00000, pri[1:0], 6'h0, 4'b0011, mode[1:0], 1'b0});	m0.wb_wr1(`REG_BASE + `CH1_CSR,4'hf,		{17'h00000, pri[3:2], 6'h0, 4'b0011, mode[1:0], 1'b0});	m0.wb_wr1(`REG_BASE + `CH2_CSR,4'hf,		{17'h00000, pri[5:4], 6'h0, 4'b0011, mode[1:0], 1'b0});	m0.wb_wr1(`REG_BASE + `CH3_CSR,4'hf,		{17'h00000, pri[7:6], 6'h0, 4'b0011, mode[1:0], 1'b0});	m0.wb_wr1(`REG_BASE + `INT_MASKA,4'hf,32'hffff_ffff);	m0.wb_wr1(`REG_BASE + `CH0_TXSZ,4'hf, {chunk_sz0, tot_sz});	m0.wb_wr1(`REG_BASE + `CH0_ADR0,4'hf,32'h0000_0000);	m0.wb_wr1(`REG_BASE + `CH0_ADR1,4'hf,32'h0000_4000);	m0.wb_wr1(`REG_BASE + `CH1_TXSZ,4'hf, {chunk_sz1, tot_sz});	m0.wb_wr1(`REG_BASE + `CH1_ADR0,4'hf,32'h0000_0080);	m0.wb_wr1(`REG_BASE + `CH1_ADR1,4'hf,32'h0000_4080);	m0.wb_wr1(`REG_BASE + `CH2_TXSZ,4'hf, {chunk_sz2, tot_sz});	m0.wb_wr1(`REG_BASE + `CH2_ADR0,4'hf,32'h0000_0100);	m0.wb_wr1(`REG_BASE + `CH2_ADR1,4'hf,32'h0000_4100);	m0.wb_wr1(`REG_BASE + `CH3_TXSZ,4'hf, {chunk_sz3, tot_sz});	m0.wb_wr1(`REG_BASE + `CH3_ADR0,4'hf,32'h0000_0180);	m0.wb_wr1(`REG_BASE + `CH3_ADR1,4'hf,32'h0000_4180);	m0.wb_wr1(`REG_BASE + `CH0_CSR,4'hf,		{12'h000, 3'b010, 1'b0, 1'b0, pri[1:0], 6'h0, 4'b0011, mode[1:0], 1'b1});	        //{15'h0002, 3'b000, 1'b0, 6'h1, 4'b0011, 2'b00, 1'b1});	m0.wb_wr1(`REG_BASE + `CH1_CSR,4'hf,		{12'h000, 3'b010, 1'b0, 1'b0, pri[3:2], 6'h0, 4'b0011, mode[1:0], 1'b1});	m0.wb_wr1(`REG_BASE + `CH2_CSR,4'hf,		{12'h000, 3'b010, 1'b0, 1'b0, pri[5:4], 6'h0, 4'b0011, mode[1:0], 1'b1});	m0.wb_wr1(`REG_BASE + `CH3_CSR,4'hf,		{12'h0000, 3'b010, 1'b0, 1'b0, pri[7:6], 6'h0, 4'b0011, mode[1:0], 1'b1});	repeat(1)	@(posedge clk);	// Wait for interrupt, Check completion order	ptr=0;	finish = 8'hxx;	while(ptr!=4)	   begin		while(!inta_o)	@(posedge clk);		m0.wb_rd1(`REG_BASE + `INT_SRCA, 4'hf, d0);		if(d0[0])	d0[1:0] = 0;		else		if(d0[1])	d0[1:0] = 1;		else		if(d0[2])	d0[1:0] = 2;		else		if(d0[3])	d0[1:0] = 3;		case(ptr)		   0: finish[7:6] = d0[1:0];		   1: finish[5:4] = d0[1:0];		   2: finish[3:2] = d0[1:0];		   3: finish[1:0] = d0[1:0];		endcase		case(d0[1:0])		   0: m0.wb_rd1(`REG_BASE + `CH0_CSR, 4'hf, d0);		   1: m0.wb_rd1(`REG_BASE + `CH1_CSR, 4'hf, d0);		   2: m0.wb_rd1(`REG_BASE + `CH2_CSR, 4'hf, d0);		   3: m0.wb_rd1(`REG_BASE + `CH3_CSR, 4'hf, d0);		endcase		ptr=ptr+1;		repeat(4)	@(posedge clk);	   end	if(finish !== order)	   begin		$display("ERROR: Completion Order[%0d] Mismatch: Expected: %b, Got: %b (%0t)",		a, order, finish, $time);		error_cnt = error_cnt + 1;	   end	for(n=0;n<tot_sz*4;n=n+1)	   begin		if(mode[1])	d0=s1.mem[ n ];		else		d0=s0.mem[ n ];		if(mode[0])	d1=s1.mem[32'h0000_1000 + n ];		else		d1=s0.mem[32'h0000_1000 + n ];			if( d1 !== d0 )		   begin			$display("ERROR: Data[%0d] Mismatch: Expected: %x, Got: %x (%0t)",			n, d0, d1, $time);			error_cnt = error_cnt + 1;		   end	   end	if(ack_cnt != ((tot_sz*4*2)) )	   begin		$display("ERROR: ACK count Mismatch: Expected: %0d, Got: %0d (%0t)",		((tot_sz*4)), ack_cnt, $time);		error_cnt = error_cnt + 1;	   end	repeat(5)	@(posedge clk);endshow_errors;$display("*****************************************************");$display("*** Test DONE ...                                 ***");$display("*****************************************************\n\n");endendtasktask hw_dma1;input	quick;integer		quick, chunk_sz_max, del_max;reg	[7:0]	mode;reg	[15:0]	chunk_sz, tot_sz;integer		n,m,k,rep,del;reg	[31:0]	d0,d1;begin$display("\n\n");$display("*****************************************************");$display("*** HW DMA No Buffer ...                          ***");$display("*****************************************************\n");if(quick)   begin	tot_sz = 32;	chunk_sz_max= 4;	del_max = 3;   endelse   begin	tot_sz = 64;	chunk_sz_max= 8;	del_max = 5;   endmode = 1;chunk_sz=4;del = 8;for(mode=0;mode<4;mode=mode+1)for(chunk_sz=0;chunk_sz<chunk_sz_max;chunk_sz=chunk_sz+1)for(del=0;del<del_max;del=del+1)begin	m0.wb_wr1(`REG_BASE + `INT_MASKA,4'hf,32'h0000_ffff);	m0.wb_wr1(`REG_BASE + `CH0_TXSZ,4'hf, {chunk_sz, tot_sz});	m0.wb_wr1(`REG_BASE + `CH0_ADR0,4'hf,32'h0000_0000);	m0.wb_wr1(`REG_BASE + `CH0_ADR1,4'hf,32'h0000_4000);	m0.wb_wr1(`REG_BASE + `CH0_CSR,4'hf,		{25'h0000000, 4'b1111, mode[1:0], 1'b1});$write("Delay: %0d ",del);case(mode)   0: $display("Mode: 0->0, chunk_size: %0d", chunk_sz);   1: $display("Mode: 0->1, chunk_size: %0d", chunk_sz);   2: $display("Mode: 1->0, chunk_size: %0d", chunk_sz);   3: $display("Mode: 1->1, chunk_size: %0d", chunk_sz);

⌨️ 快捷键说明

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