diff --git a/tb/shinTest/ShinTopSpiTb.v b/tb/shinTest/ShinTopSpiTb.v index 0d96e6c..58eda95 100644 --- a/tb/shinTest/ShinTopSpiTb.v +++ b/tb/shinTest/ShinTopSpiTb.v @@ -23,6 +23,8 @@ module ShinTopSpiTb( wire isResp; + integer spidata_file; + ShinTop s_ShinTop_Mst( .clock(clock), .reset(reset), @@ -207,6 +209,7 @@ initial begin #10000000 $display("Time Out !!!"); + $fclose(spidata_file); $stop; end @@ -220,6 +223,8 @@ end initial begin + spidata_file = $fopen("spi_trans_data.txt", "w"); + if (!spidata_file) $display("文件打开失败"); $dumpfile("./tb/build/wave.vcd"); //生成的vcd文件名称 $dumpvars(0, ShinTopSpiTb);//tb模块名称 end @@ -295,7 +300,7 @@ end wire isQspi = (idx >= 0 && idx <= 4) || idx >= 10; -wire [11:0] nextByteCnt = byteCnt +1; +wire [11:0] nextByteCnt = byteCnt + 1; always @(posedge sck) begin if( isBusy ) begin @@ -329,7 +334,8 @@ end - +//mst slv0~slv3的 内部qspi调用即设置 +//sidx为0~4;外部spi为5~9,外部qspi为10~15 task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,input [7:0] sidx ); begin txBuf[0] <= saddress[7:0]; @@ -346,61 +352,100 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in isReq <= 0; @( negedge isBusy) #1000 - begin end + begin + $fwrite(spidata_file, "------------%-5t------------\n", $time); + $fwrite(spidata_file, "dev:%d, addr:0x%02h%02h, cmd:%d, len:%d\n", sidx, txBuf[1], txBuf[0], txBuf[2], slength); + for (integer i=0; i>>嗅探前,检查链路状态寄存器"); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(0)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(1)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(2)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(3)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(4)) ); + $fdisplay(spidata_file, "\t>>>嗅探"); //设置SM1在写入0x3地址触发enq txBuf[0+3] = 8'h03; txBuf[1+3] = 8'h00; - spi_trans( (16'h0202), (`SPI_WRITE), (2), (0) ); + spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //无子报文 txBuf[0+3] = 8'h00; txBuf[1+3] = 8'h01;//heeader length 0 嗅探包1 - txBuf[2+3] = 8'h00; - txBuf[3+3] = 8'h00; - spi_trans( (16'h1000), (`SPI_WRITE), (4), (0) ); //写入SM1 + txBuf[2+3] = 8'h3f; + txBuf[3+3] = 8'hff; + spi_trans( (16'h1000), (`SPI_WRITE), (4), (`IF_IDX(0)) ); //写入SM1 //发布请求 txBuf[0+3] = 8'h04; txBuf[1+3] = 8'h00; - spi_trans( (16'h21), (`SPI_WRITE), (2), (0) );//写入长度 + spi_trans( (16'h21), (`SPI_WRITE), (2), (`IF_IDX(0)) );//写入长度 txBuf[0+3] = 8'h01; - spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 + spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );//发送SM0 接收SM0, 请求发送 @(posedge isResp) #5 begin end end @@ -415,15 +460,31 @@ initial begin #50000 #50000 #50000 + $fdisplay(spidata_file, "\t>>>嗅探后,检查链路状态寄存器"); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(0)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(1)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(2)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(3)) ); + spi_trans( (16'h0140), (`SPI_READ), (5), (`IF_IDX(4)) ); + + + $fdisplay(spidata_file, "\n\n测试用例4-设置顺序索引"); $display("index @ %d", s_ShinTop_Mst.interface__io_cReg_timeStamp); begin + $fdisplay(spidata_file, "\t>>>设置顺序地址前,检查顺序地址"); + //spi_trans( (16'h0010), (`SPI_READ), (5), (`IF_IDX(0)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(1)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(2)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(3)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(4)) ); + $fdisplay(spidata_file, "\t>>>设置顺序地址"); //设置SM1在写入0xd地址触发enq txBuf[0+3] = 8'h0d; txBuf[1+3] = 8'h00; - spi_trans( (16'h0202), (`SPI_WRITE), (2), (0) ); + spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); txBuf[0+3] = 8'h00; txBuf[1+3] = 8'ha0;//heeader length 10 @@ -443,17 +504,17 @@ initial begin txBuf[12+3] = 8'h0; //负载 txBuf[13+3] = 8'h0; //负载 - spi_trans( (16'h1000), (`SPI_WRITE), (14), (0) ); //写入SM1 + spi_trans( (16'h1000), (`SPI_WRITE), (14), (`IF_IDX(0)) ); //写入SM1 //发布请求 txBuf[0+3] = 8'h0e; txBuf[1+3] = 8'h00; - spi_trans( (16'h21), (`SPI_WRITE), (2), (0) );//写入长度 + spi_trans( (16'h21), (`SPI_WRITE), (2), (`IF_IDX(0)) );//写入长度 txBuf[0+3] = 8'h01; - spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 + spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );//发送SM0 接收SM0, 请求发送 @(posedge isResp) #5 begin end end @@ -463,6 +524,14 @@ initial begin #50000 #50000 #50000 + $fdisplay(spidata_file, "\t>>>设置顺序地址后,检查顺序地址"); + //spi_trans( (16'h0010), (`SPI_READ), (5), (`IF_IDX(0)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(1)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(2)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(3)) ); + spi_trans( (16'h0000), (`SPI_READ), (32), (`IF_IDX(4)) ); + + $fdisplay(spidata_file, "\n\n测试用例5-交换数据"); $display("read&write @ %d", s_ShinTop_Mst.interface__io_cReg_timeStamp); begin @@ -472,7 +541,7 @@ initial begin //设置SM1在写入516地址触发enq txBuf[0+3] = 8'h03; txBuf[1+3] = 8'h02; - spi_trans( (16'h0202), (`SPI_WRITE), (2), (0) ); + spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); txBuf[0+3] = 8'h20; @@ -547,17 +616,17 @@ initial begin txBuf[196+3+i*64+8+j] = $random; end end - spi_trans( (16'h1000), (`SPI_WRITE), (516), (0) ); //写入SM1 + spi_trans( (16'h1000), (`SPI_WRITE), (516), (`IF_IDX(0)) ); //写入SM1 //发布请求 txBuf[0+3] = 8'h04; txBuf[1+3] = 8'h02; - spi_trans( (16'h21), (`SPI_WRITE), (2), (0) );//写入长度 + spi_trans( (16'h21), (`SPI_WRITE), (2), (`IF_IDX(0)) );//写入长度 txBuf[0+3] = 8'h01; - spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 + spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );//发送SM0 接收SM0, 请求发送 @(posedge isResp) #5 begin end end @@ -587,7 +656,7 @@ initial begin //设置SM1在写入0x3地址触发enq txBuf[0+3] = 8'h17; txBuf[1+3] = 8'h00; - spi_trans( (16'h0202), (`SPI_WRITE), (2), (0) ); + spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); txBuf[0+3] = 8'h01; txBuf[1+3] = 8'h40;//heeader length 20 @@ -619,26 +688,26 @@ initial begin txBuf[22+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[23:16]; //负载 txBuf[23+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[31:24]; //负载 - spi_trans( (16'h1000), (`SPI_WRITE), (24), (0) ); //写入SM1 + spi_trans( (16'h1000), (`SPI_WRITE), (24), (`IF_IDX(0)) ); //写入SM1 //写入替换时间戳替换地址 txBuf[0+3] = 8'h0c; txBuf[1+3] = 8'hc0; - spi_trans( (16'h25), (`SPI_WRITE), (2), (0) ); //写入替换时间戳替换地址寄存器 + spi_trans( (16'h25), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //写入替换时间戳替换地址寄存器 //发布请求 txBuf[0+3] = 8'h18; txBuf[1+3] = 8'h00; - spi_trans( (16'h21), (`SPI_WRITE), (2), (0) );//写入长度 + spi_trans( (16'h21), (`SPI_WRITE), (2), (`IF_IDX(0)) );//写入长度 txBuf[0+3] = 8'h01; - spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 + spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );//发送SM0 接收SM0, 请求发送 @(posedge isResp) #5 begin end //清除替换时间戳替换地址 txBuf[0+3] = 8'h00; txBuf[1+3] = 8'h00; - spi_trans( (16'h25), (`SPI_WRITE), (2), (0) ); //清除替换时间戳替换地址寄存器 + spi_trans( (16'h25), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //清除替换时间戳替换地址寄存器 @@ -647,7 +716,7 @@ initial begin //设置SM1在写入51地址触发enq txBuf[0+3] = 8'd51; txBuf[1+3] = 8'h00; - spi_trans( (16'h0202), (`SPI_WRITE), (2), (0) ); + spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //header txBuf[0+3] = 8'h03; @@ -732,15 +801,15 @@ initial begin txBuf[51+3] = 0; //负载0x147 - spi_trans( (16'h1000), (`SPI_WRITE), (52), (0) ); //写入SM1 + spi_trans( (16'h1000), (`SPI_WRITE), (52), (`IF_IDX(0)) ); //写入SM1 //发布请求 txBuf[0+3] = 8'd52; txBuf[1+3] = 8'h00; - spi_trans( (16'h21), (`SPI_WRITE), (2), (0) );//写入长度 + spi_trans( (16'h21), (`SPI_WRITE), (2), (`IF_IDX(0)) );//写入长度 txBuf[0+3] = 8'h01; - spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 + spi_trans( (16'h20), (`SPI_WRITE), (1), (`IF_IDX(0)) );//发送SM0 接收SM0, 请求发送 @(posedge isResp) #5 begin end end @@ -755,7 +824,7 @@ initial begin txBuf[5+3] = 0; //负载0x127 txBuf[6+3] = 0; //负载0x128 sync3脉冲宽度 txBuf[7+3] = 0; //负载0x129 - spi_trans( (16'h0122), (`SPI_WRITE), (8), (2) ); //slv2 + spi_trans( (16'h0122), (`SPI_WRITE), (8), (`IF_IDX(2)) ); //slv2