diff --git a/tb/shinTest/ShinTopSpiTb.v b/tb/shinTest/ShinTopSpiTb.v index 17deb60..aa71a28 100644 --- a/tb/shinTest/ShinTopSpiTb.v +++ b/tb/shinTest/ShinTopSpiTb.v @@ -527,6 +527,9 @@ end reg [11:0] transCnt; reg [11:0] byteCnt; reg [2:0] bitCnt; +`ifndef OLD_SPI_SUPPORT + reg spi_1to4 = 1; +`endif always @(posedge clock) begin @@ -553,7 +556,17 @@ always @(negedge sck) begin if( &bitCnt ) begin exChangeRego <= txBuf[nextByteCnt]; end else begin +`ifdef OLD_SPI_SUPPORT exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; +`else + //当单线转4线的协议生效时,且传输命令+地址,使用单线 + //否则使用接口的固定模式 + if (spi_1to4 & transCnt < 4) begin + exChangeRego <= exChangeRego << 1; + end else begin + exChangeRego <= isQspi ? exChangeRego << 4 : exChangeRego << 1; + end +`endif end end end @@ -572,10 +585,22 @@ always @(posedge sck) begin if( isBusy ) begin if( transCnt <= length ) begin if( isQspi ) begin +`ifdef OLD_SPI_SUPPORT bitCnt <= ~bitCnt; +`else + //当单线转4线的协议生效时,且传输命令+地址,使用单线;数据使用4线 + if ((transCnt < 4) & (spi_1to4)) begin + bitCnt <= bitCnt + 1; + end else begin + bitCnt <= ~bitCnt; + end +`endif end else begin bitCnt <= bitCnt + 1; end + + +`ifdef OLD_SPI_SUPPORT if ( idx >= (`ALL_DEV_NUM * 3) ) begin if( &bitCnt ) begin byteCnt <= byteCnt +1; @@ -609,6 +634,32 @@ always @(posedge sck) begin exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; end end +`else + if( &bitCnt ) begin + byteCnt <= byteCnt +1; + transCnt <= transCnt + 1; + //读,且超过6个字节 + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin + rxBuf[byteCnt] <= exChangeRegi; + //$display("spi read out %x", exChangeRegi); + end + //读,且超过了4个字节 + if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 4) begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + //写 或 读没有超过4个字节 + exChangeRegi <= 0; + end + end else begin + //字节数小于4个字节,且启动了QSPI的1线命令4线数据 + if ((transCnt < 4) & (spi_1to4)) begin + exChangeRegi <= isQspi ? {exChangeRegi[6:0], qspi_mux_miso[0]} : {exChangeRegi[6:0], spi_mux_miso}; + end else begin + exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso}; + end + end +`endif + end else begin isBusy <= #5 1'b0; end @@ -624,6 +675,7 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, i begin txBuf[0] <= saddress[15:8]; txBuf[1] <= saddress[7:0]; +`ifdef OLD_SPI_SUPPORT if (sidx >=(`ALL_DEV_NUM * 3)) begin txBuf[2] <= (scmd | slength[12:8]); txBuf[3] <= slength[7:0]; @@ -632,6 +684,11 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, i txBuf[2] <= scmd; length <= slength + 3; end +`else + txBuf[2] <= (scmd | slength[12:8]); + txBuf[3] <= slength[7:0]; + length <= slength + 4 + 1; +`endif idx <= sidx; @@ -644,6 +701,7 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, i @( negedge isBusy) #1000 begin //$fwrite(spidata_file, "------------%5t------------\n", $realtime); +`ifdef OLD_SPI_SUPPORT if (sidx >=(`ALL_DEV_NUM * 3)) begin $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", $realtime, @@ -662,9 +720,22 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength, i (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), slength); end - + if (sidx >=(`ALL_DEV_NUM * 3)) begin _pos = 4; end else begin _pos = 3; end +`else + $fwrite(spidata_file, "T:%t \tdev:%4d(%4d), addr:0x%02h%02h, %s, len:%4d (0x%02h%02h)\n", + $realtime, + sidx % (`ALL_DEV_NUM), sidx, + txBuf[0], + txBuf[1], + (((txBuf[2] & 8'h80) == 0)? "Write":" Read"), + slength, + txBuf[2], txBuf[3]); + _pos = 4; +`endif + + if ( ((saddress == 16'h0800) || (saddress == 16'h1000) @@ -850,17 +921,17 @@ end `ifdef USING_IQSPI `define INTERFACE_IDX 0//internal spi - `define ARRAY_IDX_OFF 3 + `define ARRAY_IDX_OFF 4//3 `endif `ifdef USING_OSPI `define INTERFACE_IDX (`ALL_DEV_NUM)//internal spi - `define ARRAY_IDX_OFF 3 + `define ARRAY_IDX_OFF 4//3 `endif `ifdef USING_OQSPI `define INTERFACE_IDX (`ALL_DEV_NUM * 2)//internal spi - `define ARRAY_IDX_OFF 3 + `define ARRAY_IDX_OFF 4//3 `endif `ifdef USING_AQSPI @@ -941,6 +1012,7 @@ task wait_comm_finished(input [16:0] dev_idx); while (is_run == 1) begin txBuf[0] = 8'h00; txBuf[1] = 8'h74; + `ifdef OLD_SPI_SUPPORT if (dev_idx >=(`ALL_DEV_NUM * 3)) begin txBuf[2] <= (`SPI_READ | 8'h0); txBuf[3] <= 8'h04; @@ -951,7 +1023,11 @@ task wait_comm_finished(input [16:0] dev_idx); length = 8'h07; //$display("using iqspi"); end - + `else + txBuf[2] <= (`SPI_READ | 8'h0); + txBuf[3] <= 8'h04; + length = 8'h08; + `endif idx = dev_idx; diff --git a/tb/shinTest/gen_pkt.py b/tb/shinTest/gen_pkt.py index 1213709..da45dfd 100755 --- a/tb/shinTest/gen_pkt.py +++ b/tb/shinTest/gen_pkt.py @@ -25,7 +25,7 @@ if __name__ == '__main__': environment.gen_slv_dev_num(4) environment.bringup() - #''' + ''' add_tc_2_runlist(errorPkt.tc1()) add_tc_2_runlist(errorPkt.tc2()) add_tc_2_runlist(errorPkt.tc3()) @@ -72,8 +72,10 @@ if __name__ == '__main__': add_tc_2_runlist(rwregs.tc3()) #''' - #''' + add_tc_2_runlist(base.tc1()) + + ''' add_tc_2_runlist(base.tc2()) add_tc_2_runlist(base.tc3()) add_tc_2_runlist(base.tc4()) @@ -106,7 +108,7 @@ if __name__ == '__main__': add_tc_2_runlist(base.tc31()) #''' - #''' + ''' add_tc_2_runlist(broadcast.tc1()) add_tc_2_runlist(broadcast.tc2()) add_tc_2_runlist(broadcast.tc3()) @@ -123,7 +125,7 @@ if __name__ == '__main__': add_tc_2_runlist(sync.tc8()) #''' - #''' + ''' add_tc_2_runlist(ebmmu.tc1()) add_tc_2_runlist(ebmmu.tc2()) add_tc_2_runlist(ebmmu.tc3()) diff --git a/tb/shinTest/pyutils/GenPkt.py b/tb/shinTest/pyutils/GenPkt.py index 60259d3..8abe0f6 100644 --- a/tb/shinTest/pyutils/GenPkt.py +++ b/tb/shinTest/pyutils/GenPkt.py @@ -275,13 +275,13 @@ def genIFRwDataCode(dev, addr, isWrite = False, data_len=0, data = None, wlog=Tr spi_offset = "`ARRAY_IDX_OFF" if iface == 0: spi_api = "IF_IQSPI" - spi_offset = "3" + spi_offset = "4" #"3" elif iface == 1: spi_api = "IF_OSPI" - spi_offset = "3" + spi_offset = "4" #"3" elif iface == 2: spi_api = "IF_OQSPI" - spi_offset = "3" + spi_offset = "4" #"3" elif iface == 3: spi_api = "IF_AQSPI" spi_offset = "4"