Changes in 21.11
    * Support for 21.11 Ethos-U component and dependencies (core-software, core-driver, Vela 3.2.0, CMSIS, TensorFlow Lite).
    * Added dynamic load support for FVP for inference runner use-case.
    * Added support for different memory modes: Shared_Sram, Dedicated_Sram and Sram_Only.
    * Added Noise Reduction use case.
    * Updated support for Arm GNU Embedded Toolchain 10.3-2021.07 and Arm Compiler 6.17.
    * Documentation updates.
    * Changes to support AN552 design - the new Arm® Corstone™-300 implementation.

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.
    * Added Visual Wake Word use case.

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.
