# eXtending hardware
To extend X-HEEP with your own custom IPs, you first have to create a top-level repository that will contain both X-HEEP and your IP.
## Repository structure
The following is an example repository folder structure.
BASE
├── hw
│ ├── TOP
│ │ └── top.sv
│ └── vendor
│ ├── your_copro
│ ├── your_copro.vendor.hjson
│ ├── esl_epfl_x_heep
│ └── esl_epfl_x_heep.vendor.hjson
├── top.core
├── scripts
│ └── sim
│ ├── compile_remote_bitbang.sh
│ └── compile_uart_dpi.sh
├── tb
│ └── testharness.sv
├── util
│ └── vendor.py
├── Makefile
└── sw
## Adding a CV-X-IF coprocessor
We recommend using the [vendor](https://opentitan.org/book/util/doc/vendor.html) tool as [used inside X-HEEP](../GettingStarted/UnderstandingTools.md#vendor), although you could modify it to use git submodules.
- Create a new top-level repository (`BASE`) and vendorize both your `CV-X-IF` compliant coprocessor and X-HEEP. For X-HEEP, create inside your top-level repository's base directory (`BASE`) a `hw/vendor` directory containing a file named `esl_epfl_x_heep.vendor.hjson`:
Example of esl_epfl_x_heep.vendor.hjson
```
// Copyright EPFL
// Licensed under the Solderpad Hardware License v2.1, see LICENSE.txt for details
// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
{
name: "esl_epfl_x_heep"
target_dir: "esl_epfl_x_heep"
upstream: {
url: "https://github.com/x-heep/x-heep.git"
rev: "main"
}
patch_dir: "patches/esl_epfl_x_heep"
exclude_from_upstream: [
".github"
"ci"
]
}
```
The `main` branch in `rev:` can be replaced with a specific commit. This is the recommended operation
to prevent accidental updates to an incompatible repository commit.
In a directory `BASE/util` add the [vendor Python script](https://github.com/lowRISC/opentitan/blob/master/util/vendor.py).
To vendorize or revendorize the X-HEEP repository inside a `BASE/hw/vendor/esl_epfl_x_heep/` folder run the following command from your `BASE`.
```
util/vendor.py --update hw/vendor/esl_epfl_x_heep.vendor.hjson
```
- Copy the `x-heep/hw/system/x_heep_system.sv` as your new top-level module. Then modify it as needed to include your coprocessor and connect it to the `core_v_mini_mcu` with the `XIF`. The `XIF` SystemVerilog interface must be instantiated in the top-level module, where X-HEEP and your co-processor are connected. See X-HEEP's testbench (`tb/testharness.sv`) as an example.
- Before building software remember to run `make mcu-gen CPU=cv32e40px`.
## Adding an accelerator on the bus
Documentation TBD. The start should be similar to a CV-X-IF coprocessor. You can look at the available [eXamples](./eXamples.md).
## Creating a simulation or synthesis flow
To add this new top-level module to the simulation/synthesis flow you can extend the [FuseSoC](https://fusesoc.readthedocs.io/en/stable/user/index.html) support of X-HEEP.
- Create a new `tb/testharness.sv` modifying the one in `x-heep/tb/testharness.sv` by adding your new top-level module.
- Create a new `scripts/sim` directory adapting the corresponding ones in `x-heep/scripts/sim`.
- Create a new `.core` FuseSoC file following this example for Modelsim simulation and adapting it to your particular needs:
Example of .core
```
CAPI=2:
# Solderpad Hardware License, Version 2.1, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
name: "[YOUR_FUSESOC_IP_NAME]"
description: "[YOUR_IP_DESCRIPTION]"
filesets:
files_rtl_generic:
depend:
- openhwgroup.org:systems:core-v-mini-mcu
- x-heep:ip:pad_control
- [YOUR_COPROCESSOR]
files:
- hw/[YOUR_TOPLEVEL_SV]
- hw/vendor/esl-epfl_x-heep/hw/system/pad_ring.sv
file_type: systemVerilogSource
tb:
depend:
- x-heep::tb-utils
files:
- tb/testharness.sv # Your modified testharness
- hw/vendor/esl-epfl_x-heep/tb/tb_top.sv
file_type: systemVerilogSource
# Scripts for hooks
pre_build_uartdpi:
files:
- scripts/sim/compile_uart_dpi.sh # Your modified scripts
file_type: user
pre_build_remote_bitbang:
files:
- scripts/sim/compile_remote_bitbang.sh # Your modified scripts
file_type: user
pre_patch_modelsim_Makefile:
files:
- hw/vendor/esl-epfl_x-heep/scripts/sim/modelsim/patch_modelsim_Makefile.py
file_type: user
parameters:
JTAG_DPI:
datatype: int
paramtype: vlogparam
default: 0
USE_UPF:
datatype: bool
paramtype: vlogdefine
description: |
Enables simulation with UPF with Modelsim/VCS
scripts:
pre_build_remote_bitbang:
cmd:
- sh
- ../../../scripts/sim/compile_remote_bitbang.sh
pre_build_uartdpi:
cmd:
- sh
- ../../../scripts/sim/compile_uart_dpi.sh
pre_patch_modelsim_Makefile:
cmd:
- python
- ../../../hw/vendor/esl-epfl_x-heep/scripts/sim/modelsim/patch_modelsim_Makefile.py
targets:
default: &default_target
filesets:
- files_rtl_generic
sim:
<<: *default_target
default_tool: modelsim
filesets_append:
- tb
- tool_modelsim? (pre_build_remote_bitbang)
- tool_modelsim? (pre_build_uartdpi)
- tool_modelsim? (pre_patch_modelsim_Makefile)
toplevel:
- tb_top
hooks:
pre_build:
- tool_modelsim? (pre_build_uartdpi)
- tool_modelsim? (pre_build_remote_bitbang)
- tool_modelsim? (pre_patch_modelsim_Makefile) # this is required by Questa 2020 on
parameters:
- JTAG_DPI
tools:
modelsim:
vlog_options:
- -override_timescale 1ns/1ps
- -suppress vlog-2583
- -suppress vlog-2577
- -pedanticerrors
- -define MODELSIM
vsim_options:
- -sv_lib ../../../hw/vendor/esl-epfl_x-heep/hw/vendor/lowrisc/opentitan/hw/dv/dpi/uartdpi/uartdpi
- -sv_lib ../../../hw/vendor/esl-epfl_x-heep/hw/vendor/pulp_platform/pulpissimo/rtl/tb/remote_bitbang/librbs
```