# Register generator `reggen` and `regtool`

The utility script `regtool.py` and collateral under `reggen` are Python
tools to read register descriptions in Hjson and generate various output
formats. The tool can output HTML documentation, standard JSON, compact
standard JSON (whitespace removed) and Hjson.  The example commands assume
`$REPO_TOP` is set to the toplevel directory of the repository.

### Setup

If packages have not previously been installed you will need to set a
few things up. First use `pip3` to install some required packages:

```console
$ pip3 install --user hjson
$ pip3 install --user mistletoe
$ pip3 install --user mako
```

### Register JSON Format

For details on the register JSON format, see the
[register tool documentation](../README.md).
To ensure things stay up to date, the register JSON format information
is documented by the tool itself.
The documentation can be generated by running the following commands:

```sh
$REPO_TOP/util/site/build-docs.sh
```

Under the hood, one of the mdbook preprocessors (`./util/mdbook_reggen.py`) uses the `reggen` to generate register tables in the documentation.

### Examples using standalone regtool

Normally for documentation the `mdbook_reggen.py` will automatically
use `reggen`. The script `regtool.py` provides a standalone way to run
`reggen`. See the
[register tool documentation](../README.md)
for details about how to invoke the tool.

The following shows an example of how to generate RTL from a register
description:

```console
$ cd $REPO_TOP/util
$ mkdir /tmp/rtl
$ ./regtool.py -r -t /tmp/rtl ../hw/ip/uart/data/uart.hjson
$ ls /tmp/rtl
    uart_reg_pkg.sv   uart_reg_top.sv
```

The following shows an example of how to generate a DV UVM class from
a register description:

```console
$ cd $REPO_TOP/util
$ mkdir /tmp/dv
$ ./regtool.py -s -t /tmp/dv ../hw/ip/uart/data/uart.hjson
$ ls /tmp/dv
    uart_ral_pkg.sv
```

By default, the generated block, register and field models are derived from
`dv_base_reg` classes provided at `hw/dv/sv/dv_base_reg`. If required, the user
can supply the `--dv-base-names block:type:entity-name` switch to have the models
derive from a custom, user-defined RAL classes instead:

```console
$ cd $REPO_TOP/util
$ mkdir /tmp/dv
$ ./regtool.py -s -t /tmp/dv ../hw/ip/uart/data/uart.hjson \
  --dv-base-names block:type:entity-name
$ ls /tmp/dv
    uart_ral_pkg.sv
```

This makes the following assumptions:
- A FuseSoC core file aggregating the `my_base` RAL classes with the VLNV
  name `lowrisc:dv:my_base_reg` is provided in the cores search path.
- These custom classes are derived from the corresponding `dv_base_reg` classes
  and have the following names:
  - `my_base_reg_pkg.sv`: The RAL package that includes the below sources
  - `my_base_reg_block.sv`: The register block abstraction
  - `my_base_reg.sv`: The register abstraction
  - `my_base_reg_field.sv`: The register field abstraction
  - `my_base_mem.sv`: The memory abstraction
- If any of the above class specializations is not needed, it can be
  `typedef`'ed in `my_base_reg_pkg`:
  ```systemverilog
  package my_base_reg_pkg;
    import dv_base_reg_pkg::*;
    typedef dv_base_reg_field my_base_reg_field;
    typedef dv_base_mem my_base_mem;
    `include "my_base_reg.sv"
    `include "my_base_reg_block.sv"
  endpackage
  ```

The following shows an example of how to generate a FPV csr read write assertion
module from a register description:

```console
$ cd $REPO_TOP/util
$ mkdir /tmp/fpv/vip
$ ./regtool.py -f -t /tmp/fpv/vip ../hw/ip/uart/data/uart.hjson
$ ls /tmp/fpv
    uart_csr_assert_fpv.sv
```

If the target directory is not specified, the tool creates the DV file
under the `hw/ip/{module}/dv/` directory.
