[reggen, util] Add support for data integrity passthrough

- When a module has no window or has windows with no integrity passthrough,
  data integrity can be generated at a common location.

- When a module window has data integrity passthrough, the regfile
  registers must separately generate data integrity so as to not
  duplicate.

- When a module has a mix of windows with and without integrity, common
  generation is not possible, and data integrity is selectively generated
  for those windows that do not directly pass them in.

- The only module that is currently impacted is otbn (and soon rom_ctrl)
  Otbn dmem / imem each contain their own integrity, and thus can directly
  pass them through.  The regfile for otbn thus no longer generates data
  integrity at a common location, and instead generates it only for data
  passed through tlul_adapter_reg.  The data integrity for the windows are
  fed through directly.

Signed-off-by: Timothy Chen <timothytim@google.com>

[top] Auto generate files

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/adc_ctrl/rtl/adc_ctrl_reg_top.sv b/hw/ip/adc_ctrl/rtl/adc_ctrl_reg_top.sv
index f14716c..20b4c37 100644
--- a/hw/ip/adc_ctrl/rtl/adc_ctrl_reg_top.sv
+++ b/hw/ip/adc_ctrl/rtl/adc_ctrl_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/aes/rtl/aes_reg_top.sv b/hw/ip/aes/rtl/aes_reg_top.sv
index 7a6b805..15ccca5 100644
--- a/hw/ip/aes/rtl/aes_reg_top.sv
+++ b/hw/ip/aes/rtl/aes_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/alert_handler/rtl/alert_handler_reg_top.sv b/hw/ip/alert_handler/rtl/alert_handler_reg_top.sv
index de54bab..4d51afe 100644
--- a/hw/ip/alert_handler/rtl/alert_handler_reg_top.sv
+++ b/hw/ip/alert_handler/rtl/alert_handler_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/aon_timer/rtl/aon_timer_reg_top.sv b/hw/ip/aon_timer/rtl/aon_timer_reg_top.sv
index 3ce75e7..fa7c134 100644
--- a/hw/ip/aon_timer/rtl/aon_timer_reg_top.sv
+++ b/hw/ip/aon_timer/rtl/aon_timer_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/clkmgr/rtl/clkmgr_reg_top.sv b/hw/ip/clkmgr/rtl/clkmgr_reg_top.sv
index 15d55fa..18dbc8b 100644
--- a/hw/ip/clkmgr/rtl/clkmgr_reg_top.sv
+++ b/hw/ip/clkmgr/rtl/clkmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/csrng/rtl/csrng_reg_top.sv b/hw/ip/csrng/rtl/csrng_reg_top.sv
index 3abe448..2ffab09 100644
--- a/hw/ip/csrng/rtl/csrng_reg_top.sv
+++ b/hw/ip/csrng/rtl/csrng_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/edn/rtl/edn_reg_top.sv b/hw/ip/edn/rtl/edn_reg_top.sv
index 9bab470..52492c9 100644
--- a/hw/ip/edn/rtl/edn_reg_top.sv
+++ b/hw/ip/edn/rtl/edn_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv b/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
index 24daeec..14e6172 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
index b242263..2cc3d73 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -135,7 +138,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/gpio/rtl/gpio_reg_top.sv b/hw/ip/gpio/rtl/gpio_reg_top.sv
index 304c433..1e30e61 100644
--- a/hw/ip/gpio/rtl/gpio_reg_top.sv
+++ b/hw/ip/gpio/rtl/gpio_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/hmac/rtl/hmac_reg_top.sv b/hw/ip/hmac/rtl/hmac_reg_top.sv
index 0a7d679..5ff8b71 100644
--- a/hw/ip/hmac/rtl/hmac_reg_top.sv
+++ b/hw/ip/hmac/rtl/hmac_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -125,7 +128,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/i2c/rtl/i2c_reg_top.sv b/hw/ip/i2c/rtl/i2c_reg_top.sv
index 07bebbe..f42b7b4 100644
--- a/hw/ip/i2c/rtl/i2c_reg_top.sv
+++ b/hw/ip/i2c/rtl/i2c_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/keymgr/rtl/keymgr_reg_top.sv b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
index 6d0e2e1..7f9fcac 100644
--- a/hw/ip/keymgr/rtl/keymgr_reg_top.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/kmac/rtl/kmac_reg_top.sv b/hw/ip/kmac/rtl/kmac_reg_top.sv
index fa972ee..1a1aef7 100644
--- a/hw/ip/kmac/rtl/kmac_reg_top.sv
+++ b/hw/ip/kmac/rtl/kmac_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -130,7 +133,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
index 9eba05c..63be85d 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/nmi_gen/rtl/nmi_gen_reg_top.sv b/hw/ip/nmi_gen/rtl/nmi_gen_reg_top.sv
index 07e5657..8029e15 100644
--- a/hw/ip/nmi_gen/rtl/nmi_gen_reg_top.sv
+++ b/hw/ip/nmi_gen/rtl/nmi_gen_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/otbn/data/otbn.hjson b/hw/ip/otbn/data/otbn.hjson
index 6875fa7..57bf1d5 100644
--- a/hw/ip/otbn/data/otbn.hjson
+++ b/hw/ip/otbn/data/otbn.hjson
@@ -230,9 +230,10 @@
 
     // Imem size (given as `items` below) must be a power of two.
     { window: {
-        name: "IMEM"
-        items: "1024" // 4 kB
+        name: "IMEM",
+        items: "1024", // 4 kB
         swaccess: "rw",
+        data-intg-passthru: "true",
         byte-write: "false",
         desc: '''
           Instruction Memory.
@@ -249,9 +250,10 @@
 
     // Dmem size (given as `items` below) must be a power of two.
     { window: {
-        name: "DMEM"
-        items: "1024" // 4 kB
+        name: "DMEM",
+        items: "1024", // 4 kB
         swaccess: "rw",
+        data-intg-passthru: "true",
         byte-write: "false",
         desc: '''
           Data Memory.
diff --git a/hw/ip/otbn/rtl/otbn_reg_top.sv b/hw/ip/otbn/rtl/otbn_reg_top.sv
index 37962fb..b22e10f 100644
--- a/hw/ip/otbn/rtl/otbn_reg_top.sv
+++ b/hw/ip/otbn/rtl/otbn_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(0)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -130,7 +133,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(1)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/otp_ctrl/rtl/otp_ctrl_reg_top.sv b/hw/ip/otp_ctrl/rtl/otp_ctrl_reg_top.sv
index 6d7e4b4..e8c0e81 100644
--- a/hw/ip/otp_ctrl/rtl/otp_ctrl_reg_top.sv
+++ b/hw/ip/otp_ctrl/rtl/otp_ctrl_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -130,7 +133,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/pattgen/rtl/pattgen_reg_top.sv b/hw/ip/pattgen/rtl/pattgen_reg_top.sv
index ed76b53..17a8bc9 100644
--- a/hw/ip/pattgen/rtl/pattgen_reg_top.sv
+++ b/hw/ip/pattgen/rtl/pattgen_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/pinmux/rtl/pinmux_reg_top.sv b/hw/ip/pinmux/rtl/pinmux_reg_top.sv
index 2beff99..5d3ae50 100644
--- a/hw/ip/pinmux/rtl/pinmux_reg_top.sv
+++ b/hw/ip/pinmux/rtl/pinmux_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv b/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
index 485911b..71195a1 100644
--- a/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
+++ b/hw/ip/pwrmgr/rtl/pwrmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/rom_ctrl/rtl/rom_ctrl_regs_reg_top.sv b/hw/ip/rom_ctrl/rtl/rom_ctrl_regs_reg_top.sv
index 364be39..14fc2eb 100644
--- a/hw/ip/rom_ctrl/rtl/rom_ctrl_regs_reg_top.sv
+++ b/hw/ip/rom_ctrl/rtl/rom_ctrl_regs_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/rom_ctrl/rtl/rom_ctrl_rom_reg_top.sv b/hw/ip/rom_ctrl/rtl/rom_ctrl_rom_reg_top.sv
index 54e2507..b22599a 100644
--- a/hw/ip/rom_ctrl/rtl/rom_ctrl_rom_reg_top.sv
+++ b/hw/ip/rom_ctrl/rtl/rom_ctrl_rom_reg_top.sv
@@ -51,7 +51,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
diff --git a/hw/ip/rstmgr/rtl/rstmgr_reg_top.sv b/hw/ip/rstmgr/rtl/rstmgr_reg_top.sv
index a6ce65b..9c0e64e 100644
--- a/hw/ip/rstmgr/rtl/rstmgr_reg_top.sv
+++ b/hw/ip/rstmgr/rtl/rstmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/rv_plic/rtl/rv_plic_reg_top.sv b/hw/ip/rv_plic/rtl/rv_plic_reg_top.sv
index 7a32fcd..17540b3 100644
--- a/hw/ip/rv_plic/rtl/rv_plic_reg_top.sv
+++ b/hw/ip/rv_plic/rtl/rv_plic_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/rv_timer/rtl/rv_timer_reg_top.sv b/hw/ip/rv_timer/rtl/rv_timer_reg_top.sv
index 4e3ad2c..e62f38f 100644
--- a/hw/ip/rv_timer/rtl/rv_timer_reg_top.sv
+++ b/hw/ip/rv_timer/rtl/rv_timer_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/spi_device/rtl/spi_device_reg_top.sv b/hw/ip/spi_device/rtl/spi_device_reg_top.sv
index 836e7af..9a84220 100644
--- a/hw/ip/spi_device/rtl/spi_device_reg_top.sv
+++ b/hw/ip/spi_device/rtl/spi_device_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -125,7 +128,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/spi_host/rtl/spi_host_reg_top.sv b/hw/ip/spi_host/rtl/spi_host_reg_top.sv
index deb1f36..8c761d1 100644
--- a/hw/ip/spi_host/rtl/spi_host_reg_top.sv
+++ b/hw/ip/spi_host/rtl/spi_host_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -125,7 +128,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/sram_ctrl/rtl/sram_ctrl_reg_top.sv b/hw/ip/sram_ctrl/rtl/sram_ctrl_reg_top.sv
index 8872df7..423ce76 100644
--- a/hw/ip/sram_ctrl/rtl/sram_ctrl_reg_top.sv
+++ b/hw/ip/sram_ctrl/rtl/sram_ctrl_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/sysrst_ctrl/rtl/sysrst_ctrl_reg_top.sv b/hw/ip/sysrst_ctrl/rtl/sysrst_ctrl_reg_top.sv
index dee9426..7011e26 100644
--- a/hw/ip/sysrst_ctrl/rtl/sysrst_ctrl_reg_top.sv
+++ b/hw/ip/sysrst_ctrl/rtl/sysrst_ctrl_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/trial1/rtl/trial1_reg_top.sv b/hw/ip/trial1/rtl/trial1_reg_top.sv
index d24a77c..83e0354 100644
--- a/hw/ip/trial1/rtl/trial1_reg_top.sv
+++ b/hw/ip/trial1/rtl/trial1_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/uart/rtl/uart_reg_top.sv b/hw/ip/uart/rtl/uart_reg_top.sv
index 725d462..ddd78c0 100644
--- a/hw/ip/uart/rtl/uart_reg_top.sv
+++ b/hw/ip/uart/rtl/uart_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/usbdev/rtl/usbdev_reg_top.sv b/hw/ip/usbdev/rtl/usbdev_reg_top.sv
index 40a364b..a67747a 100644
--- a/hw/ip/usbdev/rtl/usbdev_reg_top.sv
+++ b/hw/ip/usbdev/rtl/usbdev_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -125,7 +128,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/ip/usbuart/rtl/usbuart_reg_top.sv b/hw/ip/usbuart/rtl/usbuart_reg_top.sv
index 4625389..d7cf60b 100644
--- a/hw/ip/usbuart/rtl/usbuart_reg_top.sv
+++ b/hw/ip/usbuart/rtl/usbuart_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
index 93ed12f..c24c559 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv b/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
index 0cd1a88..f7a4b22 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
index e497d15..1991603 100644
--- a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
+++ b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_top.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_top.sv
index b242263..2cc3d73 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_top.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_top.sv
@@ -72,7 +72,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -135,7 +138,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
index b297796..67d3bfa 100644
--- a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
+++ b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/pwrmgr/rtl/autogen/pwrmgr_reg_top.sv b/hw/top_earlgrey/ip/pwrmgr/rtl/autogen/pwrmgr_reg_top.sv
index 0f633c4..6b34410 100644
--- a/hw/top_earlgrey/ip/pwrmgr/rtl/autogen/pwrmgr_reg_top.sv
+++ b/hw/top_earlgrey/ip/pwrmgr/rtl/autogen/pwrmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/rstmgr/rtl/autogen/rstmgr_reg_top.sv b/hw/top_earlgrey/ip/rstmgr/rtl/autogen/rstmgr_reg_top.sv
index ab0c83a..1d5da3e 100644
--- a/hw/top_earlgrey/ip/rstmgr/rtl/autogen/rstmgr_reg_top.sv
+++ b/hw/top_earlgrey/ip/rstmgr/rtl/autogen/rstmgr_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
index 8ef2424..55c0b9d 100644
--- a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
+++ b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
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 655d8e7..f2b6303 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
@@ -67,7 +67,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(1)
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -77,7 +80,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/util/reggen/reg_block.py b/util/reggen/reg_block.py
index 13f811f..30a4f74 100644
--- a/util/reggen/reg_block.py
+++ b/util/reggen/reg_block.py
@@ -30,6 +30,9 @@
         self.registers = []  # type: List[Register]
         self.windows = []  # type: List[Window]
 
+        # Boolean indication whether ANY window in regblock has data integrity passthrough
+        self.has_data_intg_passthru = False
+
         # A list of all registers, expanding multiregs, ordered by offset
         self.flat_regs = []  # type: List[Register]
 
@@ -245,6 +248,8 @@
         assert self.offset <= window.offset
         self.offset = window.next_offset(self._addrsep)
 
+        self.has_data_intg_passthru |= window.data_intg_passthru
+
     def validate(self) -> None:
         '''Run this to check consistency after all registers have been added'''
 
diff --git a/util/reggen/reg_top.sv.tpl b/util/reggen/reg_top.sv.tpl
index d925c74..d1a9a9c 100644
--- a/util/reggen/reg_top.sv.tpl
+++ b/util/reggen/reg_top.sv.tpl
@@ -36,6 +36,10 @@
                 rb.windows[0].offset != 0 or
                 rb.windows[0].size_in_bytes != (1 << addr_width)))
 
