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
Hardware¶
The following Xtensa cores are officially supported:
- hifi3_bd5
- XRC_FUSION_AON_ALL_LM
- D_108mini
- D_212GP
- D_233L
- hifi_mini_4swIrq (call0 ABI, added 4 SW IRQ for tests and 1 timer level 1)
- hifi2_std
- XRC_D2PM_5swIrq (added 4 SW IRQ for tests and 1 timer level 1)
- hifi4_bd7 (Big Endian)
- hifi3_bd5_call0 (call0 ABI, added 3 SW IRQs for tests)
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:
#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:
$ 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:
$ 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:
$ 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:
$ mkdir soc/xtensa/${XTENSA_CORE}
Create and copy to that folder a custom linker script (more on linker script in next section):
$ cp linker.ld soc/xtensa/${XTENSA_CORE}/linker.ld
Add a Makefile:
$ 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. See soc/xtensa/hifi3_bd5/linker.ld for an example.
The linker script should be named linker.ld
and placed in the directory
soc/xtensa/${XTENSA_CORE}
.
Configuring build¶
# On Linux/macOS
cd $ZEPHYR_BASE/tests/kernel/test_build
mkdir build && cd build
# On Windows
cd %ZEPHYR_BASE%\tests\kernel\test_build
mkdir build & cd build
# Use cmake to configure a Ninja-based build system:
cmake -GNinja ..
# Now run ninja on the generated build system:
ninja menuconfig
Below is an example of usage for typical configuration:
- Select
Architecture
- Select
Xtensa architecture
- Select
- Select
- Select
XTENSA core Selection
- Select appropriate core (example
hifi3_bd5 core
)
- Select appropriate core (example
- Select
- Select
XTENSA Options
- Set
Hardware clock cycles per second
to appropriate value - Set
The path to Xtensa tool
to appropriate value - Set
The version of Xtensa tool
to appropriate version - Set
Xtensa build directory
to appropriate value
- Set
- Select
- Select
Board Selection
- Select
Xtensa Development ISS
- Select
- Select
- Select
Device Drivers
- Uncheck
Serial Drivers
- Uncheck
- Select
- Select
Compile and Link Features
- Set compiler configuration and build options correctly to project requirements
- Select
- 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:
# On Linux/macOS
mkdir build && cd build
# On Windows
mkdir build & cd build
# Use cmake to configure a Ninja-based build system:
cmake -GNinja ..
# Now run ninja on the generated build system:
ninja run