修改仿真的顶层文件,适配最新的spi,貌似还是不能工作

This commit is contained in:
2025-09-19 00:08:23 +08:00
parent 2e19a95b92
commit 8112262d09
6 changed files with 300 additions and 244 deletions

View File

@@ -44,40 +44,47 @@ module ShinTopSpiTb(
`include "dev_predef.vh"
`ifdef DEFINE_SLAVE_DEVICE
`define DEV_NUM 4 //slave num
`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master
`define SPI_CSN_NUM (`ALL_DEV_NUM * 3)
`define DEV_NUM 4 //slave num
`define ALL_DEV_NUM (`DEV_NUM + 1) // slave + master
`define SPI_CSN_NUM (`ALL_DEV_NUM * 4)
`define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031)
`define IQSPI_PINS(N) (`N*4+3):(`N*4)
`define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4)
`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)]
`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)]
`define HW_SERIAL 0 //48'h31303050584c //(48'h4c5850303031)
`define IQSPI_CSN_NUM(id) (`id)
`define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM))
`define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2)
`define IQSPI_PINS(N) (`N*4+3):(`N*4)
`define EQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4)
//`define AQSPI_PINS(N) ((`N + `ALL_DEV_NUM)*4+3):((`N + `ALL_DEV_NUM)*4)
`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)]
`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)]
`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)]
`define QSPI_MUX_MISO_INIT \
(`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\
(`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\
(`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\
(`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\
(`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\
(`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\
(`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\
(`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\
(`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\
(`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}})
`define SPI_MUX_MISO_INIT \
( spi_miso[0] & ~`ESPI_CSN(0)) |\
( spi_miso[1] & ~`ESPI_CSN(1)) |\
( spi_miso[2] & ~`ESPI_CSN(2)) |\
( spi_miso[3] & ~`ESPI_CSN(3)) |\
( spi_miso[4] & ~`ESPI_CSN(4))
`define IQSPI_MISO(N) qspi_miso[`IQSPI_PINS(`N)]
`define EQSPI_MISO(N) qspi_miso[`EQSPI_PINS(`N)]
`define IQSPI_CSN_NUM(id) (`id)
`define ESPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM))
`define EQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*2)
//`define AQSPI_CSN_NUM(id) ((`id)+(`ALL_DEV_NUM)*3)
`define IQSPI_CSN(id) spi_csn[`IQSPI_CSN_NUM(`id)]
`define ESPI_CSN(id) spi_csn[`ESPI_CSN_NUM(`id)]
`define EQSPI_CSN(id) spi_csn[`EQSPI_CSN_NUM(`id)]
//`define AQSPI_CSN(id) spi_csn[`AQSPI_CSN_NUM(`id)]
`define QSPI_MUX_MISO_INIT \
(`IQSPI_MISO(0) & ~{4{`IQSPI_CSN(0)}}) |\
(`IQSPI_MISO(1) & ~{4{`IQSPI_CSN(1)}}) |\
(`IQSPI_MISO(2) & ~{4{`IQSPI_CSN(2)}}) |\
(`IQSPI_MISO(3) & ~{4{`IQSPI_CSN(3)}}) |\
(`IQSPI_MISO(4) & ~{4{`IQSPI_CSN(4)}}) |\
(`EQSPI_MISO(0) & ~{4{`EQSPI_CSN(0)}}) |\
(`EQSPI_MISO(1) & ~{4{`EQSPI_CSN(1)}}) |\
(`EQSPI_MISO(2) & ~{4{`EQSPI_CSN(2)}}) |\
(`EQSPI_MISO(3) & ~{4{`EQSPI_CSN(3)}}) |\
(`EQSPI_MISO(4) & ~{4{`EQSPI_CSN(4)}})
`define SPI_MUX_MISO_INIT \
( spi_miso[0] & ~`ESPI_CSN(0)) |\
( spi_miso[1] & ~`ESPI_CSN(1)) |\
( spi_miso[2] & ~`ESPI_CSN(2)) |\
( spi_miso[3] & ~`ESPI_CSN(3)) |\
( spi_miso[4] & ~`ESPI_CSN(4))
`endif
wire [(`DEV_NUM - 1):0] dDat_w;
wire [(`DEV_NUM - 1):0] uDat_w;
@@ -90,7 +97,7 @@ module ShinTopSpiTb(
wire qspi_sck;
wire [3:0] qspi_mosi;
//wire [40-1:0] qspi_miso;
wire [(`ALL_DEV_NUM * 4 * 2 - 1):0] qspi_miso;
wire [(`ALL_DEV_NUM * 4 * 3 - 1):0] qspi_miso;
integer spidata_file;
integer c_line;
@@ -165,6 +172,12 @@ ShinTop s_ShinTop_Mst(
.io_oqspi_isDirIn(),
.io_oqspi_csn(`EQSPI_CSN(0)),
.io_aqspi_sck(qspi_sck),
.io_aqspi_mosi(qspi_mosi),
.io_aqspi_miso(`AQSPI_MISO(0)),
.io_aqspi_isDirIn(),
.io_aqspi_csn(`AQSPI_CSN(0)),
.io_isSoftReset(isSoftReset[0]),
.io_interrupt(io_int_sig[0]),
.io_latchPin_0(latch0),
@@ -553,6 +566,7 @@ end
//DEV_NUM
//ALL_DEV_NUM
wire isQspi = (idx >= 0 && idx <= (`ALL_DEV_NUM - 1)) || idx >= (`ALL_DEV_NUM * 2);
wire isAQspi = (idx >= (`ALL_DEV_NUM * 3));
wire [11:0] nextByteCnt = byteCnt + 1;
//输出
@@ -575,21 +589,38 @@ always @(posedge sck) begin
end else begin
bitCnt <= bitCnt + 1;
end
if( &bitCnt ) begin
byteCnt <= byteCnt +1;
transCnt <= transCnt + 1;
if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin
rxBuf[byteCnt] <= exChangeRegi;
//$display("spi read out %x", exChangeRegi);
end
if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin
exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso};
if ( isAQspi ) begin
if( &bitCnt ) begin
byteCnt <= byteCnt +1;
transCnt <= transCnt + 1;
if( (txBuf[2] & 8'h80) === 8'h80 & nextByteCnt >= 5) begin
rxBuf[byteCnt] <= exChangeRegi;
//$display("spi read out %x", exChangeRegi);
end
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
exChangeRegi <= 0;
end
end else begin
exChangeRegi <= 0;
exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso};
end
end else begin
exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso};
if( &bitCnt ) begin
byteCnt <= byteCnt +1;
transCnt <= transCnt + 1;
if( txBuf[2] === 8'h80 & nextByteCnt >= 4) begin
rxBuf[byteCnt] <= exChangeRegi;
//$display("spi read out %x", exChangeRegi);
end
if( txBuf[2] === 8'h80 & nextByteCnt >= 3) begin
exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso};
end else begin
exChangeRegi <= 0;
end
end else begin
exChangeRegi <= isQspi ? {exChangeRegi[3:0], qspi_mux_miso} : {exChangeRegi[6:0], spi_mux_miso};
end
end
end else begin
isBusy <= #5 1'b0;
@@ -607,7 +638,12 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
begin
txBuf[0] <= saddress[15:8];
txBuf[1] <= saddress[7:0];
txBuf[2] <= scmd;
if (isAQspi) begin
txBuf[2] <= (scmd | slength[12:8]);
txBuf[3] <= slength[7:0];
end else begin
txBuf[2] <= scmd;
end
length <= slength + 3;
idx <= sidx;
@@ -622,19 +658,33 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
begin
//$fwrite(spidata_file, "------------%5t------------\n", $realtime);
$fwrite(spidata_file, "T:%t \tdev:%4d, addr:0x%02h%02h, %s, len:%4d\n",
$realtime, ((sidx >= `ALL_DEV_NUM)? ((sidx >= (`ALL_DEV_NUM * 2))? (sidx - (`ALL_DEV_NUM * 2)):(sidx - `ALL_DEV_NUM)):sidx), txBuf[0], txBuf[1],
((txBuf[2] == 0)? "Write":" Read"), slength);
$realtime,
sidx % (`ALL_DEV_NUM),
txBuf[0],
txBuf[1],
(((txBuf[2] & 8'h80) == 0)? "Write":" Read"),
slength);
if (isAQspi) begin _pos = 4; end
else begin _pos = 3; end
if ( ((saddress == 16'h0800)
|| (saddress == 16'h1000)
|| (saddress == 16'h1800)
|| (saddress == 16'h2000)
|| (saddress == 16'h2800)
|| (saddress == 16'h3000)
|| (saddress == 16'h3800)
|| (saddress == 16'h4000))
&& ((sidx == 0) || (sidx == `ALL_DEV_NUM) || (sidx == (`ALL_DEV_NUM * 2)))) begin
_pos = 3;
|| (saddress == 16'h1000)
|| (saddress == 16'h1800)
|| (saddress == 16'h2000)
|| (saddress == 16'h2800)
|| (saddress == 16'h3000)
|| (saddress == 16'h3800)
|| (saddress == 16'h4000)
)
&& ((sidx == 0)
|| (sidx == `ALL_DEV_NUM)
|| (sidx == (`ALL_DEV_NUM * 2))
|| (sidx == (`ALL_DEV_NUM * 3))
)
) begin
for (integer _k = 0; _k < 4; _k++) begin
if (scmd == 0) begin
$fwrite(spidata_file, "%02h ", txBuf[_k + _pos]);
@@ -717,9 +767,9 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
end else begin
for (integer i=0; i<slength; i++) begin
if (scmd == 0) begin
$fwrite(spidata_file, "%02h ", txBuf[i + 3]);
$fwrite(spidata_file, "%02h ", txBuf[i + _pos]);
end else begin
$fwrite(spidata_file, "%02h ", rxBuf[i + 3]);
$fwrite(spidata_file, "%02h ", rxBuf[i + _pos]);
end
c_line = 0;
if ((i+1)%16 == 0) begin
@@ -799,9 +849,11 @@ end
`define INTERFACE_IDX 0 //internal spi
`define ARRAY_IDX_OFF 3
`define IF_IDX(idx) ((`INTERFACE_IDX)+(idx))
`define IF_IQSPI(idx) ((idx))
`define IF_OQSPI(idx) ((`ALL_DEV_NUM * 2) + (idx))
`define IF_AQSPI(idx) ((`ALL_DEV_NUM * 3) + (idx))
`define IF_OSPI(idx) ((`ALL_DEV_NUM) + (idx))
`define SPI_WRITE 8'h00
`define SPI_READ 8'h80
@@ -830,25 +882,6 @@ end
`define MST_RX_LEN_ADDR (`MST_RX0_LEN_ADDR)
`define MST_TX_LEN_ADDR (`MST_TX0_LEN_ADDR)
`define SETTING_ENCRYPTION \
txBuf[3 + 0] = 8'hb1;\
txBuf[3 + 1] = 8'hd2;\
txBuf[3 + 2] = 8'hf1;\
txBuf[3 + 3] = 8'h03;\
txBuf[3 + 4] = 8'hf2;\
txBuf[3 + 5] = 8'h01;\
txBuf[3 + 6] = 8'hf5;\
txBuf[3 + 7] = 8'h04;\
txBuf[3 + 8] = 8'ha1;\
txBuf[3 + 9] = 8'h01;\
txBuf[3 + 10] = 8'hd3;\
txBuf[3 + 11] = 8'h07;\
txBuf[3 + 12] = 8'hc8;\
txBuf[3 + 13] = 8'hef;\
txBuf[3 + 14] = 8'hb9;\
txBuf[3 + 15] = 8'h52;\
txBuf[3 + 16] = 8'h01;
`define BEGIN_TESTCASE(filename) \
integer logh;\
logh = $fopen(filename, "w")
@@ -860,14 +893,14 @@ end
if (cmd == (`SPI_WRITE)) begin \
f_write(logh, addr, cmd, len);\
for (integer _k = 0; _k < len; _k++) begin \
$fwrite(logh, "8'h%02h ", txBuf[3 + _k]); \
$fwrite(logh, "8'h%02h ", txBuf[`ARRAY_IDX_OFF + _k]); \
end \
spi_trans(addr, cmd, len, iface); \
end else begin \
spi_trans(addr, cmd, len, iface); \
f_write(logh, addr, cmd, len);\
for (integer _k = 0; _k < len; _k++) begin \
$fwrite(logh, "8'h%02h ", rxBuf[3 + _k]); \
$fwrite(logh, "8'h%02h ", rxBuf[`ARRAY_IDX_OFF + _k]); \
end \
end \
$fwrite(logh, "\n")
@@ -914,10 +947,17 @@ task wait_comm_finished(input [16:0] dev_idx);
while (is_run == 1) begin
txBuf[0] = 8'h00;
txBuf[1] = 8'h74;
txBuf[2] = `SPI_READ;
if (isAQspi) begin
txBuf[2] <= (`SPI_READ | 8'h0);
txBuf[3] <= 8'h04;
length = 8'h08;
end else begin
txBuf[2] <= `SPI_READ;
length = 8'h07;
end
length = 8'h07;
idx = `IF_IQSPI(dev_idx);
idx = `IF_IDX(dev_idx);
#5
@(negedge sck)
@@ -931,11 +971,11 @@ task wait_comm_finished(input [16:0] dev_idx);
end
#2000
//$display("%x %x", rxBuf[3], rxBuf[6]);
if ((rxBuf[3] & 8'h02) == 8'h02)
if ((rxBuf[`ARRAY_IDX_OFF] & 8'h02) == 8'h02)
begin
is_run = 0;
end
if ((rxBuf[6] & 8'h60) != 8'h00)
if ((rxBuf[`ARRAY_IDX_OFF+3] & 8'h60) != 8'h00)
begin
$display("error occur");
is_run = 0;
@@ -977,7 +1017,7 @@ initial begin
begin:SETTING_INTERFACE
if ((`INTERFACE_IDX) == `ALL_DEV_NUM) begin
$fdisplay(spidata_file, "\n\n从内部QSPI配置使用外部的SPI接口访问EasyBus");
txBuf[0+3] = 8'h01;
txBuf[`ARRAY_IDX_OFF] = 8'h01;
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(0)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(1)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(2)) );
@@ -985,7 +1025,15 @@ initial begin
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(4)) );
end else if ((`INTERFACE_IDX) == (`ALL_DEV_NUM * 2)) begin
$fdisplay(spidata_file, "\n\n从内部QSPI配置使用外部的QSPI接口访问EasyBus");
txBuf[0+3] = 8'h02;
txBuf[`ARRAY_IDX_OFF] = 8'h02;
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(0)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(1)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(2)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(3)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(4)) );
end else if ((`INTERFACE_IDX) == (`ALL_DEV_NUM * 3)) begin
$fdisplay(spidata_file, "\n\n从内部QSPI配置使用外部的ASPI接口访问EasyBus");
txBuf[`ARRAY_IDX_OFF] = 8'h03;
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(0)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(1)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(2)) );
@@ -993,7 +1041,7 @@ initial begin
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(4)) );
end else begin
$fdisplay(spidata_file, "\n\n从内部QSPI接口访问EasyBus");
txBuf[0+3] = 8'h00;
txBuf[`ARRAY_IDX_OFF] = 8'h00;
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(0)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(1)) );
spi_trans( (16'h09), (`SPI_WRITE), (1), (`IF_OSPI(2)) );
@@ -1022,10 +1070,10 @@ initial begin
spi_trans( (16'h70), (`SPI_READ), (14), (`IF_IDX(4)) );
$fdisplay(spidata_file, "-清中断");
txBuf[0+3] = 8'h00;
txBuf[1+3] = 8'h00;
txBuf[2+3] = 8'h00;
txBuf[3+3] = 8'h80;
txBuf[`ARRAY_IDX_OFF+0] = 8'h00;
txBuf[`ARRAY_IDX_OFF+1] = 8'h00;
txBuf[`ARRAY_IDX_OFF+2] = 8'h00;
txBuf[`ARRAY_IDX_OFF+3] = 8'h80;
spi_trans( (16'h78), (`SPI_WRITE), (4), (`IF_IDX(0)) );
spi_trans( (16'h78), (`SPI_WRITE), (4), (`IF_IDX(1)) );
spi_trans( (16'h78), (`SPI_WRITE), (4), (`IF_IDX(2)) );
@@ -1052,10 +1100,10 @@ initial begin
spi_trans( (16'h70), (`SPI_READ), (4), (`IF_IDX(4)) );
$fdisplay(spidata_file, "-设置中断");
txBuf[0+3] = 8'h00;
txBuf[1+3] = 8'h00;
txBuf[2+3] = 8'h00;
txBuf[3+3] = 8'h00;
txBuf[`ARRAY_IDX_OFF+0] = 8'h00;
txBuf[`ARRAY_IDX_OFF+1] = 8'h00;
txBuf[`ARRAY_IDX_OFF+2] = 8'h00;
txBuf[`ARRAY_IDX_OFF+3] = 8'h00;
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(0)) );
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(1)) );
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(2)) );
@@ -1070,16 +1118,16 @@ initial begin
spi_trans( (16'h70), (`SPI_READ), (4), (`IF_IDX(4)) );
$fdisplay(spidata_file, "-设置中断");
txBuf[0+3] = 8'h0F;
txBuf[1+3] = 8'h00;
txBuf[2+3] = 8'h00;
txBuf[3+3] = 8'h00;
txBuf[`ARRAY_IDX_OFF+0] = 8'h0F;
txBuf[`ARRAY_IDX_OFF+1] = 8'h00;
txBuf[`ARRAY_IDX_OFF+2] = 8'h00;
txBuf[`ARRAY_IDX_OFF+3] = 8'h00;
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(0)) );
txBuf[0+3] = 8'h00;
txBuf[1+3] = 8'hFF;
txBuf[2+3] = 8'h00;
txBuf[3+3] = 8'h00;
txBuf[`ARRAY_IDX_OFF+0] = 8'h00;
txBuf[`ARRAY_IDX_OFF+1] = 8'hFF;
txBuf[`ARRAY_IDX_OFF+2] = 8'h00;
txBuf[`ARRAY_IDX_OFF+3] = 8'h00;
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(1)) );
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(2)) );
spi_trans( (16'h70), (`SPI_WRITE), (4), (`IF_IDX(3)) );
@@ -1093,8 +1141,8 @@ initial begin
spi_trans( (16'h70), (`SPI_READ), (4), (`IF_IDX(4)) );
$fdisplay(spidata_file, "-中断改为脉冲模式");
txBuf[3] = 8'h10;
txBuf[4] = 8'h8A;
txBuf[`ARRAY_IDX_OFF+0] = 8'h10;
txBuf[`ARRAY_IDX_OFF+1] = 8'h8A;
spi_trans( (16'h7c), (`SPI_WRITE), (2), (`IF_IDX(0)) );
spi_trans( (16'h7c), (`SPI_WRITE), (2), (`IF_IDX(1)) );
spi_trans( (16'h7c), (`SPI_WRITE), (2), (`IF_IDX(2)) );