blob: b01965692ff9cc945a595953d8c997ddc3491fb0 [file] [log] [blame] [view]
# Top Generation Tool
The top generation tool `topgen.py` is used to build top specific modules for a specific OpenTitan design - for example [`top_earlgrey`](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey).
Currently, as part of this generation process, the following top specific modules are created
* Overall top module
* Platform level interrupt controller
* Pinmux
* Crossbar
This document explains the overall generation process, the required inputs, the output locations, as well as how the tool should be invoked.
## Generation Process
### Overview
The details of a particular OpenTitan variant is described in a top specific Hjson file.
For example see [`top_earlgrey`](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/data/top_earlgrey.hjson).
The top specific Hjson describes how the design looks and how it should connect, for example:
* Overall fabric data width
* Clock sources
* Reset sources
* List of instantiated peripherals
* Module type of each peripheral (it is possible to have multiple instantiations of a particular module)
* Clock / reset connectivity of each peripheral
* Base address of each peripheral
* System memories
* Fabric construction
* Clock / reset connectivity of each fabric component
* Interrupt sources
* Pinmux construction
* List of dedicated or muxed pins
The top level Hjson however, does not contain details such as:
* Specific clock / reset port names for each peripheral
* Number of interrupts in each peripheral
* Number of input or output pins in each peripheral
* Details of crossbar connection and which host can reach which device
The topgen tool thus hierarchically gathers and generates the missing information from additional Hjson files that describe the detail of each component.
These are primarily located in two places:
* `hw/ip/data/*.hjson`
* `hw/top_*/data/xbar_*.hjson`
In the process of gathering, each individual Hjson file is validated for input correctness and then merged into a final generated Hjson output that represents the complete information that makes up each OpenTitan design.
For example, see [`top_earlgrey`](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson).
Note specifically the generated interrupt list, the pinmux connections, and the port-to-net mapping of clocks and resets, all of which were not present in the original input.
The purpose for this two step process, instead of describing the design completely inside one Hjson file, is to decouple the top and components development while allowing re-use of components by multiple tops.
This process also clearly separates what information needs to be known by top vs what needs to be known by a specific component.
For example, a component does not need to know how many clock sources a top has or how many muxed pins it contains.
Likewise, the top does not need to know the details of why an interrupt is generated, just how many there are.
The user supplied `top_*.hjson` thus acts like a integration specification while the remaining details are filled in through lower level inputs.
In addition to design collateral, the tool also generates all the top level RAL (Register Abstraction Layer) models necessary for verification.
### Validation, Merge and Output
As stated previously, each of the gathered component Hjson files is validated for correctness.
For the peripherals, this is done by invoking `util/reggen/validate.py`, while the xbar components are validated through `util/tlgen/validate.py`.
The peripheral and xbar components are then validated through `topgen/validate.py`, which checks for interrupt, pinmux, clock and reset consistency.
Once all validation is passed, the final Hjson is created.
This Hjson is then used to generate the final top RTL.
As part of this process, topgen invokes other tools, please see the documentation for [`reggen`](../reggen/README.md) and [`tlgen`](../tlgen/README.md) for more tool specific details.
## Usage
The most generic use of topgen is to let it generate everything.
This can be done through direct invocation, or the `${REPO_TOP}/hw` makefile.
The example below shows the latter:
```console
$ cd ${REPO_TOP}
$ make -C hw top
```
It is possible to restrict what the tool should generate.
```console
$ cd ${REPO_TOP}
$ ./util/topgen.py -h
usage: topgen [-h] --topcfg TOPCFG [--outdir OUTDIR] [--verbose] [--no-top]
[--no-xbar] [--no-plic] [--no-gen-hjson] [--top-only] [--xbar-only]
[--plic-only] [--hjson-only] [--top_ral]
optional arguments:
-h, --help show this help message and exit
--topcfg TOPCFG, -t TOPCFG
`top_{name}.hjson` file.
--outdir OUTDIR, -o OUTDIR
Target TOP directory. Module is created under rtl/. (default:
dir(topcfg)/..)
--verbose, -v Verbose
--no-top If defined, topgen doesn't generate top_{name} RTLs.
--no-xbar If defined, topgen doesn't generate crossbar RTLs.
--no-plic If defined, topgen doesn't generate the interrup controller RTLs.
--no-gen-hjson If defined, the tool assumes topcfg as a generated hjson. So it
bypasses the validation step and doesn't read ip and xbar
configurations
--top-only If defined, the tool generates top RTL only
--xbar-only If defined, the tool generates crossbar RTLs only
--plic-only If defined, the tool generates RV_PLIC RTL and Hjson only
--hjson-only If defined, the tool generates complete Hjson only
--top_ral, -r If set, the tool generates top level RAL model for DV
```