[ast / sensor_ctrl] Expand ast alerts to 13

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast.sv b/hw/top_earlgrey/ip/ast/rtl/ast.sv
index 543134a..4f521bd 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast.sv
@@ -578,6 +578,9 @@
   .alert_req_o ( alert_req_o.alerts[Ot3Sel] )
 ); // of u_alert_ot2
 
+// temporary assignment
+assign alert_req_o.alerts[Ot4Sel] = '{p: 1'b0, n: 1'b1};
+assign alert_req_o.alerts[Ot5Sel] = '{p: 1'b0, n: 1'b1};
 
 ///////////////////////////////////////
 // AST Registers (Always ON)
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
index 8295716..e4cac38 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
@@ -12,7 +12,7 @@
 package ast_pkg;
 
   // Alerts
-  parameter int NumAlerts  = 11;
+  parameter int NumAlerts  = 13;
   parameter int NumIoRails = 2;
   parameter int AsSel      = 0;
   parameter int CgSel      = 1;
@@ -25,6 +25,8 @@
   parameter int Ot1Sel     = 8;
   parameter int Ot2Sel     = 9;
   parameter int Ot3Sel     = 10;
+  parameter int Ot4Sel     = 11;
+  parameter int Ot5Sel     = 12;
   //
   parameter int EntropyStreams  = 4;
   parameter int AdcChannels     = 2;
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson b/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
index e57e547..b20536b 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
+++ b/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
@@ -23,7 +23,7 @@
   param_list: [
     { name:    "NumAlerts",
       type:    "int",
-      default: "11",
+      default: "13",
       desc:    "Number of alerts",
       local:   "true"
     },
@@ -69,6 +69,12 @@
     { name: "recov_ot3",
       desc: "Triggered through AST",
     },
+    { name: "recov_ot4",
+      desc: "Triggered through AST",
+    },
+    { name: "recov_ot5",
+      desc: "Triggered through AST",
+    },
   ]
 
 
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
index 68a8ef3..8b23b8a 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
@@ -103,6 +103,10 @@
                                         reg2hw.alert_test.recov_ot2.q;
   assign alert_test[ast_pkg::Ot3Sel]  = reg2hw.alert_test.recov_ot3.qe   &
                                         reg2hw.alert_test.recov_ot3.q;
+  assign alert_test[ast_pkg::Ot4Sel]  = reg2hw.alert_test.recov_ot4.qe   &
+                                        reg2hw.alert_test.recov_ot4.q;
+  assign alert_test[ast_pkg::Ot5Sel]  = reg2hw.alert_test.recov_ot5.qe   &
+                                        reg2hw.alert_test.recov_ot5.q;
 
 
   // fire an alert whenever indicated
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
index 4dd9321..dc74247 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
@@ -7,7 +7,7 @@
 package sensor_ctrl_reg_pkg;
 
   // Param list
-  parameter int NumAlerts = 11;
+  parameter int NumAlerts = 13;
   parameter int NumIoRails = 2;
 
   // Address widths within the block
@@ -62,6 +62,14 @@
       logic        q;
       logic        qe;
     } recov_ot3;
