增加测试用例

This commit is contained in:
2025-05-16 18:07:22 +08:00
parent 7369d13f35
commit d96760f8f5

View File

@@ -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
@@ -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<slength; i++) begin
$fwrite(spidata_file, "%02h ", txBuf[i + 3]);
if ((i+1)%16 == 0) begin
$fwrite(spidata_file, "\n");
end
end
$fwrite(spidata_file, "\n");
end
end
endtask
`define INTERFACE_IDX 0 //internal spi
`define IF_IDX(idx) ((`INTERFACE_IDX)+(idx))
`define SPI_WRITE 8'h0
`define SPI_READ 8'h1
initial begin
#1000
$fdisplay(spidata_file, "测试用例1-从IP中读取寄存器上电后的寄存器期望值为0");
spi_trans( (16'h00), (`SPI_READ), (10), (`IF_IDX(0)) );
spi_trans( (16'h20), (`SPI_READ), (64), (`IF_IDX(0)) );
spi_trans( (16'h20), (`SPI_READ), (64), (`IF_IDX(1)) );
spi_trans( (16'h20), (`SPI_READ), (64), (`IF_IDX(2)) );
spi_trans( (16'h20), (`SPI_READ), (64), (`IF_IDX(3)) );
spi_trans( (16'h20), (`SPI_READ), (64), (`IF_IDX(3)) );
//设置主站从站
$fdisplay(spidata_file, "\n\n测试用例2-设置IP为主站或从站并读取设置结果期望0主1~4从");
txBuf[0+3] = 8'h01;
spi_trans( (16'h00), (`SPI_WRITE), (1), (0) );
spi_trans( (16'h00), (`SPI_WRITE), (1), (`IF_IDX(0)) );
#1000
txBuf[0+3] = 8'h02;
spi_trans( (16'h0), (`SPI_WRITE), (1), (1) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (2) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (3) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (4) );
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(1)) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(2)) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(3)) );
#1000
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(4)) );
spi_trans( (16'h00), (`SPI_READ), (1), (`IF_IDX(0)) );
spi_trans( (16'h00), (`SPI_READ), (1), (`IF_IDX(1)) );
spi_trans( (16'h00), (`SPI_READ), (1), (`IF_IDX(2)) );
spi_trans( (16'h00), (`SPI_READ), (1), (`IF_IDX(3)) );
spi_trans( (16'h00), (`SPI_READ), (1), (`IF_IDX(4)) );
//测试用例
//嗅探
#10000
$fdisplay(spidata_file, "\n\n测试用例3-发送嗅探包,需要在波形文件里检查");
begin
$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, "\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