增加代码,1.仿真了最多202个从站,功能正常;2.测试了读写\广播等操作
This commit is contained in:
@@ -9,7 +9,7 @@ VCS = vcs -sverilog +v2k -timescale=1ns/1ps \
|
|||||||
-l compile.log \
|
-l compile.log \
|
||||||
-debug_access+none \
|
-debug_access+none \
|
||||||
+define+VCS_COMPILE \
|
+define+VCS_COMPILE \
|
||||||
-fastpartcomp=j$(nproc) \
|
-fastpartcomp=j${CPU_COUNT} \
|
||||||
|
|
||||||
SIM = ./${OUTPUT} -l run.log
|
SIM = ./${OUTPUT} -l run.log
|
||||||
|
|
||||||
|
|||||||
@@ -443,6 +443,11 @@ begin
|
|||||||
`ifdef VCS_COMPILE
|
`ifdef VCS_COMPILE
|
||||||
$dumpfile("./generated/wave.vcd"); //生成的vcd文件名称
|
$dumpfile("./generated/wave.vcd"); //生成的vcd文件名称
|
||||||
$dumpvars(0, ShinTopSpiTb);//tb模块名称
|
$dumpvars(0, ShinTopSpiTb);//tb模块名称
|
||||||
|
$dumpvars(0, ShinTopSpiTb.s_ShinTop_Mst);//tb模块名称
|
||||||
|
//$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv124);//tb模块名称
|
||||||
|
//$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv125);//tb模块名称
|
||||||
|
//$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv126);//tb模块名称
|
||||||
|
//$dumpvars(0, ShinTopSpiTb.s_ShinTop_slv127);//tb模块名称
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`ifdef IVERILOG_COMPILE
|
`ifdef IVERILOG_COMPILE
|
||||||
@@ -525,7 +530,7 @@ end
|
|||||||
reg isBusy = 0;
|
reg isBusy = 0;
|
||||||
|
|
||||||
reg [11:0] length;
|
reg [11:0] length;
|
||||||
reg [7:0] idx;
|
reg [16:0] idx;
|
||||||
|
|
||||||
reg [11:0] transCnt;
|
reg [11:0] transCnt;
|
||||||
reg [11:0] byteCnt;
|
reg [11:0] byteCnt;
|
||||||
@@ -598,7 +603,7 @@ end
|
|||||||
|
|
||||||
//mst slv0~slv3的 内部qspi调用即设置
|
//mst slv0~slv3的 内部qspi调用即设置
|
||||||
//sidx为0~4;外部spi为5~9,外部qspi为10~15
|
//sidx为0~4;外部spi为5~9,外部qspi为10~15
|
||||||
task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,input [7:0] sidx );
|
task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,input [16:0] sidx );
|
||||||
begin
|
begin
|
||||||
txBuf[0] <= saddress[15:8];
|
txBuf[0] <= saddress[15:8];
|
||||||
txBuf[1] <= saddress[7:0];
|
txBuf[1] <= saddress[7:0];
|
||||||
@@ -660,13 +665,15 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
|
|||||||
|
|
||||||
if (scmd == 0) begin
|
if (scmd == 0) begin
|
||||||
addr_type = txBuf[_pos + 1] & 8'h3;
|
addr_type = txBuf[_pos + 1] & 8'h3;
|
||||||
dev = (txBuf[_pos] >> 2) * 256 + ((txBuf[_pos + 1] >> 2) & 8'hff);
|
dev = (txBuf[_pos] * 256) >> 2;
|
||||||
|
dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff);
|
||||||
addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff);
|
addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff);
|
||||||
cmd = (txBuf[_pos + 4] >> 4) & 8'h0f;
|
cmd = (txBuf[_pos + 4] >> 4) & 8'h0f;
|
||||||
len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff);
|
len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff);
|
||||||
end else begin
|
end else begin
|
||||||
addr_type = rxBuf[_pos + 1] & 8'h3;
|
addr_type = rxBuf[_pos + 1] & 8'h3;
|
||||||
dev = (rxBuf[_pos] >> 2) * 256 + ((rxBuf[_pos + 1] >> 2) & 8'hff);
|
dev = (txBuf[_pos] * 256) >> 2;
|
||||||
|
dev = dev + ((rxBuf[_pos + 1] >> 2) & 8'hff);
|
||||||
addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff);
|
addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff);
|
||||||
cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f;
|
cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f;
|
||||||
len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff);
|
len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff);
|
||||||
@@ -933,7 +940,7 @@ task wait_comm_finished(input [16:0] dev_idx);
|
|||||||
$display("error occur");
|
$display("error occur");
|
||||||
is_run = 0;
|
is_run = 0;
|
||||||
end
|
end
|
||||||
if (($realtime - st) >= 5000000.0)
|
if (($realtime - st) >= 20000000.0)
|
||||||
begin
|
begin
|
||||||
$display("comm timeout.");
|
$display("comm timeout.");
|
||||||
is_run = 0;
|
is_run = 0;
|
||||||
|
|||||||
@@ -557,7 +557,7 @@ end
|
|||||||
reg isBusy = 0;
|
reg isBusy = 0;
|
||||||
|
|
||||||
reg [11:0] length;
|
reg [11:0] length;
|
||||||
reg [7:0] idx;
|
reg [16:0] idx;
|
||||||
|
|
||||||
reg [11:0] transCnt;
|
reg [11:0] transCnt;
|
||||||
reg [11:0] byteCnt;
|
reg [11:0] byteCnt;
|
||||||
@@ -630,7 +630,7 @@ end
|
|||||||
|
|
||||||
//mst slv0~slv3的 内部qspi调用即设置
|
//mst slv0~slv3的 内部qspi调用即设置
|
||||||
//sidx为0~4;外部spi为5~9,外部qspi为10~15
|
//sidx为0~4;外部spi为5~9,外部qspi为10~15
|
||||||
task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,input [7:0] sidx );
|
task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,input [16:0] sidx );
|
||||||
begin
|
begin
|
||||||
txBuf[0] <= saddress[15:8];
|
txBuf[0] <= saddress[15:8];
|
||||||
txBuf[1] <= saddress[7:0];
|
txBuf[1] <= saddress[7:0];
|
||||||
@@ -692,13 +692,15 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
|
|||||||
|
|
||||||
if (scmd == 0) begin
|
if (scmd == 0) begin
|
||||||
addr_type = txBuf[_pos + 1] & 8'h3;
|
addr_type = txBuf[_pos + 1] & 8'h3;
|
||||||
dev = (txBuf[_pos] >> 2) * 256 + ((txBuf[_pos + 1] >> 2) & 8'hff);
|
dev = (txBuf[_pos] * 256) >> 2;
|
||||||
|
dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff);
|
||||||
addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff);
|
addr = txBuf[_pos + 2] * 256 + (txBuf[_pos + 3] & 8'hff);
|
||||||
cmd = (txBuf[_pos + 4] >> 4) & 8'h0f;
|
cmd = (txBuf[_pos + 4] >> 4) & 8'h0f;
|
||||||
len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff);
|
len = (txBuf[_pos + 4] & 8'h0f) * 256 + (txBuf[_pos + 5] & 8'hff);
|
||||||
end else begin
|
end else begin
|
||||||
addr_type = rxBuf[_pos + 1] & 8'h3;
|
addr_type = rxBuf[_pos + 1] & 8'h3;
|
||||||
dev = (rxBuf[_pos] >> 2) * 256 + ((rxBuf[_pos + 1] >> 2) & 8'hff);
|
dev = (txBuf[_pos] * 256) >> 2;
|
||||||
|
dev = dev + ((txBuf[_pos + 1] >> 2) & 8'hff);
|
||||||
addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff);
|
addr = rxBuf[_pos + 2] * 256 + (rxBuf[_pos + 3] & 8'hff);
|
||||||
cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f;
|
cmd = (rxBuf[_pos + 4] >> 4) & 8'h0f;
|
||||||
len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff);
|
len = (rxBuf[_pos + 4] & 8'h0f) * 256 + (rxBuf[_pos + 5] & 8'hff);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from pyutils import *
|
|||||||
from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac, manydev
|
from testcase import environment, rwregs, ebmmu, errorPkt, watchdog, broadcast, sync, base, mac, manydev
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
environment.gen_slv_dev_num(128)
|
environment.gen_slv_dev_num(202)
|
||||||
environment.bringup()
|
environment.bringup()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from pyutils import *
|
from pyutils import *
|
||||||
|
|
||||||
|
|
||||||
|
global_dev_num = 4
|
||||||
|
|
||||||
def bringup():
|
def bringup():
|
||||||
gen_file_def = "sys_bringup"
|
gen_file_def = "sys_bringup"
|
||||||
@@ -296,7 +296,16 @@ def __gen_slv_dev_predef(num):
|
|||||||
genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1)
|
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):
|
def gen_slv_dev_num(num):
|
||||||
|
global global_dev_num
|
||||||
|
|
||||||
|
global_dev_num = num
|
||||||
|
|
||||||
__gen_slv_dev_predef(num)
|
__gen_slv_dev_predef(num)
|
||||||
|
|
||||||
genPkt = GenPkt()
|
genPkt = GenPkt()
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
from pyutils import *
|
from pyutils import *
|
||||||
|
from .environment import *
|
||||||
|
|
||||||
def tc1():
|
def tc1():
|
||||||
genPkt = GenPkt()
|
genPkt = GenPkt()
|
||||||
|
|
||||||
dev = 128
|
dev = get_slv_dev_num()
|
||||||
|
print("DEV:", dev)
|
||||||
|
|
||||||
gen_file_def = "manydev_tc01"
|
gen_file_def = "manydev_tc01"
|
||||||
sm_idx = 0
|
sm_idx = 0
|
||||||
@@ -73,7 +74,7 @@ def tc1():
|
|||||||
+genWriteTransLenCode(gen_file_def_ap, sm_idx)
|
+genWriteTransLenCode(gen_file_def_ap, sm_idx)
|
||||||
+genWriteTransPktCode(gen_file_def_ap, sm_idx)
|
+genWriteTransPktCode(gen_file_def_ap, sm_idx)
|
||||||
+genTrgTransPktCode(gen_file_def_ap, sm_idx)
|
+genTrgTransPktCode(gen_file_def_ap, sm_idx)
|
||||||
+ "#10000000"
|
#+ "#10000000"
|
||||||
+genReadAckPktCode(gen_file_def_ap, sm_idx)
|
+genReadAckPktCode(gen_file_def_ap, sm_idx)
|
||||||
|
|
||||||
|
|
||||||
@@ -120,14 +121,70 @@ def tc1():
|
|||||||
genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx)
|
genPkt.addAfterExc(genWriteTransLenCode(gen_file_def_ap, sm_idx)
|
||||||
+genWriteTransPktCode(gen_file_def_ap, sm_idx)
|
+genWriteTransPktCode(gen_file_def_ap, sm_idx)
|
||||||
+genTrgTransPktCode(gen_file_def_ap, sm_idx)
|
+genTrgTransPktCode(gen_file_def_ap, sm_idx)
|
||||||
+ "#10000000"
|
#+ "#10000000"
|
||||||
+genReadAckPktCode(gen_file_def_ap, sm_idx)
|
+genReadAckPktCode(gen_file_def_ap, sm_idx)
|
||||||
|
|
||||||
+clear_int_code
|
+clear_int_code
|
||||||
|
)
|
||||||
|
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+"_step05"
|
||||||
|
sm_idx = 0
|
||||||
|
|
||||||
|
#for i in range(dev):
|
||||||
|
# genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0])
|
||||||
|
genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [8, 0])
|
||||||
|
genPkt.addSubPkt(0, 0, 0x800, 0xe, 8, list(range(8)))
|
||||||
|
|
||||||
|
read_data_code = ""
|
||||||
|
for i in range(dev):
|
||||||
|
read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 8)
|
||||||
|
|
||||||
|
#genPkt.addBeforeExc(prepare_data_code)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
+clear_int_code
|
||||||
|
+read_data_code
|
||||||
|
)
|
||||||
|
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+"_step06"
|
||||||
|
sm_idx = 0
|
||||||
|
|
||||||
|
#for i in range(dev):
|
||||||
|
# genPkt.addSubPkt(i + 1, 0, 0x1000, 0x0, 2, [0, 0])
|
||||||
|
genPkt.addSubPkt(0, 0, 0x302, 0xe, 2, [2, 0])
|
||||||
|
for i in range(dev):
|
||||||
|
genPkt.addSubPkt(i + 1, 0, 0x0800, 0x1, 2, [i & 0xff, (i + 1) & 0xff])
|
||||||
|
|
||||||
|
read_data_code = ""
|
||||||
|
for i in range(dev):
|
||||||
|
read_data_code = read_data_code + genSlvSMReadData(i + 1, 0, 2)
|
||||||
|
|
||||||
|
#genPkt.addBeforeExc(prepare_data_code)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
+clear_int_code
|
||||||
|
+read_data_code
|
||||||
|
|
||||||
+genTcEndFrameCode(gen_file_def)
|
+genTcEndFrameCode(gen_file_def)
|
||||||
)
|
)
|
||||||
genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap)
|
genPkt.gen("./generated/shin/%s.vh"%(gen_file_def, ), 1, True, gen_file_def_ap)
|
||||||
|
|
||||||
|
|
||||||
return gen_file_def
|
return gen_file_def
|
||||||
Reference in New Issue
Block a user