+    struct packed {
+      logic        q;
+      logic        qe;
+    } recov_ot4;
+    struct packed {
+      logic        q;
+      logic        qe;
+    } recov_ot5;
   } sensor_ctrl_reg2hw_alert_test_reg_t;
 
   typedef struct packed {
@@ -95,15 +103,15 @@
 
   // Register -> HW type
   typedef struct packed {
-    sensor_ctrl_reg2hw_alert_test_reg_t alert_test; // [76:55]
-    sensor_ctrl_reg2hw_ack_mode_mreg_t [10:0] ack_mode; // [54:33]
-    sensor_ctrl_reg2hw_alert_trig_mreg_t [10:0] alert_trig; // [32:22]
-    sensor_ctrl_reg2hw_alert_state_mreg_t [10:0] alert_state; // [21:0]
+    sensor_ctrl_reg2hw_alert_test_reg_t alert_test; // [90:65]
+    sensor_ctrl_reg2hw_ack_mode_mreg_t [12:0] ack_mode; // [64:39]
+    sensor_ctrl_reg2hw_alert_trig_mreg_t [12:0] alert_trig; // [38:26]
+    sensor_ctrl_reg2hw_alert_state_mreg_t [12:0] alert_state; // [25:0]
   } sensor_ctrl_reg2hw_t;
 
   // HW -> register type
   typedef struct packed {
-    sensor_ctrl_hw2reg_alert_state_mreg_t [10:0] alert_state; // [26:5]
+    sensor_ctrl_hw2reg_alert_state_mreg_t [12:0] alert_state; // [30:5]
     sensor_ctrl_hw2reg_status_reg_t status; // [4:0]
   } sensor_ctrl_hw2reg_t;
 
@@ -116,7 +124,7 @@
   parameter logic [BlockAw-1:0] SENSOR_CTRL_STATUS_OFFSET = 5'h 14;
 
   // Reset values for hwext registers and their fields
-  parameter logic [10:0] SENSOR_CTRL_ALERT_TEST_RESVAL = 11'h 0;
+  parameter logic [12:0] SENSOR_CTRL_ALERT_TEST_RESVAL = 13'h 0;
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_AS_RESVAL = 1'h 0;
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_CG_RESVAL = 1'h 0;
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_GD_RESVAL = 1'h 0;
@@ -128,6 +136,8 @@
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT1_RESVAL = 1'h 0;
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT2_RESVAL = 1'h 0;
   parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT3_RESVAL = 1'h 0;
+  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT4_RESVAL = 1'h 0;
+  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT5_RESVAL = 1'h 0;
 
   // Register index
   typedef enum int {
@@ -143,7 +153,7 @@
   parameter logic [3:0] SENSOR_CTRL_PERMIT [6] = '{
     4'b 0011, // index[0] SENSOR_CTRL_ALERT_TEST
     4'b 0001, // index[1] SENSOR_CTRL_CFG_REGWEN
-    4'b 0111, // index[2] SENSOR_CTRL_ACK_MODE
+    4'b 1111, // index[2] SENSOR_CTRL_ACK_MODE
     4'b 0011, // index[3] SENSOR_CTRL_ALERT_TRIG
     4'b 0011, // index[4] SENSOR_CTRL_ALERT_STATE
     4'b 0001  // index[5] SENSOR_CTRL_STATUS
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
index 5fafe39..2422860 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
@@ -126,6 +126,10 @@
   logic alert_test_recov_ot2_we;
   logic alert_test_recov_ot3_wd;
   logic alert_test_recov_ot3_we;
+  logic alert_test_recov_ot4_wd;
+  logic alert_test_recov_ot4_we;
+  logic alert_test_recov_ot5_wd;
+  logic alert_test_recov_ot5_we;
   logic cfg_regwen_qs;
   logic cfg_regwen_wd;
   logic cfg_regwen_we;
@@ -162,6 +166,12 @@
   logic [1:0] ack_mode_val_10_qs;
   logic [1:0] ack_mode_val_10_wd;
   logic ack_mode_val_10_we;
+  logic [1:0] ack_mode_val_11_qs;
+  logic [1:0] ack_mode_val_11_wd;
+  logic ack_mode_val_11_we;
+  logic [1:0] ack_mode_val_12_qs;
+  logic [1:0] ack_mode_val_12_wd;
+  logic ack_mode_val_12_we;
   logic alert_trig_val_0_qs;
   logic alert_trig_val_0_wd;
   logic alert_trig_val_0_we;
@@ -195,6 +205,12 @@
   logic alert_trig_val_10_qs;
   logic alert_trig_val_10_wd;
   logic alert_trig_val_10_we;
+  logic alert_trig_val_11_qs;
+  logic alert_trig_val_11_wd;
+  logic alert_trig_val_11_we;
+  logic alert_trig_val_12_qs;
+  logic alert_trig_val_12_wd;
+  logic alert_trig_val_12_we;
   logic alert_state_val_0_qs;
   logic alert_state_val_0_wd;
   logic alert_state_val_0_we;
@@ -228,6 +244,12 @@
   logic alert_state_val_10_qs;
   logic alert_state_val_10_wd;
   logic alert_state_val_10_we;
+  logic alert_state_val_11_qs;
+  logic alert_state_val_11_wd;
+  logic alert_state_val_11_we;
+  logic alert_state_val_12_qs;
+  logic alert_state_val_12_wd;
+  logic alert_state_val_12_we;
   logic status_ast_init_done_qs;
   logic [1:0] status_io_pok_qs;
 
@@ -399,6 +421,36 @@
   );
 
 
+  //   F[recov_ot4]: 11:11
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_alert_test_recov_ot4 (
+    .re     (1'b0),
+    .we     (alert_test_recov_ot4_we),
+    .wd     (alert_test_recov_ot4_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.alert_test.recov_ot4.qe),
+    .q      (reg2hw.alert_test.recov_ot4.q),
+    .qs     ()
+  );
+
+
+  //   F[recov_ot5]: 12:12
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_alert_test_recov_ot5 (
+    .re     (1'b0),
+    .we     (alert_test_recov_ot5_we),
+    .wd     (alert_test_recov_ot5_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.alert_test.recov_ot5.qe),
+    .q      (reg2hw.alert_test.recov_ot5.q),
+    .qs     ()
+  );
+
+
   // R[cfg_regwen]: V(False)
 
   prim_subreg #(
@@ -716,6 +768,58 @@
   );
 
 
+  // F[val_11]: 23:22
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_ack_mode_val_11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (ack_mode_val_11_we & cfg_regwen_qs),
+    .wd     (ack_mode_val_11_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ack_mode[11].q),
+
+    // to register interface (read)
+    .qs     (ack_mode_val_11_qs)
+  );
+
+
+  // F[val_12]: 25:24
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_ack_mode_val_12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (ack_mode_val_12_we & cfg_regwen_qs),
+    .wd     (ack_mode_val_12_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ack_mode[12].q),
+
+    // to register interface (read)
+    .qs     (ack_mode_val_12_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg alert_trig
@@ -1007,6 +1111,58 @@
   );
 
 
+  // F[val_11]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_alert_trig_val_11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (alert_trig_val_11_we),
+    .wd     (alert_trig_val_11_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_trig[11].q),
+
+    // to register interface (read)
+    .qs     (alert_trig_val_11_qs)
+  );
+
+
+  // F[val_12]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_alert_trig_val_12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (alert_trig_val_12_we),
+    .wd     (alert_trig_val_12_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_trig[12].q),
+
+    // to register interface (read)
+    .qs     (alert_trig_val_12_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg alert_state
@@ -1298,6 +1454,58 @@
   );
 
 
