MLBEDSW-7871: Document new error types in API

- Documents Legality requirements of CMD1 payloads

- Fixes a miss in the command stream checks.

Signed-off-by: William Isaksson <william.isaksson@arm.com>
Change-Id: I9b33dedfa66650fa3100f61fd158a385818b4d52
diff --git a/API.md b/API.md
index 2504a4f..1ec9d59 100644
--- a/API.md
+++ b/API.md
@@ -83,6 +83,38 @@
 * adds kernel/DMA wait commands if necessary
 * selects the most efficient "block dependency" that controls the NPU pipeline.
 
+#### Payload legality
+
+If the following legality requirements are violated, either a ByteAlignmentError
+or a ByteSizeError will be raised:
+
+#### DMA OP
+
+**Ethos-U55**:
+- DST (destination) and SRC (source) offset must be 16 byte aligned.
+- The (SRC) length must be a multiple of 16 bytes.
+
+**Ethos-U65**:
+- Only (NPU) internal DST and SRC offset must be 16 byte aligned.
+- For an internal DST the length must be a multiple of 16.
+
+#### Feature Maps
+
+- Tile addresses must be aligned to 16 bytes for NpuLayout NHCWB16, or
+aligned to the element size for NpuLayout NHWC.
+- For NpuLayout NHCWB16, height and depth strides must be a positive multiple of
+16 bytes. For NpuLayout NHWC height and width strides must be a
+positive multiple of the element size.
+
+#### Scale/Bias
+
+- Scale and Bias length must be a multiple of 16 bytes.
+
+#### Weights
+
+- Weight offset must be 16 byte aligned.
+- Weight length must be a multiple of 16 bytes.
+
 ### Creating a Driver Payload for the Ethos-U driver
 
 If an Ethos-U driver is used to trigger the execution of the register command
@@ -103,3 +135,5 @@
 
 For examples of how to use these APIs, please see the unit tests that are
 bundled with Vela's source code, in module `ethosu.vela.test.extapi`.
+
+
diff --git a/ethosu/vela/register_command_stream_generator.py b/ethosu/vela/register_command_stream_generator.py
index 42ae99d..9d9a1e6 100644
--- a/ethosu/vela/register_command_stream_generator.py
+++ b/ethosu/vela/register_command_stream_generator.py
@@ -531,6 +531,7 @@
             emit.cmd1_with_offset(length, weights[core].length)
         elif core < arch.ncores:
             check_alignment(weights[0].address, 16)
+            check_length(weights[0].length, 16)
             emit.cmd1_with_address(addr, weights[0].address)
             emit.cmd1_with_offset(length, 0)