[doc] Add doc for topgen
diff --git a/doc/rm/topgen_tool.md b/doc/rm/topgen_tool.md
new file mode 100644
index 0000000..380d099
--- /dev/null
+++ b/doc/rm/topgen_tool.md
@@ -0,0 +1,111 @@
+{{% lowrisc-doc-hdr 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.
+
+{{% toc 3 }}
+
+## 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/doc/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 instantitations 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_*/doc/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/doc/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.
+
+### 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 in the top-specific [autogen directory](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/rtl/autogen).
+The other top specific modules are generated in the top ip-specific autogen directories, for example [plic](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/ip/rv_plic), [xbar](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/ip/xbar) and [pinmux](https://github.com/lowRISC/opentitan/tree/master/hw/top_earlgrey/ip/pinmux).
+
+As part of this process, topgen invokes other tools, please see the documentation for [`reggen`](register_tool.md) and [`tlgen`](crossbar_tool.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 [--tpl TPL] [--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.
+  --tpl TPL, -c TPL     The directory having top_{name}_core.sv.tpl and
+                        top_{name}.tpl.sv.
+  --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
+
+```