#!/usr/bin/env python #encoding=utf-8 import random 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() def clean(self): self.pkt_buf = bytearray(b'\0' * 2048) self.pkt_type = 0 self.pkt_sub_pkt = 0 self.sub_pkt = list() def setPktType(self, type): if (type != 0) and (type != 1): print('Error...set type failed:', type) else: self.pkt_type = type 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 = 4 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+") if filetype == 1: define_str = "`define DEF_" pos1 = filename.rfind("/") if (pos1 < -1): pos1 = 0 else: pos1 = pos1 + 1 pos2 = filename.rfind(".") if (pos1 > pos2): define_str = define_str + filename[pos1:] else: define_str = define_str + filename[pos1:pos2] f.write(define_str + "_len \t%d\n"%(pkt_len)) f.write(define_str + "_sm(array) \\\n\tarray``[%d]=8'h%02X;\\\n\tarray``[%d]=8'h%02X;\n"%( 3, pkt_len & 0xff, 4, pkt_len >> 8 )) f.write(define_str + "(array) \\\n") for _k in range(i): if _k < (i - 1): f.write("\tarray``[%d]=8'h%02X;\\\n"%(3 + _k, self.pkt_buf[_k])) else: f.write("\tarray``[%d]=8'h%02X;\n"%(3 + _k, self.pkt_buf[_k])) else: for _k in range(i): f.write("txBuf[%d]=8'h%02X;\n"%(3 + _k, self.pkt_buf[_k])) f.close() if __name__ == '__main__': genPkt = GenPkt() #------------------------------------------------------------------------- #>>>>>>嗅探数据包 genPkt.setPktType(1) genPkt.gen("./generated/shin/detect_pkt.vh", 1) #------------------------------------------------------------------------- #>>>>>>普通数据包 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_0_pkt.vh", 1) #------------------------------------------------------------------------- #>>>>>>普通数据包0,用来操作sync genPkt.clean() genPkt.setPktType(0) data = bytearray(b"\0"*100) data[0] = 0 #0x0300 data[1] = 0 #0x0301 data[2] = 64 #0x302 长度1 data[3] = 0 #0x303 长度2 data[4] = 0 data[5] = 0 data[6] = 64 data[7] = 0 data[8] = 0 data[9] = 0 data[10] = 64 data[11] = 0 data[12] = 0 data[13] = 0 data[14] = 64 data[15] = 0 #subPkt参数:索引、索引类型、地址、命令、长度、数据 genPkt.addSubPkt(0x02, 0, 0x0300, 0x1, 16, data) #sm0 #genPkt.addSubPkt(0x01, 0, 0x0308, 0x1, 4, data) #sm2 #genPkt.addSubPkt(0x03, 0, 0x0310, 0x1, 4, data) #sm4 #genPkt.addSubPkt(0x04, 0, 0x0318, 0x1, 4, data) #sm6 data = bytearray(b"\0"*100) for i in range(64): data[i] = i genPkt.addSubPkt(0x02, 0, 0x0800, 0x1, 64, data) #genPkt.addSubPkt(0x01, 0, 0x1800, 0x1, 64, data) #genPkt.addSubPkt(0x03, 0, 0x2800, 0x1, 64, data) #genPkt.addSubPkt(0x04, 0, 0x3800, 0x1, 64, data) genPkt.gen("./generated/shin/seq_1_pkt.vh", 1) #------------------------------------------------------------------------- #>>>>>>同步数据包 genPkt.clean() genPkt.setPktType(0) #subPkt参数:索引、索引类型、地址、命令、长度、数据 genPkt.addSubPkt(0x0, 0, random.randint(0, 65535), 0xc, 12, b'\0'*12) genPkt.gen("./generated/shin/sync_pkt.vh", 1) #------------------------------------------------------------------------- #>>>>>>设置同步信号的数据包 genPkt.clean() genPkt.setPktType(0) #subPkt参数:索引、索引类型、地址、命令、长度、数据 data = bytearray(b"\0" * 0x28) data[0] = 0xff #地址0x120 data[16] = 0x00 #地址0x130, sync同步点 data[17] = 0xf0 #地址0x131 #data[18] = 0x10 data[24] = 0x00 #地址0x138, sync周期 4B data[25] = 0x20 #地址0x139 data[28] = 0x0a #sync1偏移 data[29] = 0x0 data[36] = 0x80 #sync3偏移 data[37] = 0x00 genPkt.addSubPkt(0x2, 0, 0x120, 0x1, 0x28, data) genPkt.addSubPkt(0x1, 0, 0x120, 0x1, 0x28, data) genPkt.addSubPkt(0x4, 0, 0x120, 0x1, 0x28, data) genPkt.gen("./generated/shin/sync_sig_pkt.vh", 1) #------------------------------------------------------------------------- #>>>>>>设置顺序地址 genPkt.clean() genPkt.setPktType(0) data = bytearray(b"\0" * 2) data[0] = 0x3f data[1] = 0xff #subPkt参数:索引、索引类型、地址、命令、长度、数据 genPkt.addSubPkt(0x0, 0, random.randint(0, 65535), 0xb, 2, data) genPkt.gen("./generated/shin/set_addr_pkt.vh", 1)