82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
|
# 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 <block>_csr_assert_fpv. For a
|
||
|
# named interface, we generate <block>_<ifname>_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
|