
- [Emulating the Badge under Renode (Eventually)](#emulating-the-badge-under-renode-eventually)
- [Talk Outline](#talk-outline)
- [About Me](#about-me)
- [What is Renode?](#what-is-renode)
  - [Target Platforms](#target-platforms)
  - [Whole-system Emulator](#whole-system-emulator)
  - [CPU Cores](#cpu-cores)
  - [Peripherals](#peripherals)
  - [Peripherals Are Just Memory Addresses That Are Special](#peripherals-are-just-memory-addresses-that-are-special)
  - [10% of the Functionality Gets You 90% of the Way There](#10-of-the-functionality-gets-you-90-of-the-way-there)
  - [SVD files are your friend](#svd-files-are-your-friend)
  - [Existing Peripherals in Renode](#existing-peripherals-in-renode)
  - [Creating Peripherals](#creating-peripherals)
  - [Networks in Renode](#networks-in-renode)
  - [Other Goodies](#other-goodies)
  - [Shortcomings](#shortcomings)
- [Extending Renode](#extending-renode)
  - [First, Betrusted](#first-betrusted)
  - [Emulating it under Renode](#emulating-it-under-renode)
  - [ENGINE bug](#engine-bug)
  - [Getting Started with Renode](#getting-started-with-renode)
  - [Example project repl](#example-project-repl)
  - [Example project resc](#example-project-resc)
  - [Running it](#running-it)
  - [How to Extend Renode](#how-to-extend-renode)
- [Demonstration!](#demonstration)
- [Running Badge Software in Renode](#running-badge-software-in-renode)
  - [It Doesn't](#it-doesnt)
  - [Xtensa is a New Architecture](#xtensa-is-a-new-architecture)
  - [Extensive use of Boot ROM](#extensive-use-of-boot-rom)
  - [Add a serial port](#add-a-serial-port)
  - [Load SVD file](#load-svd-file)
  - [Add Peripherals](#add-peripherals)
  - [Slowly Advance](#slowly-advance)
  - [What's Left](#whats-left)
- [Getting involved!](#getting-involved)
- [Thank you!](#thank-you)

# Emulating the Badge under Renode (Eventually)

# Talk Outline

- What is Renode?
- How is it extensible?
- What is the state of the badge?

# About Me

# What is Renode?

## Target Platforms

- Windows
- Mac
- Linux
- CI

## Whole-system Emulator

- Emulates CPU cores
- Emulates peripherals
- Emulates interconnects

## CPU Cores

- x86
- arm
- arm64
- ppc
- riscv
- sparc
- xtensa

## Peripherals

[Image of a CPU chart]

## Peripherals Are Just Memory Addresses That Are Special

- In a MMIO system, writing to a memory address does a thing
- Reading from an address gets a result
- Interrupts are just GPIOs

## 10% of the Functionality Gets You 90% of the Way There

- E.g. in a serial device, baudrate, timers, and parity/stop can be ignored
- Just "Tx", "Rx", and interrupt setup
- Most software works just fine if you return zeroes for invalid addresses

## SVD files are your friend

- Your chip probably comes with a SVD file
- This gives a map of RAM and peripherals
- Renode can parse this and use it for logging / defaults

## Existing Peripherals in Renode

- Built-in peripherals for a number of devices
  - STM32
  - NRF52
  - IMXRT
  - LiteX
- See https://github.com/renode/renode-infrastructure/tree/master/src/Emulator/Peripherals/Peripherals for more

## Creating Peripherals

- Renode is written in C#
- Like Java, C# has an `eval()` function
- Peripherals can be written and loaded at runtime

## Networks in Renode

- Built-in support for CAN, Ethernet, and Wireless
- Also possible to add networks at runtime
- No latency, just packets of data
  - Different devices run at different speeds

## Other Goodies

- LCD monitor with touchscreen support
- Python interpreter for quick hacks
- Attach GDB to any CPU core
- Attach a serial port to a network connection
- Scriptable with Robot framework
- Log function calls

## Shortcomings

- Unable to unload modules
  - Need to restart Renode when you change a file
- No real audio support
  - Support for verifying I2S, but can't play it
- Only x64 hosts
  - Runs under Rosetta on Mac
- Documentation needs work
  - Use the source!

# Extending Renode

## First, Betrusted

- FPGA with VexRiscv
- 2nd FPGA with smaller VexRiscv
- 16-bit COM bus between them
- AES extensions
- x25519 "ENGINE" accelerator
- SHA accelerator
- Battery charger and manager
- Custom lcd, timers, and USB

## Emulating it under Renode

- Good enough to catch bugs!

## ENGINE bug

1. Added test vectors to the OS
2. Ran test vectors on physical device
3. Got test vectors passing in Renode
  - Yay!
4. Someone (without a device!) decided to add more vectors
5. Tested in Renode
6. Passed
7. Failed on hardware
8. Bug in detecting overflow condition for normalization in hardware
9. https://github.com/betrusted-io/gateware/commit/817e284a3d92037b8cb0686735578d2bb60853e9

## Getting Started with Renode

1. Renode Platform Definition (`.repl`)
2. Renode Script (`.resc`)

## Example project repl

## Example project resc

## Running it

## How to Extend Renode

1. Find a peripheral that does what you want
  - You might even find a compatible peripheral!
2. Copy it to your project
3. Change the constructor
4. Change the register set
5. Import the `.cs` file into Renode
6. Add it to your platform file

# Demonstration!

# Running Badge Software in Renode

## It Doesn't

## Xtensa is a New Architecture

- Added support for ESP32 family
- Merged quickly
- Few others use Xtensa

## Extensive use of Boot ROM

- Pulled ROM off device with esptool
- Load into RAM
- Set entrypoint

## Add a serial port

- Immediately get output
- Breaks immediately

## Load SVD file

## Add Peripherals

## Slowly Advance

## What's Left

- SPI Controller
- Interrupt Controller

# Getting involved!

- Try Renode for your projects!
- Add CI tests for your firmware!
- Explore binaries for unknown targets!

# Thank you!
