[doc] implement hw project dashboard
diff --git a/util/dashboard/dashboard_validate.py b/util/dashboard/dashboard_validate.py
new file mode 100644
index 0000000..099453e
--- /dev/null
+++ b/util/dashboard/dashboard_validate.py
@@ -0,0 +1,52 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+"""
+Dashboard project json file validation
+"""
+
+import logging as log
+import sys
+
+
+def check_keys(obj, required_keys, optional_keys, err_prefix):
+    error = 0
+    for x in required_keys:
+        if not x in obj:
+            error += 1
+            log.error(err_prefix + " missing required key " + x)
+    for x in obj:
+        type = ''
+        if x in required_keys:
+            type = required_keys[x][0]
+        elif x in optional_keys:
+            type = optional_keys[x][0]
+        else:
+            log.warning(err_prefix + " contains extra key " + x)
+
+    return error
+
+
+field_required = {
+    'name': ['s', "module name"],
+    'version': ['s', "module version"],
+    'life_stage': ['s', "life stage of module"]
+}
+field_optional = {
+    'design_stage': ['s', "design stage of module"],
+    'verification_stage': ['s', "verification stage of module"],
+    'notes': ['s', "random notes"],
+}
+
+
+def validate(regs):
+    if not 'name' in regs:
+        log.error("Component has no name. Aborting.")
+        return 1
+    component = regs['name']
+
+    error = check_keys(regs, field_required, field_optional, component)
+    if (error > 0):
+        log.error("Component has top level errors. Aborting.")
+
+    return error