|  | --- | 
|  | title: "Directory Structure" | 
|  | --- | 
|  |  | 
|  | This document provides an overview of the opentitan repository directory structure. | 
|  | The hierarchy underneath the root is fairly self explanatory, containing the following: | 
|  | * `doc`: High level documentatation, user guides and reference manuals | 
|  | * `util`: Helper scripts and generator tools | 
|  | * `hw`: Design and DV sources | 
|  | * `sw`: All software sources used in the project | 
|  |  | 
|  | We will focus on the directory structure underneath `hw` and `sw` below. | 
|  |  | 
|  | ## Directory structure underneath `hw` | 
|  | ``` | 
|  | hw | 
|  | ├──dv             => Common / shared resources for SV/UVM as well as | 
|  | │                    Verilator based testbenches | 
|  | │ | 
|  | ├──formal         => Scripts to build and run formal property verification | 
|  | │                    (FPV) for all applicable IPs to ensure protocol | 
|  | │                    compliance | 
|  | │ | 
|  | ├──ip             => Standalone or generic / parameterized implementations | 
|  | │                    of comportable IPs designed towards building SoCs | 
|  | │ | 
|  | ├──lint           => Scripts to run the `lint` tool on all RTL sources | 
|  | │ | 
|  | ├──top_earlgrey   => An implementation of OpenTitan SoC built using above | 
|  | │                    IPs as well as third-party 'vendored' IPs | 
|  | │ | 
|  | ├──vendor         => Vendored-in open source IPs from external repositories | 
|  | ``` | 
|  |  | 
|  | ### `hw/ip` | 
|  | ``` | 
|  | ip | 
|  | ├──uart        => UART IP root dir | 
|  | │  │ | 
|  | │  ├──data     => Configuration data sources for design, DV and project | 
|  | │  │              status tracking | 
|  | │  │ | 
|  | │  ├──doc      => All documentation sources including design specification | 
|  | │  │              and DV document | 
|  | │  │ | 
|  | │  ├──dv       => SV/UVM testbench sources | 
|  | │  │ | 
|  | │  ├──fpv      => Testbench sources used in FPV (if applicable) | 
|  | │  │ | 
|  | │  ├──model    => Reference 'model' implementation in C (if applicable) | 
|  | │  │ | 
|  | │  ├──pre_dv   => This is a work area for experimental DV work that is worthy of | 
|  | │  │              maintaining, but not intended to apply towards code coverage. | 
|  | │  │ | 
|  | │  ├──rtl      => RTL design sources | 
|  | │  │ | 
|  | │  ├──util     => IP-specfic automation scripts (if applicable) | 
|  | │  │ | 
|  | │  ├──...      => Additional sub-directories could exist for specific IPs | 
|  | │                 based on need | 
|  | │ | 
|  | ├──...         => More such Comportable IPs... | 
|  | ``` | 
|  |  | 
|  | ### `hw/top_earlgrey` | 
|  | ``` | 
|  | top_earlgrey         => Chip root dir | 
|  | │ | 
|  | ├──data              => Configuration data sources for design, DV and | 
|  | │                       project status tracking | 
|  | │ | 
|  | ├──doc               => All documentation sources including chip | 
|  | │                       specification and DV document | 
|  | │ | 
|  | ├──dv                => Chip level SV/UVM testbench sources | 
|  | │  └──autogen        => auto-generated chip DV sources | 
|  | │ | 
|  | ├──ip                => IPs tailor-made for top_earlgrey | 
|  | │  │ | 
|  | │  ├──xbar           => XBAR implementation for top_earlgrey | 
|  | │  │  ├──dv          => DV sources | 
|  | │  │  │  └──autogen  => auto-generated XBAR DV sources | 
|  | │  │  └──rtl         => RTL sources | 
|  | │  │     └──autogen  => Auto-generated XBAR RTL sources | 
|  | │  │ | 
|  | │  ├──...            => More such IPs tailored for top_earlgrey... | 
|  | │ | 
|  | ├──rtl               => Chip level RTL sources | 
|  | │  └──autogen        => auto-generated chip RTL sources | 
|  | │ | 
|  | ├──sw                => Auto-generated chip-specific headers for SW | 
|  | │ | 
|  | └──util              => Chip-specfic automation scripts | 
|  | ``` | 
|  |  | 
|  | ### Auto-generated sources: checked-in | 
|  | In cases where we rely on automatic generation of RTL, DV, or software sources we currently check those files in to the repository. | 
|  | This is primarily motivated by a desire to make it easy for engineers to rapidly test spot-fixes. | 
|  | This is a decision that might be revisited in the future. | 
|  |  | 
|  | #### Mitigating issues | 
|  | Auto-generated sources can get out-of-sync if the underlying tools or templates are updated. | 
|  | Also, users may accidently make modifications to those files by hand, which will cease to exist the next time the tools are run. | 
|  | We employ the following methods to mitigate these risks: | 
|  | * Add a CI check when a pull request is made to merge new changes to ensure that the checked-in file and the generator output are enquivalent and not out-of-sync | 
|  | * Put auto-generated sources under a dedicated `autogen/` directory | 
|  | * Add a warning message banner as a comment clearly indicating that the file has been auto-generated with the complete command | 
|  |  | 
|  | ## Directory structure underneath `sw` | 
|  | ``` | 
|  | sw | 
|  | ├──device                 => Sources compiled for the OpenTitan chip, | 
|  | │  │                         including tests run on FPGA and simulations | 
|  | │  │ | 
|  | │  ├──boot_rom            => Sources for generating the primary boot image | 
|  | │  │                         loaded into ROM | 
|  | │  │ | 
|  | │  ├──benchmarks          => Standard benchmarks and instructions for running | 
|  | │  │   └──coremark           them | 
|  | │  │ | 
|  | │  ├──doc                 => Documentation sources | 
|  | │  │ | 
|  | │  ├──examples            => Example programs to demonstrate basic | 
|  | │  │   ├──hello_world        functionality | 
|  | │  │   ├──... | 
|  | │  │ | 
|  | │  ├──exts                => Sources that are specific to the intended target | 
|  | │  │   │                     (FPGA, Verilator, DV, firmware) | 
|  | │  │   └──common          => Common sources for all SW tests including the CRT | 
|  | │  │                         source and the linker script | 
|  | │  │ | 
|  | │  ├──lib                 => SW library of device interface functions (DIFs) | 
|  | │  │                         that provide APIs for controlling the hardware | 
|  | │  │ | 
|  | │  └──tests               => SW tests implemented on FPGA/Verilator/DV targets | 
|  | │     ├──flash_ctrl | 
|  | │     ├──... | 
|  | │ | 
|  | ├──host                   => Sources compiled for the host communicating with | 
|  | │                            our OpenTitan chip | 
|  | │ | 
|  | └──vendor                 => Vendored-in open source software sources from | 
|  | │                        external repositories | 
|  | └── cryptoc | 
|  | ``` |