+  // F[val_11]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_alert_state_val_11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (alert_state_val_11_we),
+    .wd     (alert_state_val_11_wd),
+
+    // from internal hardware
+    .de     (hw2reg.alert_state[11].de),
+    .d      (hw2reg.alert_state[11].d),
+
+    // to internal hardware
+    .qe     (reg2hw.alert_state[11].qe),
+    .q      (reg2hw.alert_state[11].q),
+
+    // to register interface (read)
+    .qs     (alert_state_val_11_qs)
+  );
+
+
+  // F[val_12]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_alert_state_val_12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (alert_state_val_12_we),
+    .wd     (alert_state_val_12_wd),
+
+    // from internal hardware
+    .de     (hw2reg.alert_state[12].de),
+    .d      (hw2reg.alert_state[12].d),
+
+    // to internal hardware
+    .qe     (reg2hw.alert_state[12].qe),
+    .q      (reg2hw.alert_state[12].q),
+
+    // to register interface (read)
+    .qs     (alert_state_val_12_qs)
+  );
+
+
 
   // R[status]: V(False)
 
@@ -1412,6 +1620,12 @@
   assign alert_test_recov_ot3_we = addr_hit[0] & reg_we & !reg_error;
   assign alert_test_recov_ot3_wd = reg_wdata[10];
 
+  assign alert_test_recov_ot4_we = addr_hit[0] & reg_we & !reg_error;
+  assign alert_test_recov_ot4_wd = reg_wdata[11];
+
+  assign alert_test_recov_ot5_we = addr_hit[0] & reg_we & !reg_error;
+  assign alert_test_recov_ot5_wd = reg_wdata[12];
+
   assign cfg_regwen_we = addr_hit[1] & reg_we & !reg_error;
   assign cfg_regwen_wd = reg_wdata[0];
 
