blob: f99b75168dbab1aa27dea4d92d46dc221b0771ee [file] [log] [blame] [view]
<!-- mdformat off(b/169948621#comment2) -->
<!--
Semi-automated TOC generation with instructions from
https://github.com/ekalinin/github-markdown-toc#auto-insert-and-update-toc
-->
<!--ts-->
* [Software Emulation with Renode](#software-emulation-with-renode)
* [Installation](#installation)
* [Running Unit Tests](#running-unit-tests)
* [Under the hood of the Testing Infrastructure](#under-the-hood-of-the-testing-infrastructure)
* [Running a non-test Binary with Renode](#running-a-non-test-binary-with-renode)
* [Useful External Links for Renode and Robot Documentation](#useful-external-links-for-renode-and-robot-documentation)
<!-- Added by: advaitjain, at: Tue 10 Nov 2020 09:43:05 AM PST -->
<!--te-->
# Software Emulation with Renode
TensorFlow Lite Micro makes use of [Renode](https://github.com/renode/renode) to
for software emulation.
Here, we document how Renode is used as part of the TFLM project. For more
general use of Renode, please refer to the [Renode
documentation](https://renode.readthedocs.io/en/latest/).
You can also read more about Renode from a [publicly available slide deck](https://docs.google.com/presentation/d/1j0gjI4pVkgF9CWvxaxr5XuCKakEB25YX2n-iFxlYKnE/edit).
# Installation
Renode can be installed and used in a variety of ways, as documented in the
[Renode README](https://github.com/renode/renode/blob/master/README.rst#installation/). For the purpose of Tensorflow
Lite Micro, we make use of the portable version for Linux.
Portable renode will be automatically installed when using the TfLite Micro
Makefile to `tensorflow/lite/micro/tools/make/downloads/renode`.
The Makefile internally calls the `renode_download.sh` script:
```
tensorflow/lite/micro/tools/make/renode_download.sh tensorflow/lite/micro/tools/make/downloads
```
# Running Unit Tests
All the tests for a specific platform (e.g. bluepill) can be run with:
```
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=bluepill test
```
* This makes use of the robot framework from Renode.
* Note that the tests can currently not be run in parallel.
* It takes about 25 second to complete all tests, including around 3 seconds for suite startup/teardown and average 0.38 second per test.
## Under the hood of the Testing Infrastructure
Describe how we wait for a particular string on the UART. Some pointers into the
robot files as well as any relevant documentation from Renode.
A test failure is the absence of a specific string on the UART so the test will
wait for a specific timeout period (configured in the .robot) file before
failing.
* What this means in practice is that a failing test will take longer to finish
than a test that passes.
* If needed, an optimization on this would be to have a specific failure
message as well so that both success and failure can be detected quickly.
# Running a non-test Binary with Renode
Renode can also be used to run and debug binaries interactively. For example,
to debug `kernel_addr_test` on Bluepill platform, run Renode:
```
tensorflow/lite/micro/tools/make/downloads/renode/renode
```
and issue following commands:
```
# Create platform
include @tensorflow/lite/micro/testing/bluepill_nontest.resc
# Load ELF file
sysbus LoadELF @gen/bluepill_x86_64_default/bin/kernel_add_test
# Start simulation
start
# To run again:
Clear
include @tensorflow/lite/micro/testing/bluepill_nontest.resc
sysbus LoadELF @gen/bluepill_cortex-m3_default/bin/keyword_benchmark
start
```
To make repeat runs a bit easier, you can put all the commands into a
single line (up arrow will show the last command in the Renode terminal):
```
Clear; include @tensorflow/lite/micro/testing/bluepill_nontest.resc; sysbus LoadELF @gen/bluepill_x86_64_default/bin/kernel_add_test; start
```
You can also connect GDB to the simulation.
To do that, start the GDB server in Renode before issuing the `start` command:
```
machine StartGdbServer 3333
```
Than you can connect from GDB with:
```
target remote localhost:3333
```
For further reference please see the [Renode documentation](https://renode.readthedocs.io/en/latest/).
# Useful External Links for Renode and Robot Documentation
* [Testing with Renode](https://renode.readthedocs.io/en/latest/introduction/testing.html?highlight=robot#running-the-robot-test-script)
* [Robot Testing Framework on Github](https://github.com/robotframework/robotframework). For someone new to
the Robot Framework, the documentation can be a bit hard to navigate, so
here are some links that are relevant to the use of the Robot Framework with
Renode for TFLM:
* [Creating Test Data](http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#creating-test-data)
section of the user guide.
* Renode-specific additions to the Robot test description format are in the
[RobotFrameworkEngine directory](https://github.com/renode/renode/tree/master/src/Renode/RobotFrameworkEngine). For example,
* [Start Emulation](https://github.com/renode/renode/blob/master/src/Renode/RobotFrameworkEngine/RenodeKeywords.cs#L41-L42)
* [Wait For Line On Uart](https://github.com/renode/renode/blob/master/src/Renode/RobotFrameworkEngine/UartKeywords.cs#L62-L63)
is where `Wait For Line On Uart` is defined.
* Some documentation for all the [Standard Libraries](http://robotframework.org/robotframework/#standard-libraries)
that define commands such as:
* [Remove File](http://robotframework.org/robotframework/latest/libraries/OperatingSystem.html#Remove%20File)
* [List Files In Directory](https://robotframework.org/robotframework/latest/libraries/OperatingSystem.html#List%20Files%20In%20Directory)