# Top Earlgrey

## Specification

The specification of Earlgrey is located [here](./doc/specification.md).

## Tool: TopGen

Top Earlgrey is being generated by the integration tool, topgen
(`util/topgen.py`). Please do not revise `rtl/top_earlgrey.sv`, the crossbar
modules, and the interrupt controller directly. Those files are auto-generated
and sit in the repository for browsing purpose.

### How to create top module

Top module `rtl/top_earlgrey.sv` is created by `topgen.py`. Current top module
is created with below command.

```console
../../util/topgen.py -t data/top_earlgrey.hjson -o . -v
```

It generates files below:

- `rtl/top_earlgrey.sv`: Top module generated from the template
    `data/top_earlgrey.sv.tpl` with the configuration file
    `data/top_earlgrey.hjson`
- `rtl/xbar_main.sv` and `rtl/tl_main_pkg.sv`: Crossbar module. As of now,
    earlgrey has only one main crossbar. tlgen library is used to generate
    these files.
- `rtl/rv_plic*.sv` and `data/rv_plic.hjson`: Interrupt controller module.
    `hw/ip/rv_plic/util/reg_rv_plic.py` tool is used to create RV_PLIC having
    the number of interrupts specified in the hjson.

### Adding new blocks into top level
Modify `data/top_earlgrey.hjson` to include new module
- If new block has interrupts, also add to the `interrupt_module` definition

Modify `xbar_main.hjson` for the host / device connectivity

### Modify configurations

Main configuration for Top Earlgrey is in `data/top_earlgrey.hjson`. The users
need to specify the list of peripherals, memories, crossbars, and the interrupts
in the configuration file. The tool then reads relevant information from the
each peripheral blocks' configuration. For instance, if `uart` module is used,
the tool reads `hw/ip/uart/data/uart{_reg}.hjson` and parses the information such
as input/output, the size of its register space, and interrupts.

For the memories, the tool utilizes the `type` and instantiates relevant modules
including the converter from TL-UL interface to the native interfaces (SRAM,
ROM, eFlash). The user only needs to describe the base address and the memory
size.

The crossbar should be defined in the separate file. Please take a look at
`data/xbar_main.hjson` as an example. In the top configuration, it needs to
define the xbar and the clock, then the tool calls tlgen library to create the
crossbar design. Please remind that the instance name in the crossbar and that
in the module field should be matched for topgen to create fields that tlgen
uses.

### Modify the template

Main top template file is `data/top_earlgrey.sv.tpl`. In most cases, it isn't
require to modify the template file. For instance, to add new IP into the top,
the user just needs to add the IP to the `module` field and revise the crossbar
connections in the crossbar configuration.

There might be some cases that needs to revise the template. As of now, a few
modules are hard-coded such as RISC-V core and the debug module. If any of these
modules need to be revised or some new modules not matching to the
comportability spec, it needs to be manually instantiated in the template file.
