Changes in 21.08
    * Support for 21.05 Ethos-U component (core-software, core-driver, Vela 3.0.0).
    * TensorFlow submodule changed to https://github.com/tensorflow/tflite-micro (tested with TensorFlow Lite Micro commit hash: f510d38d0eaa3195ce3af66e3f32648740f08afb).
    * Image classification model changed (from uint8 to int8 datatype).
    * Documentation updates, added support to Corstone-300 + Ethos-U65.
    * Various scripts improvements.

Changes in 21.05
    * Added script to download and optimize default models.
    * Added script to run default build flow.
    * Added a model for Anomaly Detection use case.
    * Added support for build with Arm GNU Embedded Toolchain (10.2.1).
    * Deprecated support for target subsystem SSE-200.

Changes in 21.03
    * Simple platform support added.
    * Model conditioning examples added.
    * Documentation updated.
    * Build changed to use sources of the dependency libraries.
    * Tests for native platform added.
    * Anomaly detection use-case added.

Changes in 20.11
    * SSE-200 and SSE-300 system support was added.
    * Support for simple fixed virtual platform for Ethos-U55 and Cortex-M55 removed.
    * Build cmake parameters changed: TARGET_SUBSYSTEM was added, TARGET_PLATFORM accepted values were changed.
    * Models with multiple output tensors support was added.
    * Generic inference runner use-case added.
    * ASR triggered by KWS added in the same use case (kws_asr). This also shows how to re-use tensor arena with two models using the same memory pool.

Changes in 20.09 release:
    * Support for TensorFlow Lite Micro version > 2.3.0 (tested with TensorFlow Lite Micro 2.4.0 commit hash: 5bbb8a2bd1def6865b1510175a3da5fd12387e10)
    * Added speech recognition use case example.
    * Updated Ethos-U55 Fastmodel version to r0p2-00eac0-rc4

Changes in 20.08 release:
    * Added keyword spotting use case example.
    * Added person detection use case example.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.

Changes in 20.05 release:
    * FastModel environment was built with FastModel Tools v11.10.22.
    * Mps3 FPGA build support was added.
    * Configurable timing-adaptor.
    * Added Active and Idle cycle counts for NPU and CPU profiling report.
    * Source code structure and build scripts refactored to support multiple ML use-cases.
    * Used EAC Ethos-U55 software model and drivers.
    * Windows support for build scripts.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.