from pyutils import * global_dev_num = 4 global_setting_dev_clk = dict() global_using_8b10b = False global_spi_type = 0 global_cdr_type = 0 def bringup(): gen_file_def = "sys_bringup" sm_idx = 0 tc_des = "系统环境建立,包括:1.配置主从栈的角色;2.网络建立,嗅探、设置顺序地址、嗅探;3.配置中断。\\n" \ + "\\n注意:网络建立第一次嗅探包发送主要是为了建立拓扑,每个从站都知道了自己的邻居状况;发送顺序地址,\\n"\ + "则是让每个从站拥有合适的地址。第二次发送嗅探包非必要,主要是用于更新从站的邻居信息。" genPkt = GenPkt() genPkt.clean() genPkt.addBeforeExc(genTcStartFrameCode(gen_file_def, tc_des) +genMessageCode("--设置合适的工作模式:底层编码4b5b or 8b10b/设置CDR/SPI接口") +using_proper_workmode(0) +using_proper_workmode(1) +using_proper_workmode(2) +using_proper_workmode(3) +using_proper_workmode(4) +genMessageCode("--读取中断状态") +genIFRwDataCode(0, 0x74, False, 4) +genIFRwDataCode(1, 0x74, False, 4) +genIFRwDataCode(2, 0x74, False, 4) +genIFRwDataCode(3, 0x74, False, 4) +genIFRwDataCode(4, 0x74, False, 4) +genMessageCode("--清除中断") +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) ) main_dev = [0x01, ] slave_dev =[0x02, ] genPkt.addAfterExc(genMessageCode("--设置主站,协议栈工作在主站模式") +genIFRwDataCode(0, 0x0, True, 1, main_dev) +"#5000\n" +genMessageCode("--设置从站,协议栈工作在从站模式") +genIFRwDataCode(1, 0x0, True, 1, slave_dev) +genIFRwDataCode(2, 0x0, True, 1, slave_dev) +genIFRwDataCode(3, 0x0, True, 1, slave_dev) +genIFRwDataCode(4, 0x0, True, 1, slave_dev) +genMessageCode("--读取寄存器,检查相关的配置") +genIFRwDataCode(0, 0x0, False, 1) +genIFRwDataCode(1, 0x0, False, 1) +genIFRwDataCode(2, 0x0, False, 1) +genIFRwDataCode(3, 0x0, False, 1) +genIFRwDataCode(4, 0x0, False, 1) +genMessageCode("--使能中断") +genIFRwDataCode(0, 0x70, True, 4, [0x03, 0x00, 0x00, 0xf0]) +genIFRwDataCode(1, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) +genIFRwDataCode(2, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) +genIFRwDataCode(3, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) +genIFRwDataCode(4, 0x70, True, 4, [0x00, 0x00, 0x00, 0xf0]) +genMessageCode("--设置中断为脉冲模式") +genIFRwDataCode(0, 0x7c, True, 2, [0x10, 0x80]) +genIFRwDataCode(1, 0x7c, True, 2, [0x10, 0x80]) +genIFRwDataCode(2, 0x7c, True, 2, [0x10, 0x80]) +genIFRwDataCode(3, 0x7c, True, 2, [0x10, 0x80]) +genIFRwDataCode(4, 0x7c, True, 2, [0x10, 0x80]) ) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) genPkt.clean() genPkt.setPktType(1) gen_file_def_ap = gen_file_def+"_step01" sm_idx = 0 genPkt.addBeforeExc(genMessageCode("--设置环境,进行第一次嗅探")) genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) +genWriteTransPktCode(gen_file_def_ap, sm_idx) +genTrgTransPktCode(gen_file_def_ap, sm_idx) +genReadAckPktCode(gen_file_def_ap, sm_idx) +genMessageCode("--嗅探后检查链路状态寄存器") +genIFRwDataCode(1, 0xc0, False, 4) +genIFRwDataCode(2, 0xc0, False, 4) +genIFRwDataCode(3, 0xc0, False, 4) +genIFRwDataCode(4, 0xc0, False, 4) +genMessageCode("--清除主中断") +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) ) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) #------------------------------------------------------------------------------ genPkt.clean() genPkt.setPktType(0) gen_file_def_ap = gen_file_def + "_step02" sm_idx = 0 data = [0x3f, 0xff] genPkt.addSubPkt(0x0, 0, 0x0, 0xb, 2, data) genPkt.addAfterExc(genMessageCode("--设置顺序地址") +genWriteTransLenCode(gen_file_def_ap, sm_idx) +genWriteTransPktCode(gen_file_def_ap, sm_idx) +genTrgTransPktCode(gen_file_def_ap, sm_idx) +genReadAckPktCode(gen_file_def_ap, sm_idx) #+genTcEndFrameCode(gen_file_def) +genIFRwDataCode(1, 0xc0, False, 4) +genIFRwDataCode(2, 0xc0, False, 4) +genIFRwDataCode(3, 0xc0, False, 4) +genIFRwDataCode(4, 0xc0, False, 4) +genMessageCode("--清除主中断") +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) ) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) genPkt.clean() genPkt.setPktType(1) gen_file_def_ap = gen_file_def+"_step03" sm_idx = 0 genPkt.addBeforeExc(genMessageCode("--设置环境,进行第二次嗅探")) genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx) +genWriteTransPktCode(gen_file_def_ap, sm_idx) +genTrgTransPktCode(gen_file_def_ap, sm_idx) +genReadAckPktCode(gen_file_def_ap, sm_idx) +genMessageCode("--嗅探后检查链路状态寄存器") +genIFRwDataCode(1, 0xc0, False, 4) +genIFRwDataCode(2, 0xc0, False, 4) +genIFRwDataCode(3, 0xc0, False, 4) +genIFRwDataCode(4, 0xc0, False, 4) +genMessageCode("--清除中断") +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genMessageCode("--读取中断状态") +genIFRwDataCode(0, 0x74, False, 4) +genIFRwDataCode(1, 0x74, False, 4) +genIFRwDataCode(2, 0x74, False, 4) +genIFRwDataCode(3, 0x74, False, 4) +genIFRwDataCode(4, 0x74, False, 4) +genMessageCode("--清除中断") +genIFRwDataCode(0, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(1, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(2, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(3, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genIFRwDataCode(4, 0x78, True, 4, [0xff, 0xff, 0xff, 0xff]) +genMessageCode("--读取中断状态") +genIFRwDataCode(0, 0x74, False, 4) +genIFRwDataCode(1, 0x74, False, 4) +genIFRwDataCode(2, 0x74, False, 4) +genIFRwDataCode(3, 0x74, False, 4) +genIFRwDataCode(4, 0x74, False, 4) +genMessageCode("--读取看门狗") +genIFRwDataCode(0, 0x400, False, 8) +genIFRwDataCode(1, 0x400, False, 8) +genIFRwDataCode(2, 0x400, False, 8) +genIFRwDataCode(3, 0x400, False, 8) +genIFRwDataCode(4, 0x400, False, 8) #+genIFRwDataCode(1, 0x0044, True, 4, [0x12, 0x34, 0x56, 0x78]) #+genIFRwDataCode(1, 0x0044, False, 4) +genTcEndFrameCode(gen_file_def) ) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap) add_tc_2_runlist(gen_file_def) def __GenDevice(id, TerminateNode = False): global global_setting_dev_clk dout_code = "dDat_w[%d]"%(id + 1, ) din_code = "uDat_w[%d]"%(id + 1, ) if TerminateNode: dout_code = "" din_code = "1'b0" clk = "multiCLK[0]" multiclk = "multiCLK" try: v = global_setting_dev_clk[id + 1] clk = "multiCLK%d[0]"%(id + 1, ) multiclk = "multiCLK%d"%(id + 1, ) except: pass code_device = ("\tShinTop s_ShinTop_slv%d(\n"%(id, ) +"\t.clock(%s),\n"%(clk, ) +"\t.reset(reset | isSoftReset_reg[%d]),\n\n"%(id + 1,) +"\t.io_multiCLK_0(%s[0]),\n"%(multiclk, ) +"\t.io_multiCLK_1(%s[1]),\n"%(multiclk, ) +"\t.io_multiCLK_2(%s[2]),\n"%(multiclk, ) +"\t.io_multiCLK_3(%s[3]),\n"%(multiclk, ) +"\t.io_multiCLK_4(%s[4]),\n"%(multiclk, ) +"\t.io_multiCLK_5(%s[5]),\n"%(multiclk, ) +"\t.io_multiCLK_6(%s[6]),\n"%(multiclk, ) +"\t.io_multiCLK_7(%s[7]),\n"%(multiclk, ) +"\t.io_multiCLK_8(%s[8]),\n"%(multiclk, ) +"\t.io_multiCLK_9(%s[9]),\n"%(multiclk, ) +"\t.io_multiCLK_10(%s[10]),\n"%(multiclk, ) +"\t.io_multiCLK_11(%s[11]),\n"%(multiclk, ) +"\t.io_multiCLK_12(%s[12]),\n"%(multiclk, ) +"\t.io_multiCLK_13(%s[13]),\n"%(multiclk, ) +"\t.io_multiCLK_14(%s[14]),\n"%(multiclk, ) +"\t.io_multiCLK_15(%s[15]),\n\n"%(multiclk, ) +"\t.io_multiCLKDiv4_0(%s[0]),\n"%(multiclk, ) +"\t.io_multiCLKDiv4_1(%s[4]),\n"%(multiclk, ) +"\t.io_multiCLKDiv4_2(%s[8]),\n"%(multiclk, ) +"\t.io_multiCLKDiv4_3(%s[12]),\n\n"%(multiclk, ) +"\t.io_dDatIn(dDat_w[%d]),\n"%(id, ) +"\t.io_dDatOut(%s),\n"%(dout_code, ) +"\t.io_uDatIn(%s),\n"%(din_code, ) +"\t.io_uDatOut(uDat_w[%d]),\n\n"%(id, ) +"\t.io_iqspi_sck(qspi_sck),\n" +"\t.io_iqspi_mosi(qspi_mosi),\n" +"\t.io_iqspi_miso(`IQSPI_MISO(%d)),\n"%(id + 1, ) +"\t.io_iqspi_isDirIn(),\n" +"\t.io_iqspi_csn(`IQSPI_CSN(%d)),\n\n"%(id + 1, ) +"\t.io_ospi_sck (spi_sck),\n" +"\t.io_ospi_mosi(spi_mosi),\n" +"\t.io_ospi_miso(spi_miso[%d]),\n"%(id + 1, ) +"\t.io_ospi_csn (`ESPI_CSN(%d)),\n\n"%(id + 1, ) +"\t.io_oqspi_sck(qspi_sck),\n" +"\t.io_oqspi_mosi(qspi_mosi),\n" +"\t.io_oqspi_miso(`EQSPI_MISO(%d)),\n"%(id + 1, ) +"\t.io_oqspi_isDirIn(),\n" +"\t.io_oqspi_csn(`EQSPI_CSN(%d)),\n\n"%(id + 1, ) +"\t.io_aqspi_sck(qspi_sck),\n" +"\t.io_aqspi_mosi(qspi_mosi),\n" +"\t.io_aqspi_miso(`AQSPI_MISO(%d)),\n"%(id + 1, ) +"\t.io_aqspi_isDirIn(),\n" +"\t.io_aqspi_csn(`AQSPI_CSN(%d)),\n"%(id + 1, ) +"\t.io_isSoftReset(isSoftReset[%d]),\n"%(id + 1, ) +"\t.io_interrupt(io_int_sig[%d]),\n"%(id + 1, ) +"\t.io_latchPin_0(latch0),\n" +"\t.io_latchPin_1(latch1),\n" +"\t.io_hwSerial(`HW_SERIAL),\n" +"\t.io_uniCode(64'h0)\n" +"\t);\n\n\n" ) return code_device def __gen_slv_dev_predef(num): global global_setting_dev_clk global global_spi_type code_for_clk = "" for k in global_setting_dev_clk: code_for_clk = code_for_clk + "reg [15:0] multiCLK%d;\n"%(k, ) spi_type_str = "USING_IQSPI" if global_spi_type == 1: spi_type_str = "USING_OSPI" elif global_spi_type == 2: spi_type_str = "USING_OQSPI" elif global_spi_type == 3: spi_type_str = "USING_AQSPI" else: spi_type_str = "USING_IQSPI" code_predef =("`define %s \n"%(spi_type_str, ) +"`define DEV_NUM %d //slave num\n"%(num, ) +"`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master\n" +"`define SPI_CSN_NUM (`ALL_DEV_NUM * 4)\n\n" +"`define HW_SERIAL 48'h31303050584c //(48'h4c5850303031)\n\n" +"`define IQSPI_PINS(N) (N*4+3):(N*4)\n" +"`define EQSPI_PINS(N) ((N + `ALL_DEV_NUM)*4+3):((N + `ALL_DEV_NUM)*4)\n" +"`define AQSPI_PINS(N) ((N + `ALL_DEV_NUM * 2)*4+3):((N + `ALL_DEV_NUM * 2)*4)\n\n" +"`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(N)]\n" +"`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(N)]\n" +"`define AQSPI_MISO(N) qspi_miso[`AQSPI_PINS(N)]\n\n" +"`define IQSPI_CSN_NUM(id) (id)\n" +"`define ESPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM))\n" +"`define EQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*2)\n" +"`define AQSPI_CSN_NUM(id) ((id)+(`ALL_DEV_NUM)*3)\n\n" +"`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(id)]\n" +"`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(id)]\n" +"`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(id)]\n" +"`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(id)]\n\n" ) code_qspi_mux_init = "`define QSPI_MUX_MISO_INIT \\\n" code_qspi_mux_init_item = "" for i in range(num): code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(i, i) code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`IQSPI_MISO(%d) & ~{4{`IQSPI_CSN(%d)}}) |\\\n"%(num, num) for i in range(num): code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(i, i) code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`EQSPI_MISO(%d) & ~{4{`EQSPI_CSN(%d)}}) |\\\n"%(num, num) for i in range(num): code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}}) |\\\n"%(i, i) code_qspi_mux_init_item = code_qspi_mux_init_item + "\t\t(`AQSPI_MISO(%d) & ~{4{`AQSPI_CSN(%d)}})\n\n"%(num, num) code_qspi_mux_init = code_qspi_mux_init + code_qspi_mux_init_item code_spi_mux_init = "`define SPI_MUX_MISO_INIT \\\n" code_spi_mux_init_item = "" for i in range(num): code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d)) |\\\n"%(i, i) code_spi_mux_init_item = code_spi_mux_init_item + "\t\t( spi_miso[%d] & ~`ESPI_CSN(%d))\n\n"%(num, num) code_spi_mux_init = code_spi_mux_init + code_spi_mux_init_item genPkt = GenPkt() genPkt.clean() gen_file_def = "dev_predef" code = code_for_clk + code_predef + code_qspi_mux_init + code_spi_mux_init genPkt.addAfterExc(code) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) def get_slv_dev_num(): global global_dev_num return global_dev_num def gen_slv_dev_num(num): global global_dev_num global_dev_num = num __gen_slv_dev_predef(num) genPkt = GenPkt() genPkt.clean() gen_file_def = "slave_dev_def" code = "" for id in range(num - 1): code = code + __GenDevice(id) code = code + __GenDevice(num - 1, True) genPkt.addAfterExc(code) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) def gen_slv_dev_for_clk(num): __gen_slv_dev_predef(num) genPkt = GenPkt() genPkt.clean() gen_file_def = "slave_dev_def" code = "" for id in range(num - 1): code = code + __GenDevice(id) code = code + __GenDevice(num - 1, True) genPkt.addAfterExc(code) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) def set_dev_clk(cfg): global global_setting_dev_clk global_setting_dev_clk = cfg code_for_clk = "" for k in global_setting_dev_clk: v = global_setting_dev_clk[k] ph = int(8 * 1000000 * (int(abs(v[0]))%360) / 360.0) period = int(1000000 + v[1]) code_for_clk = code_for_clk + __gen_slv_clk(k, ph, period) genPkt = GenPkt() genPkt.clean() gen_file_def = "slave_dev_clk" genPkt.addAfterExc(code_for_clk) genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1) def __gen_slv_clk(clk, ph, period): slv_code =( "" #"\tinitial begin\n" #+"\t\tforever begin #%d clock%d <= ~clock%d; end\n"%(period * 8, clk, clk) #+"\tend\n\n" +"\tgenerate\n" +"\tfor( genvar i = 0; i < 16; i = i + 1 ) begin\n" +"\t\tinitial begin\n" + "\t\t\t//相位信息\n" + "\t\t\t#%d\n"%(ph) + "\t\t\tmultiCLK%d[i] = 0;\n"%(clk, ) + "\t\t\tfor( integer j = 0; j < i; j = j + 1 ) begin\n" + "\t\t\t\t#%d\n"%(period, ) + "\t\t\t\t;\n" + "\t\t\tend\n" + "\t\t\tforever begin #%d multiCLK%d[i] <= ~multiCLK%d[i]; end\n"%(period * 8, clk, clk) +"\t\tend\n" +"\tend\n" +"\tendgenerate\n") return slv_code def teardown(): #add_tc_2_runlist("") pass def set_spi_interface(spi_type): global global_spi_type global_spi_type = spi_type def set_using_8b10b(isUsing8b10b): global global_using_8b10b global_using_8b10b = isUsing8b10b def set_cdr_type(cdr_type): global global_cdr_type global_cdr_type = cdr_type def using_proper_workmode(dev, iface=1): global global_using_8b10b global global_spi_type global global_cdr_type trans_code = 0x0 if global_using_8b10b: trans_code = 0x1 return genIFRwDataCode(dev, 0x09, True, 1, [global_spi_type, ], wlog=False, iface=iface)\ +genIFRwDataCode(dev, 0x004c, True, 2, [trans_code, 0x59], wlog = False)\ +genIFRwDataCode(dev, 0x004e, True, 2, [global_cdr_type, 0x60], wlog = False)