Coverage Packages

All coverage packages should be extended from _coverage.CoverPackage.

In the constructor the user must declare the variables to be sampled and create the AVL Coverage Groups, Points and Crosses.

The user can use the global _isa.ISA dictionary and _isa.Encoding class to declare the bins.

Once delcared an instance of the class must be added to the _coverage.COVERPACKAGES list. As this is called later, Extensions can be used to filter.

import avl
from avl_riscv_coverage._coverage import COVERPACKAGES, CoverPackage
from avl_riscv_coverage._isa import ISA
from avl_riscv_coverage._trace import Trace


class Opcodes(CoverPackage):

    def __init__(self) -> None:
        super().__init__("Opcodes")

        self.mnemonic = None
        self.cg = avl.Covergroup("opcodes", None)
        cp = self.cg.add_coverpoint("opcode", lambda: self.mnemonic)

        for k in ISA.keys():
            if k is not None:
                cp.add_bin(k, lambda x,k=k: x == k)

    def sample(self, trace : Trace) -> None:
        self.mnemonic = trace.instr.encoding.mnemonic
        if self.mnemonic is not None:
            self.cg.sample()

COVERPACKAGES.append(Opcodes())

Adding Coverage

The user can add –packages to the command line to add directories to the list of included coverage packages

avl_riscv_coverage --packages dir1 --packages dir2

All python files in the provided directories will be includes.