|  | .. _xt-sim: | 
|  |  | 
|  | Xtensa simulator | 
|  | ################ | 
|  |  | 
|  | Overview | 
|  | ******** | 
|  |  | 
|  | The Xtensa processor architecture is a configurable, extensible, and | 
|  | synthesizable 32-bit RISC processor core. Processor and SOC vendors can select | 
|  | from various processor options and even create customized instructions in | 
|  | addition to a base ISA to tailor the processor for a particular application. | 
|  |  | 
|  | For more information, see https://ip.cadence.com/ipportfolio/tensilica-ip/xtensa-customizable | 
|  |  | 
|  | .. figure:: img/xt-sim.png | 
|  | :width: 612px | 
|  | :align: center | 
|  | :alt: Xtensa Xplorer (Eclipse base frontend for xt-sim) | 
|  |  | 
|  | Xtensa Xplorer | 
|  |  | 
|  | Hardware | 
|  | ******** | 
|  |  | 
|  | The following Xtensa cores are officially supported: | 
|  |  | 
|  | - Intel S1000 | 
|  | - sample_controller | 
|  |  | 
|  | System Clock | 
|  | ============ | 
|  |  | 
|  | Xtensa cores can be configured to use either internal or external timers. | 
|  | The frequency of the clock under simulation is set to 25MHz. | 
|  |  | 
|  | System requirements | 
|  | ******************* | 
|  |  | 
|  | Prerequisites | 
|  | ============= | 
|  | A Linux host system is required for Xtensa development work. | 
|  | We recommend using a __``Debian 9.x (Stretch)``__ or recent __``Ubuntu``__ | 
|  | releases (with multilib support). | 
|  |  | 
|  | Only Xtensa tools version ``RF-2016.4-linux`` or later are officially | 
|  | supported. Other versions may work but are not supported by Cadence Systems Inc. | 
|  |  | 
|  | In order to set up the Zephyr OS build system, a Linux 32-bit GCC compiler must | 
|  | be installed on the building linux box. Install GCC if needed either by | 
|  | downloading ``Zephyr SDK`` or by using your distribution package manager. | 
|  |  | 
|  | On Debian/Ubuntu systems, you can install ``gcc-multilib`` package as follows: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | #aptitude install gcc-multilib # Or what ever package manager (apt, apt-get, ...) | 
|  |  | 
|  | Set up build environment | 
|  | ======================== | 
|  |  | 
|  | We recommend you create a ``~/.zephyrrc`` file, a shell script that shall be | 
|  | sourced each time before you start working on Zephyr. | 
|  | You can use the following code to create that file: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ cat > ~/.zephyrrc | 
|  | if test "${CROSS}" = xcc | 
|  | then | 
|  | export ARCH=xtensa | 
|  | export BOARD=xt-sim | 
|  | export ZEPHYR_TOOLCHAIN_VARIANT=xcc | 
|  | export XTENSA_TOOLS_PATH=/opt/xtensa/XtDevTools/install/tools/RG-2016.4-linux/XtensaTools | 
|  | export XTENSA_BUILDS_PATH=/opt/xtensa/XtDevTools/install/builds/RG-2016.4-linux | 
|  | #export XTENSA_BUILD_DIR= #Keep empty to use default directory | 
|  | export EMU_PLATFORM=xt-run | 
|  | elif test "${CROSS}" = zephyr-xtensa | 
|  | then | 
|  | export ARCH=xtensa | 
|  | export BOARD=qemu | 
|  | export ZEPHYR_TOOLCHAIN_VARIANT=zephyr | 
|  | export ZEPHYR_SDK_INSTALL_DIR=/opt/xtensa/zephyr-sdk-64-INTERNAL-11-22-2016 | 
|  | elif test "${CROSS}" = zephyr-x86 | 
|  | then | 
|  | export ARCH=x86 | 
|  | export BOARD=qemu_x86 | 
|  | export ZEPHYR_TOOLCHAIN_VARIANT=zephyr | 
|  | export ZEPHYR_SDK_INSTALL_DIR=/opt/xtensa/zephyr-sdk-64-INTERNAL-11-22-2016 | 
|  | else | 
|  | echo "Unsupported compiler '${CROSS}' defined by environment variable CROSS" | 
|  | fi | 
|  |  | 
|  | Once the ``~/.zephyrrc`` file is created, you can start working. However, each | 
|  | time you start a new shell you will need to execute the following commands | 
|  | before you can compile anything: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ cd path/to/zephyr # replace path/to by a real path | 
|  | $ CROSS=xcc source zephyr-env.sh # Select xcc as compiler | 
|  |  | 
|  | Adding a user-defined Xtensa core | 
|  | ================================= | 
|  | Add your own core to the list of supported cores as follows: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ XTENSA_CORE=myCore | 
|  | $ $(which echo) -e "config ${XTENSA_CORE}\n\tbool \"${XTENSA_CORE} core\"\n" >> "soc/xtensa/Kconfig.cores" | 
|  |  | 
|  | Create a folder for that core: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ mkdir soc/xtensa/${XTENSA_CORE} | 
|  |  | 
|  | Create and copy to that folder a custom linker script (more on linker script in next section): | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ cp  linker.ld  soc/xtensa/${XTENSA_CORE}/linker.ld | 
|  |  | 
|  | Add a Makefile: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ echo "obj-y = soc.o" > soc/xtensa/${XTENSA_CORE}/Makefile | 
|  |  | 
|  | Add Zephyr specific sections to the linker script. | 
|  | The file "soc/xtensa/linker_more.ld" contains Zephyr-specific linker | 
|  | sections that should be added to the default linker script linker.ld (inside | 
|  | SECTIONS region). If you are not using a linker script, you must create one | 
|  | and add these sections. The memory segment and PHDR should be replaced by | 
|  | appropriate values. | 
|  |  | 
|  | The linker script should be named ``linker.ld`` and placed in the directory | 
|  | ``soc/xtensa/${XTENSA_CORE}``. | 
|  |  | 
|  | Configuring build | 
|  | ================= | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :zephyr-app: samples/hello_world | 
|  | :goals: menuconfig | 
|  |  | 
|  | Below is an example of usage for typical configuration: | 
|  |  | 
|  | 1. Select ``Architecture`` | 
|  | a. Select ``Xtensa architecture`` | 
|  | 2. Select ``XTENSA core Selection`` | 
|  | a. Select appropriate core (example ``hifi3_bd5 core``) | 
|  | 3. Select ``XTENSA Options`` | 
|  | a. Set ``Hardware clock cycles per second`` to appropriate value | 
|  | b. Set ``The path to Xtensa tool`` to appropriate value | 
|  | c. Set ``The version of Xtensa tool`` to appropriate version | 
|  | d. Set ``Xtensa build directory`` to appropriate  value | 
|  | 4. Select ``Board Selection`` | 
|  | a. Select ``Xtensa Development ISS`` | 
|  | 5. Select ``Device Drivers`` | 
|  | a. Uncheck ``Serial Drivers`` | 
|  | 6. Select ``Compile and Link Features`` | 
|  | a. Set compiler configuration and build options correctly to project requirements | 
|  | 7. Hit ``Exit`` and confirm saving the changes. | 
|  |  | 
|  | You may need to change other options in menuconfig depending on his project | 
|  | specific needs. | 
|  |  | 
|  | Compiling and running | 
|  | ===================== | 
|  | The Xtensa executable can be run in the simulator either with a standalone core, | 
|  | or with a core connected to simulated peripherals. | 
|  |  | 
|  | Build and run as follows: | 
|  |  | 
|  | .. zephyr-app-commands:: | 
|  | :goals: run | 
|  |  | 
|  | References | 
|  | ********** | 
|  |  | 
|  | .. _Xtensa tools: https://ip.cadence.com/support/sdk-evaluation-request |