Files
lab-rv32i-asm-blinker/tests/reference_model.py
T

50 lines
1.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""Independent golden models for L03; no RTL implementation is imported."""
import sys
def task01() -> None:
counter = 0
previous = 0
pulses = 0
consecutive = 0
for _ in range(16):
enable = int(counter == 3)
counter = 0 if enable else counter + 1
pulses += enable
consecutive += int(enable and previous)
previous = enable
assert (pulses, consecutive, counter) == (4, 0, 0)
print("PASS task01 pulses=4 consecutive=0 final_count=0")
def task02() -> None:
sequence = []
counter = 0
for _ in range(16):
counter = (counter + 1) & 0xF
sequence.append((counter >> 2) & 1)
edges = [index + 1 for index in range(16) if sequence[index] != (sequence[index - 1] if index else 0)]
assert edges == [4, 8, 12, 16]
print("PASS task02 led_edges=4,8,12,16 period=8")
def task03() -> None:
pattern = [0x1, 0x2, 0x4, 0x8, 0x8, 0x4, 0x2, 0x1]
observed = [pattern[index & 7] for index in range(10)]
assert observed == [1, 2, 4, 8, 8, 4, 2, 1, 1, 2]
print("PASS task03 pattern=1,2,4,8,8,4,2,1 wrap=1,2")
TASKS = {
"task01_clock_enable": task01,
"task02_counter_blinker": task02,
"task03_pattern_rom": task03,
}
if len(sys.argv) != 2 or sys.argv[1] not in TASKS:
raise SystemExit(f"usage: {sys.argv[0]} {'|'.join(TASKS)}")
TASKS[sys.argv[1]]()