| #!/usr/bin/env python3 |
| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| r"""Command-line tool to autogenerate boilerplate DV testbench code extended from dv_lib / cip_lib |
| """ |
| import argparse |
| import os |
| import sys |
| |
| from uvmdvgen import gen_agent, gen_env |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description=__doc__, |
| formatter_class=argparse.RawDescriptionHelpFormatter) |
| parser.add_argument( |
| "name", |
| metavar="[ip/block name]", |
| help="Name of the ip/block for which the UVM TB is being auto-generated" |
| ) |
| |
| parser.add_argument( |
| "-a", |
| "--gen_agent", |
| action='store_true', |
| help="Generate UVM agent code extended from DV library") |
| |
| parser.add_argument( |
| "-s", |
| "--has_separate_host_device_driver", |
| action='store_true', |
| help= |
| """IP / block agent creates a separate driver for host and device modes. |
| (ignored if -a switch is not passed)""") |
| |
| parser.add_argument("-e", |
| "--gen_env", |
| action='store_true', |
| help="Generate testbench UVM env code") |
| |
| parser.add_argument( |
| "-c", |
| "--is_cip", |
| action='store_true', |
| help= |
| """Is comportable IP - this will result in code being extended from CIP |
| library. If switch is not passed, then the code will be extended from |
| DV library instead. (ignored if -e switch is not passed)""" |
| ) |
| |
| parser.add_argument( |
| "-hr", |
| "--has_ral", |
| default=False, |
| action='store_true', |
| help="""Specify whether the DUT has CSRs and thus needs a UVM RAL model. |
| This option is required if either --is_cip or --has_interrupts are |
| enabled.""") |
| |
| parser.add_argument( |
| "-hi", |
| "--has_interrupts", |
| default=False, |
| action='store_true', |
| help="""CIP has interrupts. Create interrupts interface in tb""") |
| |
| parser.add_argument( |
| "-ha", |
| "--has_alerts", |
| default=False, |
| action='store_true', |
| help="""CIP has alerts. Create alerts interface in tb""") |
| |
| parser.add_argument( |
| "-ea", |
| "--env_agents", |
| nargs="+", |
| metavar="agt1 agt2", |
| help="""Env creates an interface agent specified here. They are |
| assumed to already exist. Note that the list is space-separated, |
| and not comma-separated. (ignored if -e switch is not passed)""" |
| ) |
| |
| parser.add_argument( |
| "-ao", |
| "--agent_outdir", |
| default="name", |
| metavar="[hw/dv/sv]", |
| help="""Path to place the agent code. A directory called <name>_agent is |
| created at this location. (default set to './<name>')""" |
| ) |
| |
| parser.add_argument( |
| "-eo", |
| "--env_outdir", |
| default="name", |
| metavar="[hw/ip/<ip>]", |
| help= |
| """Path to place the full tetsbench code. It creates 3 directories - dv, data and doc. |
| The DV plan and the testplan Hjson files are placed in the doc and data directories |
| respectively. These are to be merged into the IP's root directory (with the existing |
| data and doc directories). Under dv, it creates 3 sub-directories - env, |
| tb and tests to place all of the testbench sources. (default set to './<name>')""" |
| ) |
| |
| parser.add_argument( |
| "-m", |
| "--add-makefile", |
| default=False, |
| action='store_true', |
| help= |
| """Tests are now run with dvsim.py tool that requires a hjson based sim cfg. |
| Setting this option will also result in the Makefile to be auto-generated (which is |
| the older way of building and running sims going through deprecation).""" |
| ) |
| |
| args = parser.parse_args() |
| if args.agent_outdir == "name": args.agent_outdir = args.name |
| if args.env_outdir == "name": args.env_outdir = args.name |
| |
| """ The has_ral option must be set if either is_cip or has_interrupts is set, |
| as both require use of a RAL model. As such, it is disallowed to not have |
| has_ral set if one of these options is set.""" |
| if not args.has_ral: |
| args.has_ral = args.is_cip or args.has_interrupts |
| |
| if args.gen_agent: |
| gen_agent.gen_agent(args.name, \ |
| args.has_separate_host_device_driver, \ |
| args.agent_outdir) |
| |
| if args.gen_env: |
| if not args.env_agents: args.env_agents = [] |
| gen_env.gen_env(args.name, \ |
| args.is_cip, \ |
| args.has_ral, \ |
| args.has_interrupts, \ |
| args.has_alerts, \ |
| args.env_agents, \ |
| args.env_outdir, \ |
| args.add_makefile) |
| |
| |
| if __name__ == '__main__': |
| main() |