|  | #!/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( | 
|  | "-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>')""" | 
|  | ) | 
|  |  | 
|  | args = parser.parse_args() | 
|  | if args.agent_outdir == "name": args.agent_outdir = args.name | 
|  | if args.env_outdir == "name": args.env_outdir = args.name | 
|  |  | 
|  | 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_interrupts, \ | 
|  | args.has_alerts, \ | 
|  | args.env_agents, \ | 
|  | args.env_outdir) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |