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..81a6653 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,13 @@ 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,7 +629,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; @@ -698,6 +702,8 @@ initial begin 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 diff --git a/tb/shinTest/gen_pkt.py b/tb/shinTest/gen_pkt.py index 0a19595..ed37104 100755 --- a/tb/shinTest/gen_pkt.py +++ b/tb/shinTest/gen_pkt.py @@ -1,49 +1,130 @@ #!/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 - - 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 - - for i in range(10): - print(hex(packet[i]), ' ') + 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") +