📄 tests.v
字号:
///////////////////////////////////////////////////////////////////////// //////// 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 + -