add test_bist with mila
[litex.git] / test / test_bist.py
1 import time
2 import argparse
3 from config import *
4
5 sector_size = 512
6
7 class SATABISTDriver:
8 def __init__(self, regs):
9 self.regs = regs
10 self.last_sector = 0
11 self.last_time = time.time()
12 self.last_errors = 0
13 self.mode = "rw"
14
15 def set_mode(self, mode):
16 self.mode = mode
17 self.regs.bist_write_only.write(0)
18 self.regs.bist_read_only.write(0)
19 if mode == "wr":
20 self.regs.bist_write_only.write(1)
21 if mode == "rd":
22 self.regs.bist_read_only.write(1)
23
24 def start(self, sector, count, mode):
25 self.set_mode(mode)
26 self.regs.bist_start_sector.write(sector)
27 self.regs.bist_count.write(count)
28 self.regs.bist_stop.write(0)
29 self.regs.bist_start.write(1)
30
31 def stop(self):
32 self.regs.bist_stop.write(1)
33
34 def show_status(self):
35 errors = self.regs.bist_errors.read() - self.last_errors
36 self.last_errors += errors
37
38 sector = self.regs.bist_sector.read()
39 n = sector - self.last_sector
40 self.last_sector = sector
41
42 t = self.last_time - time.time()
43 self.last_time = time.time()
44
45 if self.mode in ["wr", "rd"]:
46 speed_mult = 1
47 else:
48 speed_mult = 2
49 print("%4.2f MB/sec errors=%d sector=%d" %(n*sector_size*speed_mult/(1024*1024), errors, sector))
50
51
52 def _get_args():
53 parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
54 description="""\
55 SATA BIST utility.
56 """)
57 parser.add_argument("-s", "--sector", default=0, help="BIST start sector")
58 parser.add_argument("-c", "--count", default=4, help="BIST count (number of sectors per transaction)")
59 parser.add_argument("-m", "--mode", default="rw", help="BIST mode (rw, wr, rd")
60
61 return parser.parse_args()
62
63 if __name__ == "__main__":
64 args = _get_args()
65 wb.open()
66 ###
67 bist = SATABISTDriver(wb.regs)
68 try:
69 bist.start(int(args.sector), int(args.count), args.mode)
70 while True:
71 bist.show_status()
72 time.sleep(1)
73 except KeyboardInterrupt:
74 pass
75 bist.stop()
76 ###
77 wb.close()