[reggen] Add localparam from integer count value in multireg
Tool now defines parameter if multireg count is integer. This will help
transition to parameterized data structure
This is related to #30 #47 #270
diff --git a/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv b/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
index fedc0f6..3c4fa68 100644
--- a/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
+++ b/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
@@ -6,6 +6,13 @@
package alert_handler_reg_pkg;
+ // Param list
+ localparam int ALERT_EN = 4;
+ localparam int ALERT_CLASS = 4;
+ localparam int ALERT_CAUSE = 4;
+ localparam int LOC_ALERT_EN = 4;
+ localparam int LOC_ALERT_CLASS = 4;
+
// Register to internal design logic
typedef struct packed {
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
index e21a0ca..dfc0262 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -6,6 +6,10 @@
package flash_ctrl_reg_pkg;
+ // Param list
+ localparam int MP_REGION_CFG = 8;
+ localparam int MP_BANK_CFG = 2;
+
// Register to internal design logic
typedef struct packed {
diff --git a/hw/ip/hmac/rtl/hmac_reg_pkg.sv b/hw/ip/hmac/rtl/hmac_reg_pkg.sv
index b8b3dda..789c60f 100644
--- a/hw/ip/hmac/rtl/hmac_reg_pkg.sv
+++ b/hw/ip/hmac/rtl/hmac_reg_pkg.sv
@@ -6,6 +6,10 @@
package hmac_reg_pkg;
+ // Param list
+ localparam int KEY = 8;
+ localparam int DIGEST = 8;
+
// Register to internal design logic
typedef struct packed {
diff --git a/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv b/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
index 82fa17f..d946e4d 100644
--- a/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
+++ b/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
@@ -6,6 +6,11 @@
package rv_plic_reg_pkg;
+ // Param list
+ localparam int IP = 32;
+ localparam int LE = 32;
+ localparam int IE0 = 32;
+
// Register to internal design logic
typedef struct packed {
diff --git a/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv b/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
index 058a865..9073e87 100644
--- a/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
+++ b/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
@@ -6,6 +6,11 @@
package rv_plic_reg_pkg;
+ // Param list
+ localparam int IP = 54;
+ localparam int LE = 54;
+ localparam int IE0 = 54;
+
// Register to internal design logic
typedef struct packed {
diff --git a/util/reggen/validate.py b/util/reggen/validate.py
index 2793f39..80e58fc 100644
--- a/util/reggen/validate.py
+++ b/util/reggen/validate.py
@@ -27,16 +27,38 @@
return d
-def check_count(params, x, err_prefix):
+def check_count(top, mreg, err_prefix):
'''Checking mreg count if it is in param list
'''
- name_list = [z["name"] for z in params]
+ if not "param_list" in top:
+ top["param_list"] = []
+ name_list = []
+ else:
+ name_list = [z["name"] for z in top["param_list"]]
+
try:
- index = name_list.index(x)
- return check_int(params[index]["default"], err_prefix + " default")
+ index = name_list.index(mreg["count"])
+ return check_int(top["param_list"][index]["default"],
+ err_prefix + " default")
except ValueError:
# cannot find entry in the param list
- return check_int(x, err_prefix)
+ log.warning(err_prefix + " is integer. " +
+ "It is recommended to use Parameter.")
+ mcount, ierr = check_int(mreg["count"], err_prefix)
+ if ierr != 0:
+ return mcount, ierr
+
+ top["param_list"].append({
+ "name": mreg["name"],
+ "type": "int",
+ "default": mcount,
+ "desc": "auto added parameter"
+ })
+ log.info("Parameter {} is added".format(mreg["name"]))
+ # Replace count integer to parameter
+ mreg["count"] = mreg["name"]
+
+ return mcount, ierr
# validating version of int(x, 0)
@@ -842,6 +864,7 @@
if not 'name' in mreg:
mrname = "MultiRegister at +" + hex(offset)
+ mreg["name"] = "MREG_" + hex(offset)
else:
mrname = mreg['name']
error = check_keys(mreg, multireg_required, multireg_optional,
@@ -863,9 +886,8 @@
error += gen[0]
# Check `count` field if it is in paramter list
- mcount, ierr = check_count(
- top['param_list'] if "param_list" in top else [], mreg['count'],
- mrname + " multireg count")
+ # If count is integer, add the value to param with name as REGISTER
+ mcount, ierr = check_count(top, mreg, mrname + " multireg count")
if ierr:
error += 1