crc_tb:
$(CC) $(CFLAGS) $(INC) -o crc crc.c
- ./crc /> crc_ref
$(CMD) crc_tb.py
scrambler_tb:
$(CC) $(CFLAGS) $(INC) -o scrambler scrambler.c
- ./scrambler /> scrambler_ref
$(CMD) scrambler_tb.py
+all: crc_tb scrambler_tb
+
clean:
- rm crc crc_ref scrambler scrambler_ref
+ rm crc scrambler
--- /dev/null
+def check(ref, res):
+ shift = 0
+ while((ref[0] != res[0]) and (len(res)>1)):
+ res.pop(0)
+ shift += 1
+ length = min(len(ref), len(res))
+ errors = 0
+ for i in range(length):
+ if ref.pop(0) != res.pop(0):
+ errors += 1
+ return shift, length, errors
crc = 0x52325032;
data_count = 0;
- while (data_count < 256) {
+ while (data_count < 65536) {
data_count++;
crc ^= data_in;
-from subprocess import check_output
+import subprocess
from migen.fhdl.std import *
from lib.sata.std import *
from lib.sata.link.crc import *
-
-def check(ref, res):
- shift = 0
- while((ref[0] != res[0]) and (len(res)>1)):
- res.pop(0)
- shift += 1
- length = min(len(ref), len(res))
- errors = 0
- for i in range(length):
- if ref.pop(0) != res.pop(0):
- errors += 1
- return shift, length, errors
+from lib.sata.link.test.common import check
class TB(Module):
- def __init__(self):
+ def __init__(self, length):
self.submodules.crc = SATACRC()
+ self.length = length
def gen_simulation(self, selfp):
-
# init CRC
selfp.crc.d = 0x12345678
selfp.crc.ce = 1
selfp.crc.reset = 0
# get C code results
- ref = []
- f = open("crc_ref", "r")
- for l in f:
- ref.append(int(l, 16))
- f.close()
+ p = subprocess.Popen(["./crc"], stdout=subprocess.PIPE)
+ out, err = p.communicate()
+ ref = [int(e, 16) for e in out.decode("utf-8").split("\n")[:-1]]
+
# log results
res = []
- for i in range(256):
+ for i in range(self.length):
res.append(selfp.crc.value)
yield
if __name__ == "__main__":
from migen.sim.generic import run_simulation
- run_simulation(TB(), ncycles=1000, vcd_name="my.vcd", keep_files=True)
+ length = 8192
+ run_simulation(TB(length), ncycles=length+100, vcd_name="my.vcd", keep_files=True)
unsigned char next[32];
context = 0xF0F6;
- for (i = 0; i < 256; ++i) {
+ for (i = 0; i < 65536; ++i) {
for (j = 0; j < 16; ++j) {
now[j] = (context >> j) & 0x01;
}
-from subprocess import check_output
+import subprocess
from migen.fhdl.std import *
from lib.sata.std import *
from lib.sata.link.scrambler import *
-
-def check(ref, res):
- shift = 0
- while((ref[0] != res[0]) and (len(res)>1)):
- res.pop(0)
- shift += 1
- length = min(len(ref), len(res))
- errors = 0
- for i in range(length):
- if ref.pop(0) != res.pop(0):
- errors += 1
- return shift, length, errors
+from lib.sata.link.test.common import check
class TB(Module):
- def __init__(self):
+ def __init__(self, length):
self.submodules.scrambler = SATAScrambler()
+ self.length = length
def gen_simulation(self, selfp):
-
# init CRC
selfp.scrambler.ce = 1
selfp.scrambler.reset = 1
selfp.scrambler.reset = 0
# get C code results
- ref = []
- f = open("scrambler_ref", "r")
- for l in f:
- ref.append(int(l, 16))
- f.close()
+ p = subprocess.Popen(["./scrambler"], stdout=subprocess.PIPE)
+ out, err = p.communicate()
+ ref = [int(e, 16) for e in out.decode("utf-8").split("\n")[:-1]]
# log results
yield
res = []
- for i in range(256):
+ for i in range(self.length):
res.append(selfp.scrambler.value)
yield
- for e in res:
- print("%08x" %e)
# check results
s, l, e = check(ref, res)
if __name__ == "__main__":
from migen.sim.generic import run_simulation
- run_simulation(TB(), ncycles=1000, vcd_name="my.vcd", keep_files=True)
+ length = 8192
+ run_simulation(TB(length), ncycles=length+100, vcd_name="my.vcd", keep_files=True)