test bist at high speed(working)
This commit is contained in:
parent
46b2d02783
commit
38d3f3697b
|
@ -27,9 +27,9 @@ class SATABIST(Module):
|
||||||
fsm.act("IDLE",
|
fsm.act("IDLE",
|
||||||
self.done.eq(1),
|
self.done.eq(1),
|
||||||
counter.reset.eq(1),
|
counter.reset.eq(1),
|
||||||
|
If(self.start,
|
||||||
self.ctrl_error_counter.reset.eq(1),
|
self.ctrl_error_counter.reset.eq(1),
|
||||||
self.data_error_counter.reset.eq(1),
|
self.data_error_counter.reset.eq(1),
|
||||||
If(self.start,
|
|
||||||
NextState("SEND_WRITE_CMD_AND_DATA")
|
NextState("SEND_WRITE_CMD_AND_DATA")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -268,29 +268,63 @@ class CommandGenerator(Module, AutoCSR):
|
||||||
class BIST(Module, AutoCSR):
|
class BIST(Module, AutoCSR):
|
||||||
def __init__(self, sata_con, sector_size):
|
def __init__(self, sata_con, sector_size):
|
||||||
self._start = CSR()
|
self._start = CSR()
|
||||||
self._sector = CSRStorage(48)
|
self._stop = CSR()
|
||||||
self._count = CSRStorage(4)
|
|
||||||
self._done = CSRStatus()
|
|
||||||
|
|
||||||
|
self._sector = CSRStatus(48)
|
||||||
self._ctrl_errors = CSRStatus(32)
|
self._ctrl_errors = CSRStatus(32)
|
||||||
self._data_errors = CSRStatus(32)
|
self._data_errors = CSRStatus(32)
|
||||||
|
|
||||||
|
check_prepare = Signal()
|
||||||
|
sector = self._sector.status
|
||||||
|
ctrl_errors = self._ctrl_errors.status
|
||||||
|
data_errors = self._data_errors.status
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
self.sata_bist = SATABIST(sector_size)
|
self.sata_bist = SATABIST(sector_size)
|
||||||
self.comb += [
|
self.comb += [
|
||||||
Record.connect(self.sata_bist.source, sata_con.sink),
|
|
||||||
Record.connect(sata_con.source, self.sata_bist.sink),
|
Record.connect(sata_con.source, self.sata_bist.sink),
|
||||||
|
Record.connect(self.sata_bist.source, sata_con.sink)
|
||||||
self.sata_bist.start.eq(self._start.r & self._start.re),
|
|
||||||
self.sata_bist.sector.eq(self._sector.storage),
|
|
||||||
self.sata_bist.count.eq(self._count.storage),
|
|
||||||
self._done.status.eq(self.sata_bist.done),
|
|
||||||
|
|
||||||
self._ctrl_errors.status.eq(self.sata_bist.ctrl_errors),
|
|
||||||
self._data_errors.status.eq(self.sata_bist.data_errors),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
self.fsm = fsm = FSM(reset_state="IDLE")
|
||||||
|
|
||||||
|
self.comb += [
|
||||||
|
self.sata_bist.sector.eq(sector),
|
||||||
|
self.sata_bist.count.eq(4)
|
||||||
|
]
|
||||||
|
|
||||||
|
# FSM
|
||||||
|
fsm.act("IDLE",
|
||||||
|
If(self._start.r & self._start.re,
|
||||||
|
NextState("START")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
fsm.act("START",
|
||||||
|
self.sata_bist.start.eq(1),
|
||||||
|
NextState("WAIT_DONE")
|
||||||
|
)
|
||||||
|
fsm.act("WAIT_DONE",
|
||||||
|
If(self.sata_bist.done,
|
||||||
|
NextState("CHECK_PREPARE")
|
||||||
|
).Elif(self._stop.r & self._stop.re,
|
||||||
|
NextState("IDLE")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
fsm.act("CHECK_PREPARE",
|
||||||
|
check_prepare.eq(1),
|
||||||
|
NextState("START")
|
||||||
|
)
|
||||||
|
|
||||||
|
self.sync += [
|
||||||
|
If(check_prepare,
|
||||||
|
ctrl_errors.eq(ctrl_errors + self.sata_bist.ctrl_errors),
|
||||||
|
data_errors.eq(data_errors + self.sata_bist.data_errors),
|
||||||
|
sector.eq(sector+4)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class TestDesign(UART2WB, AutoCSR):
|
class TestDesign(UART2WB, AutoCSR):
|
||||||
default_platform = "kc705"
|
default_platform = "kc705"
|
||||||
csr_map = {
|
csr_map = {
|
||||||
|
|
|
@ -2,24 +2,21 @@ import time
|
||||||
from config import *
|
from config import *
|
||||||
from tools import *
|
from tools import *
|
||||||
|
|
||||||
|
sector_size = 512
|
||||||
|
|
||||||
wb.open()
|
wb.open()
|
||||||
regs = wb.regs
|
regs = wb.regs
|
||||||
###
|
###
|
||||||
i = 0
|
regs.bist_start.write(1)
|
||||||
data_errors = 0
|
last_sector = 0
|
||||||
ctrl_errors = 0
|
|
||||||
while True:
|
while True:
|
||||||
regs.bist_sector.write(i)
|
time.sleep(1)
|
||||||
regs.bist_count.write(4)
|
sector = regs.bist_sector.read()
|
||||||
regs.bist_start.write(1)
|
n_sectors = sector - last_sector
|
||||||
while (regs.bist_done.read() != 1):
|
last_sector = sector
|
||||||
time.sleep(0.01)
|
n_bytes = n_sectors*sector_size*4*2
|
||||||
data_errors += regs.bist_data_errors.read()
|
ctrl_errors = regs.bist_ctrl_errors.read()
|
||||||
ctrl_errors += regs.bist_ctrl_errors.read()
|
data_errors = regs.bist_data_errors.read()
|
||||||
if i%10 == 0:
|
print("%04d MB/s / data_errors %08d / ctrl_errors %08d " %(n_bytes/(1024*1024), data_errors, ctrl_errors))
|
||||||
print("sector %08d / data_errors %0d / ctrl_errors %d " %(i, data_errors, ctrl_errors))
|
|
||||||
data_errors = 0
|
|
||||||
ctrl_errors = 0
|
|
||||||
i += 1
|
|
||||||
###
|
###
|
||||||
wb.close()
|
wb.close()
|
||||||
|
|
Loading…
Reference in New Issue