blob: 446e94151ef5a7a5e759269d560d7d69f74c0c6c [file] [log] [blame] [view]
---
title: "Top Earlgrey"
---
## Specification
The specification of Earlgrey is located [here]({{< relref "doc" >}}).
## 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.