diff --git a/Makefile b/Makefile index 9b2ffdc..9d534a5 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,7 @@ shin: sbt "test:runMain test.testShinModule" testShin: + ./tb/shinTest/gen_pkt.py iverilog -Wall \ -o ./tb/build/shinTest.iverilog \ -y ./generated/shin \ diff --git a/tb/shinTest/ShinTopSpiTb.v b/tb/shinTest/ShinTopSpiTb.v index 025fc09..73191ff 100644 --- a/tb/shinTest/ShinTopSpiTb.v +++ b/tb/shinTest/ShinTopSpiTb.v @@ -438,8 +438,9 @@ initial begin #1000 $fdisplay(spidata_file, "测试用例1-从IP中读取寄存器,上电后的寄存器期望值为0"); - spi_trans( (16'h00), (`SPI_READ), (1024), (`IF_IQSPI(0)) ); - spi_trans( (16'h400), (`SPI_READ), (1024), (`IF_IQSPI(0)) ); + //spi_trans( (16'h00), (`SPI_READ), (1024), (`IF_IQSPI(0)) ); + //spi_trans( (16'h400), (`SPI_READ), (1024), (`IF_IQSPI(0)) ); + spi_trans( (16'h00), (`SPI_READ), (64), (`IF_IQSPI(0)) ); spi_trans( (16'h00), (`SPI_READ), (64), (`IF_IQSPI(1)) ); spi_trans( (16'h00), (`SPI_READ), (64), (`IF_IQSPI(2)) ); spi_trans( (16'h00), (`SPI_READ), (64), (`IF_IQSPI(3)) ); @@ -512,10 +513,7 @@ initial begin spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); //无子报文 - txBuf[0+3] = 8'h00; - txBuf[1+3] = 8'h01;//header length 0 嗅探包1 - txBuf[2+3] = 8'h3f; - txBuf[3+3] = 8'hff; + `include "detect_pkt.vh" spi_trans( (16'h1000), (`SPI_WRITE), (4), (`IF_IDX(0)) ); //写入SM1 //发布请求 @@ -625,79 +623,7 @@ initial begin txBuf[1+3] = 8'h02; spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); - - txBuf[0+3] = 8'h20; - txBuf[1+3] = 8'h00;//heeader length 512 - txBuf[2+3] = 8'h00; - txBuf[3+3] = 8'h00; - - //子报文 - txBuf[4+3] = 8'h0; - txBuf[5+3] = 8'h8; //index = 2 - txBuf[6+3] = 8'h08; //地址 //SM0 - txBuf[7+3] = 8'h30; //地址 //偏置 - txBuf[8+3] = 8'h20; //命令2 长度56 - txBuf[9+3] = 8'd56; //长度 - txBuf[10+3] = $random; - txBuf[11+3] = $random; - - for( integer j = 0; j < 64-8; j = j + 1 ) begin - @(posedge clock) #3 - txBuf[12+3+j] = $random; - end - - //------------------------- - - //子报文 - txBuf[68+3] = 8'h0; - txBuf[69+3] = 8'h4; //index = 1 - txBuf[70+3] = 8'h08; //地址 //SM0 - txBuf[71+3] = 8'h40; //地址 //偏置 - txBuf[72+3] = 8'h10; //命令1 长度56 - txBuf[73+3] = 8'd56; //长度 - txBuf[74+3] = $random; - txBuf[75+3] = $random; - - for( integer j = 0; j < 64-8; j = j + 1 ) begin - @(posedge clock) #3 - txBuf[76+3+j] = $random; - end - - //------------------------- - - //子报文 - txBuf[132+3] = 8'h0; - txBuf[133+3] = 8'hc; //index = 3 - txBuf[134+3] = 8'h10; //地址 //SM1 - txBuf[135+3] = 8'h40; //地址 //偏置 - txBuf[136+3] = 8'h00; //命令0 长度56 - txBuf[137+3] = 8'd56; //长度 - txBuf[138+3] = $random; - txBuf[139+3] = $random; - - for( integer j = 0; j < 64-8; j = j + 1 ) begin - @(posedge clock) #3 - txBuf[140+3+j] = $random; - end - - //------------------------- - - for( integer i = 0 ; i < 5; i = i + 1) begin - //子报文 - txBuf[196+3+i*64+0] = $random; - txBuf[196+3+i*64+1] = 8'h0; //index = random - txBuf[196+3+i*64+2] = $random; - txBuf[196+3+i*64+3] = $random; - txBuf[196+3+i*64+4] = 8'h00; //命令0 长度56 - txBuf[196+3+i*64+5] = 8'd56; //长度 - txBuf[196+3+i*64+6] = $random; - txBuf[196+3+i*64+7] = $random; - - for( integer j = 0; j < 64-8; j = j + 1 ) begin - @(posedge clock) #3 - txBuf[196+3+i*64+8+j] = $random; - end - end + `include "seq_pkt.vh" spi_trans( (16'h1000), (`SPI_WRITE), (516), (`IF_IDX(0)) ); //写入SM1 @@ -740,36 +666,7 @@ initial begin txBuf[1+3] = 8'h00; spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); - txBuf[0+3] = 8'h01; - txBuf[1+3] = 8'h40;//heeader length 20 - txBuf[2+3] = 8'h00; - txBuf[3+3] = 8'h00; - - //子报文 - //设置同步 - txBuf[4+3] = 8'h0; //设备索引 - txBuf[5+3] = 8'h0; //设备索引、类型 - txBuf[6+3] = $random; //地址 - txBuf[7+3] = $random; //地址 - txBuf[8+3] = 8'he0; //命令d 负载长度2 - txBuf[9+3] = 8'h0c; //负载长度c - txBuf[10+3] = 8'h0; //工作计数0 - txBuf[11+3] = 8'h0; //工作计数0 - - txBuf[12+3] = 0;//timeStamp[7:0]; //负载 - txBuf[13+3] = 0;//timeStamp[15:8]; //负载 - txBuf[14+3] = 0;//timeStamp[23:16]; //负载 - txBuf[15+3] = 0;//timeStamp[31:24]; //负载 - txBuf[16+3] = 0;//timeStamp[39:32]; //负载 - txBuf[17+3] = 0;//timeStamp[47:40]; //负载 - txBuf[18+3] = 0;//timeStamp[55:48]; //负载 - txBuf[19+3] = 0;//timeStamp[63:56]; //负载 - - txBuf[20+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[ 7: 0]; //负载 - txBuf[21+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[15: 8]; //负载 - txBuf[22+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[23:16]; //负载 - txBuf[23+3] = 0;//s_ShinTop_Mst.masterParser.deltaTimeStamp[31:24]; //负载 - + `include "sync_pkt.vh" spi_trans( (16'h1000), (`SPI_WRITE), (24), (`IF_IDX(0)) ); //写入SM1 //写入替换时间戳替换地址 @@ -800,89 +697,7 @@ initial begin txBuf[1+3] = 8'h00; spi_trans( (16'h0202), (`SPI_WRITE), (2), (`IF_IDX(0)) ); - //header - txBuf[0+3] = 8'h03; - txBuf[1+3] = 8'h00;//heeader length 48 - txBuf[2+3] = 8'h00; - txBuf[3+3] = 8'h00; - - //子报文 - //设置同步相关寄存器 - txBuf[4+3] = 8'h0; //设备索引 - txBuf[5+3] = 8'h08; //设备索引、类型 //2号设备 - txBuf[6+3] = 8'h01; //地址 - txBuf[7+3] = 8'h20; //地址 0x120 - txBuf[8+3] = 8'h10; //命令1 写入寄存器 负载长度2 - txBuf[9+3] = 8'h28; //负载长度0x28 - txBuf[10+3] = 8'h0; //工作计数0 - txBuf[11+3] = 8'h0; //工作计数0 - - // txBuf[12+3] = 8'h0f; //负载0x120 0x0f 全部脉冲,全部使能 - // txBuf[13+3] = 0; //负载0x121 - // txBuf[14+3] = 10; //负载0x122 sync0脉冲宽度 10 - // txBuf[15+3] = 0; //负载0x123 - // txBuf[16+3] = 0; //负载0x124 sync1脉冲宽度 0 - // txBuf[17+3] = 0; //负载0x125 - // txBuf[18+3] = 1; //负载0x126 sync2脉冲宽度 1 - // txBuf[19+3] = 0; //负载0x127 - // txBuf[20+3] = 8'hff; //负载0x128 sync3脉冲宽度 最大 - // txBuf[21+3] = 8'hff; //负载0x129 - - - txBuf[12+3] = 8'hff; //负载0x120 0xff 全部电平,全部使能 - txBuf[13+3] = 0; //负载0x121 - - txBuf[14+3] = 0; //负载0x122 sync0脉冲宽度 - txBuf[15+3] = 0; //负载0x123 - txBuf[16+3] = 0; //负载0x124 sync1脉冲宽度 - txBuf[17+3] = 0; //负载0x125 - txBuf[18+3] = 0; //负载0x126 sync2脉冲宽度 - txBuf[19+3] = 0; //负载0x127 - txBuf[20+3] = 0; //负载0x128 sync3脉冲宽度 - txBuf[21+3] = 0; //负载0x129 - - txBuf[22+3] = 0; //负载0x12a empty - txBuf[23+3] = 0; //负载0x12b - txBuf[24+3] = 0; //负载0x12c - txBuf[25+3] = 0; //负载0x12d - txBuf[26+3] = 0; //负载0x12e - txBuf[27+3] = 0; //负载0x12f - - //同步点 - txBuf[28+3] = 8'h90; //负载0x130 同步点 - txBuf[29+3] = 8'h88; //负载0x131 - txBuf[30+3] = 0; //负载0x132 - txBuf[31+3] = 0; //负载0x133 - txBuf[32+3] = 0; //负载0x134 - txBuf[33+3] = 0; //负载0x135 - txBuf[34+3] = 0; //负载0x136 - txBuf[35+3] = 0; //负载0x137 - - //周期 - txBuf[36+3] = 8'hff; //负载0x138 - txBuf[37+3] = 8'hf; //负载0x139 - txBuf[38+3] = 0; //负载0x13a - txBuf[39+3] = 0; //负载0x13b - - //0ffset sync1 - txBuf[40+3] = 8'ha; //负载0x13c - txBuf[41+3] = 0; //负载0x13d - txBuf[42+3] = 0; //负载0x13e - txBuf[43+3] = 0; //负载0x13f - - //0ffset sync2 - txBuf[44+3] = 8'h0; //负载0x140 - txBuf[45+3] = 0; //负载0x141 - txBuf[46+3] = 0; //负载0x142 - txBuf[47+3] = 0; //负载0x143 - - //0ffset sync3 - txBuf[48+3] = 8'h0; //负载0x144 - txBuf[49+3] = 8'h01; //负载0x145 - txBuf[50+3] = 0; //负载0x146 - txBuf[51+3] = 0; //负载0x147 - - + `include "sync_sig_pkt.vh" spi_trans( (16'h1000), (`SPI_WRITE), (52), (`IF_IDX(0)) ); //写入SM1 //发布请求 diff --git a/tb/shinTest/gen_pkt.py b/tb/shinTest/gen_pkt.py index 0a19595..b9b39e8 100755 --- a/tb/shinTest/gen_pkt.py +++ b/tb/shinTest/gen_pkt.py @@ -1,49 +1,157 @@ #!/usr/bin/env python #encoding=utf-8 +import random -from ctypes import * +class GenPkt(object): + def __init__(self): + super(GenPkt, self).__init__() + + self.pkt_buf = bytearray(b'\0' * 2048) + self.pkt_type = 0 + self.pkt_sub_pkt = 0 + self.sub_pkt = list() -class TPkt(BigEndianStructure): - pass -TPkt._pack_ = 1 -TPkt._fields_=[ - ('len', c_uint, 12), - ('rsv1', c_uint, 2), - ('type', c_uint, 2), - ('rsv2', c_uint16), - ('data', c_uint8 * 2040), - ] + def clean(self): + self.pkt_buf = bytearray(b'\0' * 2048) + self.pkt_type = 0 + self.pkt_sub_pkt = 0 + self.sub_pkt = list() -class TSubPkt(BigEndianStructure): - pass + def setPktType(self, type): + if (type != 0) and (type != 1): + print('Error...set type failed:', type) + else: + self.pkt_type = type -TSubPkt._pack_ = 1 -TSubPkt._fields_=[ - ('dev', c_uint, 14), - ('mode', c_uint, 2), - ('addr', c_uint16), - ('cmd', c_uint, 4), - ('slen', c_uint, 12), - ('wkr', c_uint16) - ] + def addSubPkt(self, dev_idx, ptype, addr, cmd, len, data): + if (len > 2032): + print('Error, bad subpkt len:%d', len) + return + if not (ptype in [0, 2]): + print('Error, bad subpkt type:', ptype) + return + if not (cmd in [0, 1, 2, 0xb, 0xc, 0xd, 0xe, 0xf]): + print('Error, bad cmd:', cmd) + return + + self.pkt_sub_pkt = self.pkt_sub_pkt + 1 + self.sub_pkt.append([dev_idx, ptype, addr, cmd, len, data]) + def gen(self, filename="pkt_verilog_test.v", filetype=0): + pkt_len = 4 + for sp in self.sub_pkt: + pkt_len = pkt_len + sp[4] + 8 + if pkt_len > 2048: + print('Error, bad pkt_len:', pkt_len) + return + + print("pkt_len:%d, data_len:%d"%(pkt_len, pkt_len - 4)) + + i = 4 + if self.pkt_type == 1: + pkt_len = 0 + self.pkt_buf[0] = 0 + self.pkt_buf[1] = (self.pkt_type & 0x3) + self.pkt_buf[2] = 0x3f + self.pkt_buf[3] = 0xff + else: + #for i in range(pkt_len): + self.pkt_buf[0] = ((pkt_len - 4) >> 4) & 0xff + self.pkt_buf[1] = (((pkt_len - 4) << 4) & 0xf0) | (self.pkt_type & 0x3) + self.pkt_buf[2] = 0 + self.pkt_buf[3] = 0 + + for sp in self.sub_pkt: + #设备索引(14bit)+类型(2bit) + temp = ((sp[0] & 0x3fff) << 2) | (sp[1] & 0x3) + + self.pkt_buf[i] = (temp >> 8) & 0xff + i = i + 1 + self.pkt_buf[i] = temp & 0xff + i = i + 1 + + #地址 + self.pkt_buf[i] = (sp[2] >> 8) & 0xff + i = i + 1 + self.pkt_buf[i] = sp[2] & 0xff + i = i + 1 + #命令类型(4bit)+长度(12bit) + temp = (sp[3] << 12) | (sp[4] & 0xfff) + + self.pkt_buf[i] = (temp >> 8) & 0xff + i = i + 1 + self.pkt_buf[i] = temp & 0xff + i = i + 1 + + #工作计数 + self.pkt_buf[i] = 0 + i = i + 1 + self.pkt_buf[i] = 0 + i = i + 1 + + #数据 + if sp[5] == None: + for _k in range(sp[4]): + self.pkt_buf[_k + i] = random.randint(0, 255) + else: + for _k in range(sp[4]): + self.pkt_buf[_k + i] = sp[5][_k] + + i = i + sp[4] + + f = open(filename, "wt+") + for _k in range(i): + f.write("txBuf[%d]=8'h%02X;\n"%(3 + _k, self.pkt_buf[_k])) + f.close() if __name__ == '__main__': - packet = b'\0' * 2048 + genPkt = GenPkt() + + genPkt.setPktType(1) + genPkt.gen("./generated/shin/detect_pkt.vh") + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x02, 0, 0x0830, 0x2, 56, None) + genPkt.addSubPkt(0x01, 0, 0x0840, 0x1, 56, None) + genPkt.addSubPkt(0x03, 0, 0x1040, 0x0, 56, None) + for i in range(5): + genPkt.addSubPkt(random.randint(100, 4000), 0, random.randint(0, 65536), 0x0, 56, None) + #genPkt.addSubPkt(10, 2, 0x300, 0x2, 4, None) + #genPkt.addSubPkt(11, 1, 0x300, 0x2, 4, None) + genPkt.gen("./generated/shin/seq_pkt.vh") - pkt = cast (packet, POINTER(TPkt)).contents - pkt.len = 512 - pkt.rsv1 = 0 - pkt.type = 0 - pkt.rsv2 = 0 - pkt.data[0] = 1 - pkt.data[1] = 2 - pkt.data[2] = 3 - pkt.data[3] = 4 + genPkt.clean() + genPkt.setPktType(0) - for i in range(10): - print(hex(packet[i]), ' ') + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + genPkt.addSubPkt(0x0, 0, random.randint(0, 65536), 0xe, 12, b'\0'*12) + genPkt.gen("./generated/shin/sync_pkt.vh") + + + genPkt.clean() + genPkt.setPktType(0) + + #subPkt参数:索引、索引类型、地址、命令、长度、数据 + data = bytearray(b"\0" * 0x28) + data[0] = 0xff + data[16] = 0x90 + data[17] = 0x88 + data[24] = 0xff + data[25] = 0x0f + data[28] = 0x0a + data[29] = 0x0 + + data[36] = 0x0 + data[37] = 0x01 + + genPkt.addSubPkt(0x2, 0, 0x120, 0x1, 0x28, data) + + + genPkt.gen("./generated/shin/sync_sig_pkt.vh") \ No newline at end of file