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

📄 tests.v

📁 usb1.1 ip核
💻 V
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////                                                             ////////  Test Case Collection                                       ////////                                                             ////////                                                             ////////  Author: Rudolf Usselmann                                   ////////          rudi@asics.ws                                      ////////                                                             ////////                                                             ////////  Downloaded from: http://www.opencores.org/cores/usb1_funct/////////                                                             /////////////////////////////////////////////////////////////////////////////                                                             //////// 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.                                 ////////                                                             ///////////////////////////////////////////////////////////////////////////  CVS Log////  $Id: tests.v,v 1.1 2002/09/25 06:10:10 rudi Exp $////  $Date: 2002/09/25 06:10:10 $//  $Revision: 1.1 $//  $Author: rudi $//  $Locker:  $//  $State: Exp $//// Change History://               $Log: tests.v,v $//               Revision 1.1  2002/09/25 06:10:10  rudi//               Added Test Bench//////////////task send_setup;//主机发送setup令牌,我怎么觉得没这么多花哨的输入啊??,你傻比了,是setup stage的数据阶段input	[7:0]	fa;//给定的设备地址input	[7:0]	req_type;//应该是00input	[7:0]	request;//应该是input	[15:0]	wValue;input	[15:0]	wIndex;input	[15:0]	wLength;integer		len;beginbuffer1[0] = req_type;buffer1[1] = request;buffer1[3] = wValue[15:8];buffer1[2] = wValue[7:0]; //装双字节信息时,一般都是低字节的信息在前buffer1[5] = wIndex[15:8];buffer1[4] = wIndex[7:0];buffer1[7] = wLength[15:8];buffer1[6] = wLength[7:0];buffer1_last = 0;//起始指针,初始化send_token(	fa,			// Function Address		0,			// Logical Endpoint Number		`USBF_T_PID_SETUP	// PID		);repeat(1)	@(posedge clk);//前面这个repeat(1)有必要吗?不写也一样的吧send_data(`USBF_T_PID_DATA0, 8, 1);//1是正常发送模式// Wait for ACK,在等的时候它没有用计时器计时,watch dog不算utmi_recv_pack(len);if(8'hd2 !== txmem[0])//ack的pid   begin	$display("ERROR: SETUP: ACK mismatch. Expected: %h, Got: %h (%t)",	8'hd2, txmem[0], $time);	error_cnt = error_cnt + 1;//累计错误   endif(len !== 1)//设备发过来的握手包只可能是一个字节   begin	$display("ERROR: SETUP: Length mismatch. Expected: %h, Got: %h (%t)",	8'h1, len, $time);	error_cnt = error_cnt + 1;   endrepeat(1)	@(posedge clk);setup_pid = 1;//这个是干什么的??表明发送了setup令牌包,还有一个疑问是它会延长多长时间!repeat(1)	@(posedge clk);endendtasktask data_in;//主机发出IN令牌,还是ctrl_in,这里描述的是一个完整的in事务,我认为,控制传输的可选datastage由若干笔事务构成input	[7:0]	fa;//给定设备地址,但是没有给端点地址!!!??!!,因为是控制传输,默认从0端点进行input	[7:0]	pl_size;//发送端一次数据包能发送的最大长度integer		rlen;reg	[3:0]	pid, expect_pid;begin	buffer1_last = 0;//初始化指针	repeat(5)	@(posedge clk);//等五个时钟上升沿过去	send_token(	fa,		// Function Address			0,		// Logical Endpoint Number			`USBF_T_PID_IN	// PID			);	recv_packet(pid,rlen);//接收数据包,长度rlen为有效数据载荷,即除去pid和crc16后的长度。如果接收有错会报错	if(setup_pid)	expect_pid = 4'hb; // DATA 1	else		expect_pid = 4'h3; // DATA 0	if(pid !== expect_pid)	   begin		$display("ERROR: Data IN PID mismatch. Expected: %h, Got: %h (%t)",			expect_pid, pid, $time);		error_cnt = error_cnt + 1;//累计错误	   end	setup_pid = ~setup_pid;//关键	if(rlen != pl_size)//如果是最后一个包怎么办?!最后一个包可以达不到最大数据长度的呀!!	   begin		$display("ERROR: Data IN Size mismatch. Expected: %d, Got: %d (%t)",			pl_size, rlen, $time);		error_cnt = error_cnt + 1;	   end	for(n=0;n<rlen;n=n+1)//把收到的数据展示一下		$display("RCV Data[%0d]: %h",n,buffer1[n]);	repeat(5)	@(posedge clk);//等五个时钟上升沿	send_token(	fa,		// Function Address			0,		// Logical Endpoint Number			`USBF_T_PID_ACK	// PID,收到数据主机要发送ack的			);	repeat(5)	@(posedge clk);//无条件等五个时钟上升沿endendtasktask data_out;//对控制端点的数据输出input	[7:0]	fa;//给定设备地址input	[7:0]	pl_size;//这个是什么呢?要传送的数据的长度?integer len;begin	send_token(	fa,		// Function Address			0,		// Logical Endpoint Number			`USBF_T_PID_OUT	// PID			);	repeat(1)	@(posedge clk);//等一个上升沿	if(setup_pid==0)	send_data(`USBF_T_PID_DATA0, pl_size, 1);	else			send_data(`USBF_T_PID_DATA1, pl_size, 1);	setup_pid = ~setup_pid;	// Wait for ACK,主机向外发送了数据,当然要期望设备给ack信号了	utmi_recv_pack(len);	if(8'hd2 !== txmem[0])	   begin		$display("ERROR: ACK mismatch. Expected: %h, Got: %h (%t)",		8'hd2, txmem[0], $time);		error_cnt = error_cnt + 1;//累计错误	   end	if(len !== 1)	   begin		$display("ERROR: SETUP: Length mismatch. Expected: %h, Got: %h (%t)",		8'h1, len, $time);		error_cnt = error_cnt + 1;	   end	repeat(5)	@(posedge clk);endendtaskparameter	GET_STATUS	=	8'h0,		CLEAR_FEATURE	=	8'h1,		SET_FEATURE	=	8'h3,		SET_ADDRESS	=	8'h5,		GET_DESCRIPTOR	=	8'h6,		SET_DESCRIPTOR	=	8'h7,		GET_CONFIG	=	8'h8,		SET_CONFIG	=	8'h9,		GET_INTERFACE	=	8'ha,		SET_INTERFACE	=	8'hb,		SYNCH_FRAME	=	8'hc;task setup1;begin$display("\n\n");$display("*****************************************************");$display("*** CTRL ep test 1                                ***");$display("*****************************************************\n");$display("\n\nSetting Address ...");send_setup(	8'h0, 		// Function Address,默认设备地址为0		8'h00,		// Request Type,0_00_00000:主机到设备_标准请求命令_接收者为设备		SET_ADDRESS,	// Request		16'h012,	// wValue,这里面包含了需要设定的地址		16'h0,		// wIndex		16'h0		// wLength		);// Status OK,无可选数据stage,这里用data_in任务来返回状态stage应该返回给主机的信息data_in(	8'h0,		// Function Address		8'h0		// Expected payload size,状态stage的数据阶段均为data1的0长度包	);$display("\n\nGetting descriptor ...");send_setup(	8'h12, 		// Function Address,即前面设定的地址		8'h80,		// Request Type,1_00_00000		GET_DESCRIPTOR,	// Request		16'h0100,	// wValue,高字节为描述符的类型编号,低字节为描述符的字符串索引,不太明白		16'h0,		// wIndex		16'h8		// wLength,返回8字节的数据,都是些什么??设备描述符可是有18个字节的		);data_in(	8'h12,		// Function Address,可选数据stage		8'd08		// Expected payload size,仿真结果应该是错的!!	);// Status OK,返回状态stagedata_out(	8'h12,		// Function Address		8'h0		// Expected payload size	);$display("\n\nGetting descriptor ...");send_setup(	8'h12, 		// Function Address		8'h80,		// Request Type		GET_DESCRIPTOR,	// Request		16'h0200,	// wValue,高字节为描述符的类型编号,这里是配置描述符		16'h0,		// wIndex		16'h8		// wLength,长度也为8,都是些什么呢?		);data_in(	8'h12,		// Function Address,可选数据stage		8'd08		// Expected payload size	);// Status OK,返回状态stagedata_out(	8'h12,		// Function Address		8'h0		// Expected payload size,记住这里存在隐患!!!!	);$display("\n\nGetting descriptor ...");send_setup(	8'h12, 		// Function Address		8'h80,		// Request Type		GET_DESCRIPTOR,	// Request		16'h0200,	// wValue,高字节为描述符的类型编号,这里是配置描述符		16'h0,		// wIndex		16'd053		// wLength,长度为53,这可是全长度啊,包含配置,接口和端点		);data_in(	8'h12,		// Function Address,可选数据stage		8'd053		// Expected payload size	);// Status OK,返回状态stagedata_out(	8'h12,		// Function Address		8'h0		// Expected payload size	);$display("\n\nGetting descriptor ...");send_setup(	8'h12, 		// Function Address		8'h80,		// Request Type		GET_DESCRIPTOR,	// Request		16'h0300,	// wValue,高字节为描述符的类型编号,这里是字符串描述符		16'h0,		// wIndex		16'd04		// wLength,返回4个字节		);data_in(	8'h12,		// Function Address,可选数据stage		8'd04		// Expected payload size	);// Status OK,返回状态stagedata_out(	8'h12,		// Function Address		8'h0		// Expected payload size	);

⌨️ 快捷键说明

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