增加测试用例
This commit is contained in:
@@ -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<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 SPI_WRITE 8'h0
|
||||
`define SPI_READ 8'h1
|
||||
|
||||
`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) );
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(1)) );
|
||||
|
||||
#1000
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (2) );
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(2)) );
|
||||
|
||||
#1000
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (3) );
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (`IF_IDX(3)) );
|
||||
|
||||
#1000
|
||||
spi_trans( (16'h0), (`SPI_WRITE), (1), (4) );
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user