+
+  common_data_intg_gen = 0 if rb.has_data_intg_passthru else 1
+  adapt_data_intg_gen = 1 if rb.has_data_intg_passthru else 0
+  assert common_data_intg_gen != adapt_data_intg_gen
 %>
 `include "prim_assert.sv"
 
@@ -115,7 +119,10 @@
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
-  tlul_rsp_intg_gen u_rsp_intg_gen (
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(1),
+    .EnableDataIntgGen(${common_data_intg_gen})
+  ) u_rsp_intg_gen (
     .tl_i(tl_o_pre),
     .tl_o
   );
@@ -144,7 +151,19 @@
   % endif
   % for i,t in enumerate(rb.windows):
   assign tl_win_o[${i}] = tl_socket_h2d[${i}];
+    % if common_data_intg_gen == 0 and rb.windows[i].data_intg_passthru == False:
+    ## If there are multiple windows, and not every window has data integrity
+    ## passthrough, we must generate data integrity for it here.
+  tlul_rsp_intg_gen #(
+    .EnableRspIntgGen(0),
+    .EnableDataIntgGen(1)
+  ) u_win${i}_data_intg_gen (
+    .tl_i(tl_win_i[${i}]),
+    .tl_o(tl_socket_d2h[${i}])
+  );
+    % else:
   assign tl_socket_d2h[${i}] = tl_win_i[${i}];
+    % endif
   % endfor
 
   // Create Socket_1n
@@ -204,7 +223,8 @@
 
   tlul_adapter_reg #(
     .RegAw(AW),
-    .RegDw(DW)
+    .RegDw(DW),
+    .EnableDataIntgGen(${adapt_data_intg_gen})
   ) u_reg_if (
     .clk_i,
     .rst_ni,
diff --git a/util/reggen/window.py b/util/reggen/window.py
index 6ca61e6..d4355c8 100644
--- a/util/reggen/window.py
+++ b/util/reggen/window.py
@@ -19,6 +19,10 @@
 # TODO potential for additional optional to give more type info?
 # eg sram-hw-port: "none", "sync", "async"
 OPTIONAL_FIELDS = {
+    'data-intg-passthru': [
+        's', "True if the window has data integrity pass through. "
+        "Defaults to false if not present."
+    ],
     'byte-write': [
         's', "True if byte writes are supported. "
         "Defaults to false if not present."
@@ -47,6 +51,7 @@
                  desc: str,
                  unusual: bool,
                  byte_write: bool,
+                 data_intg_passthru: bool,
                  validbits: int,
                  items: int,
                  size_in_bytes: int,
@@ -59,6 +64,7 @@
         self.desc = desc
         self.unusual = unusual
         self.byte_write = byte_write
+        self.data_intg_passthru = data_intg_passthru
         self.validbits = validbits
         self.items = items
         self.size_in_bytes = size_in_bytes
@@ -89,6 +95,8 @@
                              'unusual field for ' + wind_desc)
         byte_write = check_bool(rd.get('byte-write', False),
                                 'byte-write field for ' + wind_desc)
+        data_intg_passthru = check_bool(rd.get('data-intg-passthru', False),
+                                        'data-intg-passthru field for ' + wind_desc)
 
         validbits = check_int(rd.get('validbits', reg_width),
                               'validbits field for ' + wind_desc)
@@ -140,7 +148,7 @@
                              'to do this, set the "unusual" flag.'
                              .format(wind_desc, swaccess.key))
 
-        return Window(name, desc, unusual, byte_write,
+        return Window(name, desc, unusual, byte_write, data_intg_passthru,
                       validbits, items, size_in_bytes, offset, swaccess)
 
     def next_offset(self, addrsep: int) -> int:
diff --git a/util/topgen.py b/util/topgen.py
index 0b562b1..e14f447 100755
--- a/util/topgen.py
+++ b/util/topgen.py
@@ -790,7 +790,7 @@
     # together with a map of interface addresses.
     inst_to_block = {}  # type: Dict[str, str]
     if_addrs = {}  # type: Dict[Tuple[str, Optional[str]], int],
-    attrs = {} # type: Dict[str, str]
+    attrs = {}  # type: Dict[str, str]
 
     for module in top['module']:
         inst_name = module['name']
@@ -798,7 +798,8 @@
         block = name_to_block[block_name]
         if "attr" in module:
             if module["attr"] not in ['templated', 'reggen_top', 'reggen_only']:
-                raise ValueError('Unsupported value for attr field of {}: {!r}'.format(what, attr))
+                raise ValueError('Unsupported value for attr field of {}: {!r}'.
+                                 format(block_name, module["attr"]))
             attrs[inst_name] = module["attr"]
 
         inst_to_block[inst_name] = block_name
@@ -811,6 +812,8 @@
     for item in list(top.get("memory", [])):
         byte_write = ('byte_write' in item and
                       item["byte_write"].lower() == "true")
+        data_intg_passthru = ('data_intg_passthru' in item and
+                              item["data_intg_passthru"].lower() == "true")
         size_in_bytes = int(item['size'], 0)
         num_regs = size_in_bytes // addrsep
         swaccess = access.SWAccess('top-level memory',
@@ -820,6 +823,7 @@
                                   desc='(generated from top-level)',
                                   unusual=False,
                                   byte_write=byte_write,
+                                  data_intg_passthru=data_intg_passthru,
                                   validbits=regwidth,
                                   items=num_regs,
                                   size_in_bytes=size_in_bytes,
@@ -1135,8 +1139,6 @@
     # Generic Inter-module connection
     im.elab_intermodule(completecfg)
 
-    top_name = completecfg["name"]
-
     # Generate top.gen.hjson right before rendering
     genhjson_dir = out_path / "data/autogen"
     genhjson_dir.mkdir(parents=True, exist_ok=True)