File size: 2,645 Bytes
4344b33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# tests/test_protocols.py — Tests for protocol library

from __future__ import annotations

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))

from src.generation.protocols import ProtocolLibrary


def test_protocol_library_available():
    lib = ProtocolLibrary()
    protocols = lib.list_available()
    assert "uart" in protocols
    assert "spi" in protocols
    assert "i2c" in protocols
    assert "axi4lite" in protocols
    assert "apb" in protocols
    assert "wishbone" in protocols


def test_uart_protocol():
    lib = ProtocolLibrary()
    uart = lib.load("uart")
    assert uart["protocol"] == "uart"
    signals = lib.get_signals("uart")
    names = {s["name"] for s in signals}
    assert "srx" in names
    assert "stx" in names
    registers = lib.get_registers("uart")
    reg_names = {r["name"] for r in registers}
    assert "LCR" in reg_names
    assert "LSR" in reg_names
    body = lib.get_sequence_body("uart")
    assert "drv.write_reg" in body


def test_spi_protocol():
    lib = ProtocolLibrary()
    spi = lib.load("spi")
    assert spi["protocol"] == "spi"
    signals = lib.get_signals("spi")
    names = {s["name"] for s in signals}
    assert "sclk" in names
    assert "mosi" in names
    assert "miso" in names
    assert "ss_n" in names


def test_i2c_protocol():
    lib = ProtocolLibrary()
    i2c = lib.load("i2c")
    assert i2c["protocol"] == "i2c"
    signals = lib.get_signals("i2c")
    names = {s["name"] for s in signals}
    assert "scl" in names
    assert "sda" in names


def test_axi4lite_protocol():
    lib = ProtocolLibrary()
    axi = lib.load("axi4lite")
    assert axi["protocol"] == "axi4lite"
    signals = lib.get_signals("axi4lite")
    names = {s["name"] for s in signals}
    assert "awvalid" in names
    assert "awready" in names
    assert "wdata" in names
    assert "rdata" in names
    assert "bresp" in names


def test_protocol_library_cache():
    lib = ProtocolLibrary()
    p1 = lib.load("uart")
    p2 = lib.load("uart")
    assert p1 is p2  # same object from cache


def test_protocol_coverage_templates():
    lib = ProtocolLibrary()
    for proto in lib.list_available():
        coverage = lib.get_coverage(proto)
        assert len(coverage) >= 1, f"{proto} should have at least 1 coverage item"
        assert coverage[0]["type"] == "covergroup"


def test_protocol_config_parameters():
    lib = ProtocolLibrary()
    params = lib.get_config_parameters("uart")
    param_names = {p["name"] for p in params}
    assert "DATA_BITS" in param_names
    assert "STOP_BITS" in param_names
    assert "PARITY" in param_names