@@ -1448,6 +1662,12 @@
   assign ack_mode_val_10_we = addr_hit[2] & reg_we & !reg_error;
   assign ack_mode_val_10_wd = reg_wdata[21:20];
 
+  assign ack_mode_val_11_we = addr_hit[2] & reg_we & !reg_error;
+  assign ack_mode_val_11_wd = reg_wdata[23:22];
+
+  assign ack_mode_val_12_we = addr_hit[2] & reg_we & !reg_error;
+  assign ack_mode_val_12_wd = reg_wdata[25:24];
+
   assign alert_trig_val_0_we = addr_hit[3] & reg_we & !reg_error;
   assign alert_trig_val_0_wd = reg_wdata[0];
 
@@ -1481,6 +1701,12 @@
   assign alert_trig_val_10_we = addr_hit[3] & reg_we & !reg_error;
   assign alert_trig_val_10_wd = reg_wdata[10];
 
+  assign alert_trig_val_11_we = addr_hit[3] & reg_we & !reg_error;
+  assign alert_trig_val_11_wd = reg_wdata[11];
+
+  assign alert_trig_val_12_we = addr_hit[3] & reg_we & !reg_error;
+  assign alert_trig_val_12_wd = reg_wdata[12];
+
   assign alert_state_val_0_we = addr_hit[4] & reg_we & !reg_error;
   assign alert_state_val_0_wd = reg_wdata[0];
 
@@ -1514,6 +1740,12 @@
   assign alert_state_val_10_we = addr_hit[4] & reg_we & !reg_error;
   assign alert_state_val_10_wd = reg_wdata[10];
 
+  assign alert_state_val_11_we = addr_hit[4] & reg_we & !reg_error;
+  assign alert_state_val_11_wd = reg_wdata[11];
+
+  assign alert_state_val_12_we = addr_hit[4] & reg_we & !reg_error;
+  assign alert_state_val_12_wd = reg_wdata[12];
+
   // Read data return
   always_comb begin
     reg_rdata_next = '0;
@@ -1530,6 +1762,8 @@
         reg_rdata_next[8] = '0;
         reg_rdata_next[9] = '0;
         reg_rdata_next[10] = '0;
+        reg_rdata_next[11] = '0;
+        reg_rdata_next[12] = '0;
       end
 
       addr_hit[1]: begin
@@ -1548,6 +1782,8 @@
         reg_rdata_next[17:16] = ack_mode_val_8_qs;
         reg_rdata_next[19:18] = ack_mode_val_9_qs;
         reg_rdata_next[21:20] = ack_mode_val_10_qs;
+        reg_rdata_next[23:22] = ack_mode_val_11_qs;
+        reg_rdata_next[25:24] = ack_mode_val_12_qs;
       end
 
       addr_hit[3]: begin
@@ -1562,6 +1798,8 @@
         reg_rdata_next[8] = alert_trig_val_8_qs;
         reg_rdata_next[9] = alert_trig_val_9_qs;
         reg_rdata_next[10] = alert_trig_val_10_qs;
+        reg_rdata_next[11] = alert_trig_val_11_qs;
+        reg_rdata_next[12] = alert_trig_val_12_qs;
       end
 
       addr_hit[4]: begin
@@ -1576,6 +1814,8 @@
         reg_rdata_next[8] = alert_state_val_8_qs;
         reg_rdata_next[9] = alert_state_val_9_qs;
         reg_rdata_next[10] = alert_state_val_10_qs;
+        reg_rdata_next[11] = alert_state_val_11_qs;
+        reg_rdata_next[12] = alert_state_val_12_qs;
       end
 
       addr_hit[5]: begin
diff --git a/util/topgen.py b/util/topgen.py
index 8ddf19a..2d3dde0 100755
--- a/util/topgen.py
+++ b/util/topgen.py
@@ -150,7 +150,8 @@
         for alert in top['alert']:
             for k in range(alert['width']):
                 async_on = str(alert['async']) + async_on
-        async_on = ("%d'b" % n_alerts) + async_on
+        # convert to hexstring to shorten line length
+        async_on = ("%d'h" % n_alerts) + hex(int(async_on,2))[2:]
 
     log.info("alert handler parameterization:")
     log.info("NAlerts   = %d" % n_alerts)