# Copyright lowRISC contributors. # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 # # Lint as: python3 # """Generate FPV CSR read and write assertions from IpBlock """ import logging as log import os.path import yaml from mako import exceptions # type: ignore from mako.template import Template # type: ignore from pkg_resources import resource_filename from .ip_block import IpBlock def gen_fpv(block: IpBlock, outdir: str) -> int: # Read Register templates fpv_csr_tpl = Template( filename=resource_filename('reggen', 'fpv_csr.sv.tpl')) # Generate a module with CSR assertions for each device interface. For a # device interface with no name, we generate _csr_assert_fpv. For a # named interface, we generate __csr_assert_fpv. lblock = block.name.lower() generated = [] for if_name, rb in block.reg_blocks.items(): if not rb.flat_regs: # No registers to check! continue if if_name is None: mod_base = lblock else: mod_base = lblock + '_' + if_name.lower() mod_name = mod_base + '_csr_assert_fpv' filename = mod_name + '.sv' generated.append(filename) reg_top_path = os.path.join(outdir, filename) with open(reg_top_path, 'w', encoding='UTF-8') as fout: try: fout.write(fpv_csr_tpl.render(block=block, mod_base=mod_base, if_name=if_name, rb=rb)) except: # noqa F722 for template Exception handling log.error(exceptions.text_error_template().render()) return 1 # Generate a fusesoc core file that points at the files we've just # generated. core_data = { 'name': "lowrisc:fpv:{}_csr_assert".format(lblock), 'filesets': { 'files_dv': { 'depend': [ "lowrisc:tlul:headers", "lowrisc:prim:assert", ], 'files': generated, 'file_type': 'systemVerilogSource' }, }, 'targets': { 'default': { 'filesets': [ 'files_dv', ], }, }, } core_file_path = os.path.join(outdir, lblock + '_csr_assert_fpv.core') with open(core_file_path, 'w') as core_file: core_file.write('CAPI=2:\n') yaml.dump(core_data, core_file, encoding='utf-8') return 0