Source code for piel.tools.amaranth.verify

import amaranth as am
from amaranth.sim import Simulator, Delay
import types
from typing import Literal

from ...project_structure import get_module_folder_type_location
from ...file_system import return_path
from ...types import PathTypes

__all__ = ["verify_truth_table"]


[docs]def verify_truth_table( truth_table_amaranth_module: am.Elaboratable, truth_table_dictionary: dict, inputs: list, outputs: list, vcd_file_name: str, target_directory: PathTypes, implementation_type: Literal[ "combinatorial", "sequential", "memory" ] = "combinatorial", ): """ We will implement a function that tests the module to verify that the outputs generates match the truth table provided. TODO Implement a similar function from the openlane netlist too. TODO unclear they can implement verification without it being in a synchronous simulation. """ def verify_logic(): """ This function implements the logic verification specifically. """ input_port_signal = getattr(truth_table_amaranth_module, inputs[0]).eq output_port_signal = getattr(truth_table_amaranth_module, outputs[0]) i = 0 for input_value_i in truth_table_dictionary[inputs[0]]: # Iterate over the input value array and test every specific array. # Test against the output signal value in each clock cycle. yield input_port_signal(int(input_value_i)) yield output_port_signal # Check that the output signal matches the design signal. # print(dir(output_port_signal)) # print(output_port_signal.matches(0)) # print(int(truth_table_dictionary[outputs[0]][i])) # assert output_port_signal == int(truth_table_dictionary[outputs[0]][i]) yield Delay(1e-6) # in a combinatorial simulation. i += 1 # Determine the output data files directory if isinstance(target_directory, types.ModuleType): # If the path follows the structure of a `piel` path. target_directory = get_module_folder_type_location( module=target_directory, folder_type="digital_testbench" ) else: # If not then just append the right path. target_directory = return_path(target_directory) # Set up synchronous simulation as I think it's necessary even for a combinatorial component as of 21/Ago/2023 simulation = Simulator(truth_table_amaranth_module) simulation.add_process(verify_logic) if implementation_type == "synchronous": simulation.add_clock(1e-6) # 1 MHz simulation.add_sync_process(truth_table_amaranth_module) elif implementation_type == "combinatorial": # TODO pass # Generate vcd outputs to verify? # TODO see how to generate a panads table from this accordingly. output_vcd_file = target_directory / vcd_file_name with simulation.write_vcd(str(output_vcd_file)): simulation.run()
# TODO can we access inside here to generate a Pandas version.