Initial hjson + reg  commit for I2C

- Definition of registers and interrupts
- Creation of register hardware
- Support For override mode
- Emulation of "Virtual Open Drain" outputs on SCL/SDA (i.e. "1" maps to "Z" at output)
diff --git a/hw/ip/i2c/doc/i2c.hjson b/hw/ip/i2c/doc/i2c.hjson
new file mode 100644
index 0000000..7fc713d
--- /dev/null
+++ b/hw/ip/i2c/doc/i2c.hjson
@@ -0,0 +1,381 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+{ name: "i2c"
+  clock_primary: "clk_fixed"
+  bus_device: "tlul"
+  bus_host: "none"
+  // INPUT pins
+  available_input_list: [
+    { name: "sda_rx", desc: "Serial input data bit" }
+    { name: "scl_rx", desc: "Serial input clock bit" }
+  ]
+  // OUTPUT pins
+  available_output_list: [
+    { name: "sda_tx", desc: "Serial output data bit" }
+    { name: "scl_tx", desc: "Serial output clock bit" }
+  ]
+  // INTERRUPT pins
+  interrupt_list: [
+    { name: "fmt_watermark"
+      desc: "raised when the FMT FIFO depth falls below the lowwater mark."
+    }
+    { name: "rx_watermark"
+      desc: "raised if the RX FIFO is past the highwater mark."
+    }
+    { name: "fmt_overflow"
+      desc: "raised if the FMT FIFO has overflowed."
+    }
+    { name: "rx_overflow"
+      desc: "raised if the RX FIFO has overflowed."
+    }
+    { name: "nak"
+      desc: "raised if there is no ACK in response to an address or data write"
+    }
+    { name: "scl_interference"
+      desc: "raised if the SCL line drops early (not supported without clock synchronization)."
+    }
+    { name: "sda_interference"
+      desc: "raised if the SDA line goes low when master is trying to assert high"
+    }
+    { name: "stretch_timeout"
+      desc: "raised if target stretches the clock beyond the allowed timeout period"
+    }
+    { name: "sda_unstable"
+      desc: "raised if the target does not assert a constant value of SDA during transmission."
+    }
+  ]
+
+  // REGISTER definition
+  regwidth: "32"
+  registers: [
+    // CTRL register
+    { name: "CTRL"
+      desc: "I2C control register (Functions TBD)"
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "0"
+          resval: "0"
+          name: "ENABLEHOST"
+          desc: '''
+	        Enable Host I2C functionality
+                '''
+        }
+      ]
+    }
+    { name:     "STATUS"
+      desc:     "I2C live status register"
+      swaccess: "ro"
+      hwaccess: "hrw"
+      hwext:    "true"
+      hwre:     "true"
+      fields: [
+        { bits: "0"
+          name: "FMTFULL"
+          desc: "TX buffer is full"
+        }
+        { bits: "1"
+          name: "RXFULL"
+          desc: "RX buffer is full"
+        }
+        { bits: "2"
+          name: "FMTEMPTY"
+          desc: "FMT FIFO is empty"
+          resval: "1"
+        }
+	{ bits: "5"
+          name: "RXEMPTY"
+          desc: "RX FIFO is empty"
+          resval: "1"
+        }
+        { bits: "3"
+          name: "HOSTIDLE"
+          desc: "Host functionality is idle. No Host transaction is in progress"
+          resval: "1"
+        }
+        { bits: "4"
+          name: "TARGETIDLE"
+          desc: "Target functionality is idle No Target transaction is in progress"
+          resval: "1"
+        }
+      ]
+    }
+    { name: "RDATA"
+      desc: "I2C read data"
+      swaccess: "ro"
+      hwext: "true"
+      hwre: "true"
+      fields: [
+        {bits: "7:0"}
+      ]
+    }
+    { name: "FDATA"
+      desc: "I2C Format Data"
+      swaccess: "wo"
+      hwaccess: "hro"
+      hwqe: "true"
+      fields: [
+        { bits: "7:0"
+          name: "FBYTE"
+          desc: "Format Byte. Directly transmitted if no flags are set."
+        }
+        { bits: "8"
+          name: "START"
+	  desc: "Issue a START condition before transmitting BYTE."
+        }
+        { bits: "9"
+          name: "STOP"
+          desc: "Issue a STOP condition after this operation"
+	}
+        { bits: "10"
+          name: "READ"
+          desc: "Read BYTE bytes from I2C. (256 if BYTE==0)"
+        }
+        { bits: "11"
+          name: "RCONT"
+          desc: "Do not NAK the last byte read, let the read operation continue"
+        }
+        { bits: "12"
+          name: "NAKOK"
+          desc: "Do not signal an exception if the current byte is not ACK'd"
+        }
+      ]
+    }
+    { name: "FIFO_CTRL"
+      desc: "I2C FIFO control register"
+      swaccess: "rw"
+      hwaccess: "hro"
+      hwqe: "true"
+      fields: [
+        { bits: "0"
+          swaccess: "wo"
+          name: "RXRST"
+          desc: "RX fifo reset. Write 1 to the register resets RX_FIFO. Read returns 0"
+        }
+        { bits: "1"
+          swaccess: "wo"
+          name: "FMTRST"
+          desc: "FMT fifo reset. Write 1 to the register resets FMT_FIFO. Read returns 0"
+        }
+        { bits: "4:2"
+          name: "RXILVL"
+          desc: '''Trigger level for RX interrupts. If the FIFO depth exceeds
+                this setting, it raises rx_watermark interrupt.
+                '''
+          enum: [
+            { value: "0",
+              name: "rxlvl1",
+              desc: "1 character"
+            },
+            { value: "1",
+              name: "rxlvl4",
+              desc: "4 characters"
+            },
+            { value: "2",
+              name: "rxlvl8",
+              desc: "8 characters"
+            },
+            { value: "3",
+              name: "rxlvl16",
+              desc: "16 characters"
+            },
+            { value: "4",
+              name: "rxlvl30",
+              desc: "30 characters"
+            },
+          ]
+        }
+        { bits: "6:5"
+          name: "FMTILVL"
+          desc: '''Trigger level for FMT interrupts. If the FIFO depth falls below
+                this setting, it raises fmt_watermark interrupt.
+                '''
+          enum: [
+            { value: "0",
+              name: "fmtlvl1"
+              desc: "1 character"
+            },
+            { value: "1",
+              name: "fmtlvl4",
+              desc: "4 characters"
+            },
+            { value: "2",
+              name: "fmtlvl8",
+              desc: "8 characters"
+            },
+            { value: "3",
+              name: "fmtlvl16",
+              desc: "16 characters"
+            }
+          ]
+        }
+      ]
+    }
+    { name: "FIFO_STATUS"
+      desc: "I2C FIFO status register"
+      swaccess: "ro"
+      hwaccess: "hwo"
+      hwext: "true"
+      fields: [
+        { bits: "5:0"
+          name: "FMTLVL"
+          desc: "Current fill level of FMT fifo"
+        }
+        { bits: "21:16"
+          name: "RXLVL"
+          desc: "Current fill level of RX fifo"
+        }
+      ]
+    }
+    { name: "OVRD"
+      desc: "I2C override control register"
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "0",
+          name: "TXOVRDEN",
+          desc: "Override the SDA and SCL TX signals."
+        }
+        { bits: "1",
+          name: "SCLVAL",
+          desc: "Value for SCL Override. Set to 0 to drive TX Low, and set to 1 for high-Z"
+        }
+        { bits: "2",
+          name: "SDAVAL",
+          desc: "Value for SDA Override. Set to 0 to drive TX Low, and set to 1 for high-Z"
+        }
+      ]
+    }
+    { name: "VAL"
+      desc: "Oversampled RX values"
+      swaccess: "ro"
+      hwaccess: "hwo"
+      hwext:    "true"
+      fields: [
+        { bits: "15:0"
+          name: "SCL_RX"
+          desc: '''
+                Last 16 oversampled values of SCL. Most recent bit is bit 0, oldest 15.
+                '''
+        }
+        { bits: "31:16"
+          name: "SDA_RX"
+          desc: '''
+                Last 16 oversampled values of SDA. Most recent bit is bit 16, oldest 31.
+                '''
+        }
+      ]
+    }
+
+    { name: "TIMING0"
+      desc: '''
+            Detailed I2C Timings (directly corresponding to table 10 in the I2C Specification).
+            All values are expressed in units of the input clock period.
+            '''
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "15:0"
+          name: "THIGH"
+          desc: "The minimum time to hold SCL high in a given pulse"
+        }
+        { bits: "31:16"
+          name: "TLOW"
+          desc: "The minimum time to hold SCL low between any two SCL pulses"
+        }
+      ]
+    }
+    { name: "TIMING1",
+      desc: '''
+            Detailed I2C Timings (directly corresponding to table 10 in the I2C Specification).
+            All values are expressed in units of the input clock period.
+            '''
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "15:0"
+          name: "T_R"
+          desc: "The nominal rise time to anticipate for the bus (depends on capacitance)"
+        }
+        { bits: "31:16"
+          name: "T_F"
+          desc: "The nominal fall time to anticipate for the bus (influences SDA hold times)"
+        }
+      ]
+    }
+    { name: "TIMING2"
+      desc: '''
+            Detailed I2C Timings (directly corresponding to table 10 in the I2C Specification).
+            All values are expressed in units of the input clock period.
+            '''
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "15:0"
+          name: "TSU_STA"
+          desc: "Minimum setup time for repeated start signals"
+        }
+        { bits: "31:16"
+          name: "THD_ST"
+          desc: "Minimum hold time for start signals"
+        }
+      ]
+    }
+    { name: "TIMING3"
+      desc: '''
+            Detailed I2C Timings (directly corresponding to table 10, in the I2C Specification).
+            All values are expressed in units of the input clock period.
+            '''
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "15:0"
+          name: "TSU_DAT"
+          desc: "Minimum setup time for data (or ack) bits"
+        }
+        { bits: "31:16"
+          name: "THD_DAT"
+          desc: '''
+                Minimum hold time for data (or ack) bits
+                (Note, where required, the parameters TVD_DAT is taken to be THD_DAT+T_F)
+                '''
+        }
+      ]
+    }
+    { name: "TIMING4"
+      desc: '''
+            Detailed I2C Timings (directly corresponding to table 10, in the I2C Specification).
+            All values are expressed in units of the input clock period.
+            '''
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "15:0"
+          name: "TSU_STO"
+          desc: "Minimum setup time for stop signals"
+        }
+        { bits: "31:16"
+          name: "T_BUF"
+          desc: "Minimum time between each STOP signal and the following START signal"
+        }
+      ]
+    }
+    { name: "TIMEOUT_CTRL"
+      desc: "I2C clock stretching timeout control"
+      swaccess: "rw"
+      hwaccess: "hro"
+      fields: [
+        { bits: "30:0"
+          name: "VAL"
+          desc: "Clock stretching timeout value (in units of input clock frequency)"
+        }
+        { bits: "31"
+          name: "EN"
+          desc: "Enable timeout feature"
+        }
+      ]
+    }
+  ]
+}
diff --git a/hw/ip/i2c/i2c.core b/hw/ip/i2c/i2c.core
new file mode 100644
index 0000000..8c6d05c
--- /dev/null
+++ b/hw/ip/i2c/i2c.core
@@ -0,0 +1,24 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:ip:i2c:0.1"
+description: "i2c"
+filesets:
+  files_rtl:
+    depend:
+      - lowrisc:constants:top_pkg
+      - lowrisc:prim:all
+      - lowrisc:ip:tlul
+    files:
+      - rtl/i2c_reg_pkg.sv
+      - rtl/i2c_reg_top.sv
+      - rtl/i2c_core.sv
+      - rtl/i2c.sv
+    file_type: systemVerilogSource
+
+targets:
+  default: &default_target
+    filesets:
+      - files_rtl
+    toplevel: i2c
diff --git a/hw/ip/i2c/rtl/i2c.sv b/hw/ip/i2c/rtl/i2c.sv
new file mode 100644
index 0000000..4dca14c
--- /dev/null
+++ b/hw/ip/i2c/rtl/i2c.sv
@@ -0,0 +1,87 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: I2C top level wrapper file
+
+module i2c (
+  input                     clk_i,
+  input                     rst_ni,
+
+  // Bus Interface
+  input  tlul_pkg::tl_h2d_t tl_i,
+  output tlul_pkg::tl_d2h_t tl_o,
+
+  // Generic IO
+  input                     cio_scl_i,
+  output logic              cio_scl_o,
+  output logic              cio_scl_en_o,
+  input                     cio_sda_i,
+  output logic              cio_sda_o,
+  output logic              cio_sda_en_o,
+
+  // Interrupts
+  output logic              intr_fmt_watermark_o,
+  output logic              intr_rx_watermark_o,
+  output logic              intr_fmt_overflow_o,
+  output logic              intr_rx_overflow_o,
+  output logic              intr_nak_o,
+  output logic              intr_scl_interference_o,
+  output logic              intr_sda_interference_o,
+  output logic              intr_stretch_timeout_o,
+  output logic              intr_sda_unstable_o
+);
+
+  import i2c_reg_pkg::*;
+
+  i2c_reg2hw_t reg2hw;
+  i2c_hw2reg_t hw2reg;
+
+  logic devmode;
+
+  i2c_reg_top u_reg (
+    .clk_i,
+    .rst_ni,
+    .tl_i,
+    .tl_o,
+    .reg2hw,
+    .hw2reg,
+    .devmode_i(1'b1)
+  );
+
+  logic scl_int;
+  logic sda_int;
+
+  i2c_core i2c_core (
+    .clk_i,
+    .rst_ni,
+    .reg2hw,
+    .hw2reg,
+
+    .scl_i(cio_scl_i),
+    .scl_o(scl_int),
+    .sda_i(cio_sda_i),
+    .sda_o(sda_int),
+
+    .intr_fmt_watermark_o,
+    .intr_rx_watermark_o,
+    .intr_fmt_overflow_o,
+    .intr_rx_overflow_o,
+    .intr_nak_o,
+    .intr_scl_interference_o,
+    .intr_sda_interference_o,
+    .intr_stretch_timeout_o,
+    .intr_sda_unstable_o
+  );
+
+  // For I2C, in standard, fast and fast-plus modes, outputs simulated as open-drain outputs.
+  // Asserting scl or sda high should be equivalent to a tri-state output.
+  // The output, when enabled, should only assert low.
+
+  assign cio_scl_o = 1'b0;
+  assign cio_sda_o = 1'b0;
+
+  assign cio_scl_en_o = ~scl_int;
+  assign cio_sda_en_o = ~sda_int;
+
+endmodule
diff --git a/hw/ip/i2c/rtl/i2c_core.sv b/hw/ip/i2c/rtl/i2c_core.sv
new file mode 100644
index 0000000..b7dad63
--- /dev/null
+++ b/hw/ip/i2c/rtl/i2c_core.sv
@@ -0,0 +1,213 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: UART core module
+
+module  i2c_core (
+  input                            clk_i,
+  input                            rst_ni,
+
+  input i2c_reg_pkg::i2c_reg2hw_t  reg2hw,
+  output i2c_reg_pkg::i2c_hw2reg_t hw2reg,
+
+  input                            scl_i,
+  output logic                     scl_o,
+  input                            sda_i,
+  output logic                     sda_o,
+
+  output logic                     intr_fmt_watermark_o,
+  output logic                     intr_rx_watermark_o,
+  output logic                     intr_fmt_overflow_o,
+  output logic                     intr_rx_overflow_o,
+  output logic                     intr_nak_o,
+  output logic                     intr_scl_interference_o,
+  output logic                     intr_sda_interference_o,
+  output logic                     intr_stretch_timeout_o,
+  output logic                     intr_sda_unstable_o
+);
+
+  logic [15:0] thigh;
+  logic [15:0] tlow;
+  logic [15:0] t_r;
+  logic [15:0] t_f;
+  logic [15:0] tsu_sta;
+  logic [15:0] tsu_sto;
+  logic [15:0] thd_st;
+  logic [15:0] tsu_dat;
+  logic [15:0] thd_dat;
+  logic [15:0] t_buf;
+
+  logic scl_out_fsm;
+  logic sda_out_fsm;
+
+  logic event_fmt_watermark;
+  logic event_rx_watermark;
+  logic event_fmt_overflow;
+  logic event_rx_overflow;
+  logic event_nak;
+  logic event_scl_interference;
+  logic event_sda_interference;
+  logic event_stretch_timeout;
+  logic event_sda_unstable;
+
+  logic [15:0] scl_rx_val;
+  logic [15:0] sda_rx_val;
+
+  logic override;
+
+  assign override = reg2hw.ovrd.txovrden;
+
+  // placeholder until FSM in place
+  assign sclout_fsm = 1'b0;
+  assign sdaout_fsm = 1'b0;
+
+  // placeholders for unused output registers
+  assign hw2reg.status.fmtfull.d = 1'b0;
+  assign hw2reg.status.rxfull.d = 1'b0;
+  assign hw2reg.status.fmtempty.d = 1'b0;
+  assign hw2reg.status.hostidle.d = 1'b1;
+  assign hw2reg.status.targetidle.d = 1'b1;
+  assign hw2reg.status.rxempty.d = 1'b0;
+  assign hw2reg.fifo_status.fmtlvl.d = 5'b0;
+  assign hw2reg.fifo_status.rxlvl.d = 5'b0;
+
+
+  assign scl_o = override ? reg2hw.ovrd.sclval : scl_out_fsm;
+  assign sda_o = override ? reg2hw.ovrd.sdaval : sda_out_fsm;
+
+  // TODO: Establish a sample clock period for scl and sda
+  always_ff @(posedge clk_i or negedge rst_ni) begin
+    if(!rst_ni) begin
+       scl_rx_val <= 16'h0;
+       sda_rx_val <= 16'h0;
+    end else begin
+       scl_rx_val <= {scl_rx_val[14:0], scl_i};
+       sda_rx_val <= {sda_rx_val[14:0], sda_i};
+    end
+  end
+
+  assign hw2reg.val.scl_rx.d = scl_rx_val;
+  assign hw2reg.val.sda_rx.d = sda_rx_val;
+
+  assign thigh = reg2hw.timing0.thigh.q;
+  assign tlow = reg2hw.timing0.tlow.q;
+  assign t_r = reg2hw.timing1.t_r.q;
+  assign t_f = reg2hw.timing1.t_f.q;
+  assign tsu_sta = reg2hw.timing2.tsu_sta.q;
+  assign thd_st = reg2hw.timing2.thd_st.q;
+  assign tsu_dat = reg2hw.timing3.tsu_dat.q;
+  assign thd_dat = reg2hw.timing3.thd_dat.q;
+  assign tsu_sto = reg2hw.timing4.tsu_sto.q;
+  assign t_buf = reg2hw.timing4.t_buf.q;
+
+  assign event_fmt_watermark = 1'b0;
+  assign event_rx_watermark = 1'b0;
+  assign event_fmt_overflow = 1'b0;
+  assign event_rx_overflow = 1'b0;
+  assign event_nak = 1'b0;
+  assign event_scl_interference = 1'b0;
+  assign event_sda_interference = 1'b0;
+  assign event_stretch_timeout = 1'b0;
+  assign event_sda_unstable = 1'b0;
+
+  prim_intr_hw #(.Width(1)) intr_hw_fmt_watermark (
+    .event_intr_i           (event_fmt_watermark),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.fmt_watermark.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.fmt_watermark.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.fmt_watermark.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.fmt_watermark.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.fmt_watermark.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.fmt_watermark.d),
+    .intr_o                 (intr_fmt_watermark_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_rx_watermark (
+    .event_intr_i           (event_rx_watermark),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.rx_watermark.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.rx_watermark.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.rx_watermark.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.rx_watermark.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.rx_watermark.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.rx_watermark.d),
+    .intr_o                 (intr_rx_watermark_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_fmt_overflow (
+    .event_intr_i           (event_fmt_overflow),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.fmt_overflow.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.fmt_overflow.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.fmt_overflow.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.fmt_overflow.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.fmt_overflow.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.fmt_overflow.d),
+    .intr_o                 (intr_fmt_overflow_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_rx_overflow (
+    .event_intr_i           (event_rx_overflow),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.rx_overflow.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.rx_overflow.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.rx_overflow.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.rx_overflow.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.rx_overflow.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.rx_overflow.d),
+    .intr_o                 (intr_rx_overflow_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_nak (
+    .event_intr_i           (event_nak),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.nak.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.nak.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.nak.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.nak.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.nak.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.nak.d),
+    .intr_o                 (intr_nak_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_scl_interference (
+    .event_intr_i           (event_scl_interference),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.scl_interference.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.scl_interference.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.scl_interference.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.scl_interference.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.scl_interference.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.scl_interference.d),
+    .intr_o                 (intr_scl_interference_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_sda_interference (
+    .event_intr_i           (event_sda_interference),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.sda_interference.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.sda_interference.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.sda_interference.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.sda_interference.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.sda_interference.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.sda_interference.d),
+    .intr_o                 (intr_sda_interference_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_stretch_timeout (
+    .event_intr_i           (event_stretch_timeout),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.stretch_timeout.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.stretch_timeout.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.stretch_timeout.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.stretch_timeout.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.stretch_timeout.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.stretch_timeout.d),
+    .intr_o                 (intr_stretch_timeout_o)
+  );
+
+  prim_intr_hw #(.Width(1)) intr_hw_sda_unstable (
+    .event_intr_i           (event_sda_unstable),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.sda_unstable.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.sda_unstable.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.sda_unstable.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.sda_unstable.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.sda_unstable.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.sda_unstable.d),
+    .intr_o                 (intr_sda_unstable_o)
+  );
+
+endmodule
diff --git a/hw/ip/i2c/rtl/i2c_reg_pkg.sv b/hw/ip/i2c/rtl/i2c_reg_pkg.sv
new file mode 100644
index 0000000..bb0a305
--- /dev/null
+++ b/hw/ip/i2c/rtl/i2c_reg_pkg.sv
@@ -0,0 +1,387 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Register Package auto-generated by `reggen` containing data structure
+
+package i2c_reg_pkg;
+
+// Register to internal design logic
+typedef struct packed {
+
+  struct packed {
+    struct packed {
+      logic q; // [282]
+    } fmt_watermark;
+    struct packed {
+      logic q; // [281]
+    } rx_watermark;
+    struct packed {
+      logic q; // [280]
+    } fmt_overflow;
+    struct packed {
+      logic q; // [279]
+    } rx_overflow;
+    struct packed {
+      logic q; // [278]
+    } nak;
+    struct packed {
+      logic q; // [277]
+    } scl_interference;
+    struct packed {
+      logic q; // [276]
+    } sda_interference;
+    struct packed {
+      logic q; // [275]
+    } stretch_timeout;
+    struct packed {
+      logic q; // [274]
+    } sda_unstable;
+  } intr_state;
+  struct packed {
+    struct packed {
+      logic q; // [273]
+    } fmt_watermark;
+    struct packed {
+      logic q; // [272]
+    } rx_watermark;
+    struct packed {
+      logic q; // [271]
+    } fmt_overflow;
+    struct packed {
+      logic q; // [270]
+    } rx_overflow;
+    struct packed {
+      logic q; // [269]
+    } nak;
+    struct packed {
+      logic q; // [268]
+    } scl_interference;
+    struct packed {
+      logic q; // [267]
+    } sda_interference;
+    struct packed {
+      logic q; // [266]
+    } stretch_timeout;
+    struct packed {
+      logic q; // [265]
+    } sda_unstable;
+  } intr_enable;
+  struct packed {
+    struct packed {
+      logic q; // [264]
+      logic qe; // [263]
+    } fmt_watermark;
+    struct packed {
+      logic q; // [262]
+      logic qe; // [261]
+    } rx_watermark;
+    struct packed {
+      logic q; // [260]
+      logic qe; // [259]
+    } fmt_overflow;
+    struct packed {
+      logic q; // [258]
+      logic qe; // [257]
+    } rx_overflow;
+    struct packed {
+      logic q; // [256]
+      logic qe; // [255]
+    } nak;
+    struct packed {
+      logic q; // [254]
+      logic qe; // [253]
+    } scl_interference;
+    struct packed {
+      logic q; // [252]
+      logic qe; // [251]
+    } sda_interference;
+    struct packed {
+      logic q; // [250]
+      logic qe; // [249]
+    } stretch_timeout;
+    struct packed {
+      logic q; // [248]
+      logic qe; // [247]
+    } sda_unstable;
+  } intr_test;
+  struct packed {
+    logic [0:0] q; // [246:246]
+  } ctrl;
+  struct packed {
+    struct packed {
+      logic q; // [245]
+      logic re; // [244]
+    } fmtfull;
+    struct packed {
+      logic q; // [243]
+      logic re; // [242]
+    } rxfull;
+    struct packed {
+      logic q; // [241]
+      logic re; // [240]
+    } fmtempty;
+    struct packed {
+      logic q; // [239]
+      logic re; // [238]
+    } hostidle;
+    struct packed {
+      logic q; // [237]
+      logic re; // [236]
+    } targetidle;
+    struct packed {
+      logic q; // [235]
+      logic re; // [234]
+    } rxempty;
+  } status;
+  struct packed {
+    logic [7:0] q; // [233:226]
+    logic re; // [225]
+  } rdata;
+  struct packed {
+    struct packed {
+      logic [7:0] q; // [224:217]
+      logic qe; // [216]
+    } fbyte;
+    struct packed {
+      logic q; // [215]
+      logic qe; // [214]
+    } start;
+    struct packed {
+      logic q; // [213]
+      logic qe; // [212]
+    } stop;
+    struct packed {
+      logic q; // [211]
+      logic qe; // [210]
+    } read;
+    struct packed {
+      logic q; // [209]
+      logic qe; // [208]
+    } rcont;
+    struct packed {
+      logic q; // [207]
+      logic qe; // [206]
+    } nakok;
+  } fdata;
+  struct packed {
+    struct packed {
+      logic q; // [205]
+      logic qe; // [204]
+    } rxrst;
+    struct packed {
+      logic q; // [203]
+      logic qe; // [202]
+    } fmtrst;
+    struct packed {
+      logic [2:0] q; // [201:199]
+      logic qe; // [198]
+    } rxilvl;
+    struct packed {
+      logic [1:0] q; // [197:196]
+      logic qe; // [195]
+    } fmtilvl;
+  } fifo_ctrl;
+  struct packed {
+    struct packed {
+      logic q; // [194]
+    } txovrden;
+    struct packed {
+      logic q; // [193]
+    } sclval;
+    struct packed {
+      logic q; // [192]
+    } sdaval;
+  } ovrd;
+  struct packed {
+    struct packed {
+      logic [15:0] q; // [191:176]
+    } thigh;
+    struct packed {
+      logic [15:0] q; // [175:160]
+    } tlow;
+  } timing0;
+  struct packed {
+    struct packed {
+      logic [15:0] q; // [159:144]
+    } t_r;
+    struct packed {
+      logic [15:0] q; // [143:128]
+    } t_f;
+  } timing1;
+  struct packed {
+    struct packed {
+      logic [15:0] q; // [127:112]
+    } tsu_sta;
+    struct packed {
+      logic [15:0] q; // [111:96]
+    } thd_st;
+  } timing2;
+  struct packed {
+    struct packed {
+      logic [15:0] q; // [95:80]
+    } tsu_dat;
+    struct packed {
+      logic [15:0] q; // [79:64]
+    } thd_dat;
+  } timing3;
+  struct packed {
+    struct packed {
+      logic [15:0] q; // [63:48]
+    } tsu_sto;
+    struct packed {
+      logic [15:0] q; // [47:32]
+    } t_buf;
+  } timing4;
+  struct packed {
+    struct packed {
+      logic [30:0] q; // [31:1]
+    } val;
+    struct packed {
+      logic q; // [0]
+    } en;
+  } timeout_ctrl;
+} i2c_reg2hw_t;
+
+// Internal design logic to register
+typedef struct packed {
+
+  struct packed {
+    struct packed {
+      logic d;  // [67]
+      logic de; // [66]
+    } fmt_watermark;
+    struct packed {
+      logic d;  // [65]
+      logic de; // [64]
+    } rx_watermark;
+    struct packed {
+      logic d;  // [63]
+      logic de; // [62]
+    } fmt_overflow;
+    struct packed {
+      logic d;  // [61]
+      logic de; // [60]
+    } rx_overflow;
+    struct packed {
+      logic d;  // [59]
+      logic de; // [58]
+    } nak;
+    struct packed {
+      logic d;  // [57]
+      logic de; // [56]
+    } scl_interference;
+    struct packed {
+      logic d;  // [55]
+      logic de; // [54]
+    } sda_interference;
+    struct packed {
+      logic d;  // [53]
+      logic de; // [52]
+    } stretch_timeout;
+    struct packed {
+      logic d;  // [51]
+      logic de; // [50]
+    } sda_unstable;
+  } intr_state;
+  struct packed {
+    struct packed {
+      logic d;  // [49]
+    } fmtfull;
+    struct packed {
+      logic d;  // [48]
+    } rxfull;
+    struct packed {
+      logic d;  // [47]
+    } fmtempty;
+    struct packed {
+      logic d;  // [46]
+    } hostidle;
+    struct packed {
+      logic d;  // [45]
+    } targetidle;
+    struct packed {
+      logic d;  // [44]
+    } rxempty;
+  } status;
+  struct packed {
+    struct packed {
+      logic [5:0] d; // [43:38]
+    } fmtlvl;
+    struct packed {
+      logic [5:0] d; // [37:32]
+    } rxlvl;
+  } fifo_status;
+  struct packed {
+    struct packed {
+      logic [15:0] d; // [31:16]
+    } scl_rx;
+    struct packed {
+      logic [15:0] d; // [15:0]
+    } sda_rx;
+  } val;
+} i2c_hw2reg_t;
+
+  // Register Address
+  parameter I2C_INTR_STATE_OFFSET = 7'h 0;
+  parameter I2C_INTR_ENABLE_OFFSET = 7'h 4;
+  parameter I2C_INTR_TEST_OFFSET = 7'h 8;
+  parameter I2C_CTRL_OFFSET = 7'h c;
+  parameter I2C_STATUS_OFFSET = 7'h 10;
+  parameter I2C_RDATA_OFFSET = 7'h 14;
+  parameter I2C_FDATA_OFFSET = 7'h 18;
+  parameter I2C_FIFO_CTRL_OFFSET = 7'h 1c;
+  parameter I2C_FIFO_STATUS_OFFSET = 7'h 20;
+  parameter I2C_OVRD_OFFSET = 7'h 24;
+  parameter I2C_VAL_OFFSET = 7'h 28;
+  parameter I2C_TIMING0_OFFSET = 7'h 2c;
+  parameter I2C_TIMING1_OFFSET = 7'h 30;
+  parameter I2C_TIMING2_OFFSET = 7'h 34;
+  parameter I2C_TIMING3_OFFSET = 7'h 38;
+  parameter I2C_TIMING4_OFFSET = 7'h 3c;
+  parameter I2C_TIMEOUT_CTRL_OFFSET = 7'h 40;
+
+
+  // Register Index
+  typedef enum int {
+    I2C_INTR_STATE,
+    I2C_INTR_ENABLE,
+    I2C_INTR_TEST,
+    I2C_CTRL,
+    I2C_STATUS,
+    I2C_RDATA,
+    I2C_FDATA,
+    I2C_FIFO_CTRL,
+    I2C_FIFO_STATUS,
+    I2C_OVRD,
+    I2C_VAL,
+    I2C_TIMING0,
+    I2C_TIMING1,
+    I2C_TIMING2,
+    I2C_TIMING3,
+    I2C_TIMING4,
+    I2C_TIMEOUT_CTRL
+  } i2c_id_e;
+
+  // Register width information to check illegal writes
+  localparam logic [3:0] I2C_PERMIT [17] = '{
+    4'b 0011, // index[ 0] I2C_INTR_STATE
+    4'b 0011, // index[ 1] I2C_INTR_ENABLE
+    4'b 0011, // index[ 2] I2C_INTR_TEST
+    4'b 0001, // index[ 3] I2C_CTRL
+    4'b 0001, // index[ 4] I2C_STATUS
+    4'b 0001, // index[ 5] I2C_RDATA
+    4'b 0011, // index[ 6] I2C_FDATA
+    4'b 0001, // index[ 7] I2C_FIFO_CTRL
+    4'b 1111, // index[ 8] I2C_FIFO_STATUS
+    4'b 0001, // index[ 9] I2C_OVRD
+    4'b 1111, // index[10] I2C_VAL
+    4'b 1111, // index[11] I2C_TIMING0
+    4'b 1111, // index[12] I2C_TIMING1
+    4'b 1111, // index[13] I2C_TIMING2
+    4'b 1111, // index[14] I2C_TIMING3
+    4'b 1111, // index[15] I2C_TIMING4
+    4'b 1111  // index[16] I2C_TIMEOUT_CTRL
+  };
+endpackage
+
diff --git a/hw/ip/i2c/rtl/i2c_reg_top.sv b/hw/ip/i2c/rtl/i2c_reg_top.sv
new file mode 100644
index 0000000..e53f879
--- /dev/null
+++ b/hw/ip/i2c/rtl/i2c_reg_top.sv
@@ -0,0 +1,2095 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Register Top module auto-generated by `reggen`
+
+
+module i2c_reg_top #(
+  parameter logic LifeCycle = 1'b0 // If 0b, assume devmode 1b always
+) (
+  input clk_i,
+  input rst_ni,
+
+  // Below Regster interface can be changed
+  input  tlul_pkg::tl_h2d_t tl_i,
+  output tlul_pkg::tl_d2h_t tl_o,
+  // To HW
+  output i2c_reg_pkg::i2c_reg2hw_t reg2hw, // Write
+  input  i2c_reg_pkg::i2c_hw2reg_t hw2reg, // Read
+
+  // Config
+  input devmode_i // If 1, explicit error return for unmapped register access
+);
+
+  import i2c_reg_pkg::* ;
+
+  localparam AW = 7;
+  localparam DW = 32;
+  localparam DBW = DW/8;                    // Byte Width
+
+  // register signals
+  logic           reg_we;
+  logic           reg_re;
+  logic [AW-1:0]  reg_addr;
+  logic [DW-1:0]  reg_wdata;
+  logic [DBW-1:0] reg_be;
+  logic [DW-1:0]  reg_rdata;
+  logic           reg_error;
+
+  logic          addrmiss, wr_err;
+
+  logic [DW-1:0] reg_rdata_next;
+
+  tlul_pkg::tl_h2d_t tl_reg_h2d;
+  tlul_pkg::tl_d2h_t tl_reg_d2h;
+
+  assign tl_reg_h2d = tl_i;
+  assign tl_o       = tl_reg_d2h;
+
+  tlul_adapter_reg #(
+    .RegAw(AW),
+    .RegDw(DW)
+  ) u_reg_if (
+    .clk_i,
+    .rst_ni,
+
+    .tl_i (tl_reg_h2d),
+    .tl_o (tl_reg_d2h),
+
+    .we_o    (reg_we),
+    .re_o    (reg_re),
+    .addr_o  (reg_addr),
+    .wdata_o (reg_wdata),
+    .be_o    (reg_be),
+    .rdata_i (reg_rdata),
+    .error_i (reg_error)
+  );
+
+  assign reg_rdata = reg_rdata_next ;
+
+  // Ignore devmode_i if this register module isn't used in LifeCycle managed IP
+  // And mandate to return error for address miss
+
+  logic  devmode ;
+  assign devmode = LifeCycle ? devmode_i : 1'b1;
+
+  assign reg_error = (devmode & addrmiss) | wr_err ;
+
+  // TODO(eunchan): Revise Register Interface logic after REG INTF finalized
+  // TODO(eunchan): Make concrete scenario
+  //    1. Write: No response, so that it can guarantee a request completes a clock after we
+  //              It means, bus_reg_ready doesn't have to be lowered.
+  //    2. Read: response. So bus_reg_ready should assert after reg_bus_valid & reg_bus_ready
+  //               _____         _____
+  // a_valid _____/     \_______/     \______
+  //         ___________         _____
+  // a_ready            \_______/     \______ <- ERR though no logic malfunction
+  //                     _____________
+  // d_valid ___________/             \______
+  //                             _____
+  // d_ready ___________________/     \______
+  //
+  // Above example is fine but if r.b.r doesn't assert within two cycle, then it can be wrong.
+
+  // Define SW related signals
+  // Format: <reg>_<field>_{wd|we|qs}
+  //        or <reg>_{wd|we|qs} if field == 1 or 0
+  logic intr_state_fmt_watermark_qs;
+  logic intr_state_fmt_watermark_wd;
+  logic intr_state_fmt_watermark_we;
+  logic intr_state_rx_watermark_qs;
+  logic intr_state_rx_watermark_wd;
+  logic intr_state_rx_watermark_we;
+  logic intr_state_fmt_overflow_qs;
+  logic intr_state_fmt_overflow_wd;
+  logic intr_state_fmt_overflow_we;
+  logic intr_state_rx_overflow_qs;
+  logic intr_state_rx_overflow_wd;
+  logic intr_state_rx_overflow_we;
+  logic intr_state_nak_qs;
+  logic intr_state_nak_wd;
+  logic intr_state_nak_we;
+  logic intr_state_scl_interference_qs;
+  logic intr_state_scl_interference_wd;
+  logic intr_state_scl_interference_we;
+  logic intr_state_sda_interference_qs;
+  logic intr_state_sda_interference_wd;
+  logic intr_state_sda_interference_we;
+  logic intr_state_stretch_timeout_qs;
+  logic intr_state_stretch_timeout_wd;
+  logic intr_state_stretch_timeout_we;
+  logic intr_state_sda_unstable_qs;
+  logic intr_state_sda_unstable_wd;
+  logic intr_state_sda_unstable_we;
+  logic intr_enable_fmt_watermark_qs;
+  logic intr_enable_fmt_watermark_wd;
+  logic intr_enable_fmt_watermark_we;
+  logic intr_enable_rx_watermark_qs;
+  logic intr_enable_rx_watermark_wd;
+  logic intr_enable_rx_watermark_we;
+  logic intr_enable_fmt_overflow_qs;
+  logic intr_enable_fmt_overflow_wd;
+  logic intr_enable_fmt_overflow_we;
+  logic intr_enable_rx_overflow_qs;
+  logic intr_enable_rx_overflow_wd;
+  logic intr_enable_rx_overflow_we;
+  logic intr_enable_nak_qs;
+  logic intr_enable_nak_wd;
+  logic intr_enable_nak_we;
+  logic intr_enable_scl_interference_qs;
+  logic intr_enable_scl_interference_wd;
+  logic intr_enable_scl_interference_we;
+  logic intr_enable_sda_interference_qs;
+  logic intr_enable_sda_interference_wd;
+  logic intr_enable_sda_interference_we;
+  logic intr_enable_stretch_timeout_qs;
+  logic intr_enable_stretch_timeout_wd;
+  logic intr_enable_stretch_timeout_we;
+  logic intr_enable_sda_unstable_qs;
+  logic intr_enable_sda_unstable_wd;
+  logic intr_enable_sda_unstable_we;
+  logic intr_test_fmt_watermark_wd;
+  logic intr_test_fmt_watermark_we;
+  logic intr_test_rx_watermark_wd;
+  logic intr_test_rx_watermark_we;
+  logic intr_test_fmt_overflow_wd;
+  logic intr_test_fmt_overflow_we;
+  logic intr_test_rx_overflow_wd;
+  logic intr_test_rx_overflow_we;
+  logic intr_test_nak_wd;
+  logic intr_test_nak_we;
+  logic intr_test_scl_interference_wd;
+  logic intr_test_scl_interference_we;
+  logic intr_test_sda_interference_wd;
+  logic intr_test_sda_interference_we;
+  logic intr_test_stretch_timeout_wd;
+  logic intr_test_stretch_timeout_we;
+  logic intr_test_sda_unstable_wd;
+  logic intr_test_sda_unstable_we;
+  logic ctrl_qs;
+  logic ctrl_wd;
+  logic ctrl_we;
+  logic status_fmtfull_qs;
+  logic status_fmtfull_re;
+  logic status_rxfull_qs;
+  logic status_rxfull_re;
+  logic status_fmtempty_qs;
+  logic status_fmtempty_re;
+  logic status_hostidle_qs;
+  logic status_hostidle_re;
+  logic status_targetidle_qs;
+  logic status_targetidle_re;
+  logic status_rxempty_qs;
+  logic status_rxempty_re;
+  logic [7:0] rdata_qs;
+  logic rdata_re;
+  logic [7:0] fdata_fbyte_wd;
+  logic fdata_fbyte_we;
+  logic fdata_start_wd;
+  logic fdata_start_we;
+  logic fdata_stop_wd;
+  logic fdata_stop_we;
+  logic fdata_read_wd;
+  logic fdata_read_we;
+  logic fdata_rcont_wd;
+  logic fdata_rcont_we;
+  logic fdata_nakok_wd;
+  logic fdata_nakok_we;
+  logic fifo_ctrl_rxrst_wd;
+  logic fifo_ctrl_rxrst_we;
+  logic fifo_ctrl_fmtrst_wd;
+  logic fifo_ctrl_fmtrst_we;
+  logic [2:0] fifo_ctrl_rxilvl_qs;
+  logic [2:0] fifo_ctrl_rxilvl_wd;
+  logic fifo_ctrl_rxilvl_we;
+  logic [1:0] fifo_ctrl_fmtilvl_qs;
+  logic [1:0] fifo_ctrl_fmtilvl_wd;
+  logic fifo_ctrl_fmtilvl_we;
+  logic [5:0] fifo_status_fmtlvl_qs;
+  logic fifo_status_fmtlvl_re;
+  logic [5:0] fifo_status_rxlvl_qs;
+  logic fifo_status_rxlvl_re;
+  logic ovrd_txovrden_qs;
+  logic ovrd_txovrden_wd;
+  logic ovrd_txovrden_we;
+  logic ovrd_sclval_qs;
+  logic ovrd_sclval_wd;
+  logic ovrd_sclval_we;
+  logic ovrd_sdaval_qs;
+  logic ovrd_sdaval_wd;
+  logic ovrd_sdaval_we;
+  logic [15:0] val_scl_rx_qs;
+  logic val_scl_rx_re;
+  logic [15:0] val_sda_rx_qs;
+  logic val_sda_rx_re;
+  logic [15:0] timing0_thigh_qs;
+  logic [15:0] timing0_thigh_wd;
+  logic timing0_thigh_we;
+  logic [15:0] timing0_tlow_qs;
+  logic [15:0] timing0_tlow_wd;
+  logic timing0_tlow_we;
+  logic [15:0] timing1_t_r_qs;
+  logic [15:0] timing1_t_r_wd;
+  logic timing1_t_r_we;
+  logic [15:0] timing1_t_f_qs;
+  logic [15:0] timing1_t_f_wd;
+  logic timing1_t_f_we;
+  logic [15:0] timing2_tsu_sta_qs;
+  logic [15:0] timing2_tsu_sta_wd;
+  logic timing2_tsu_sta_we;
+  logic [15:0] timing2_thd_st_qs;
+  logic [15:0] timing2_thd_st_wd;
+  logic timing2_thd_st_we;
+  logic [15:0] timing3_tsu_dat_qs;
+  logic [15:0] timing3_tsu_dat_wd;
+  logic timing3_tsu_dat_we;
+  logic [15:0] timing3_thd_dat_qs;
+  logic [15:0] timing3_thd_dat_wd;
+  logic timing3_thd_dat_we;
+  logic [15:0] timing4_tsu_sto_qs;
+  logic [15:0] timing4_tsu_sto_wd;
+  logic timing4_tsu_sto_we;
+  logic [15:0] timing4_t_buf_qs;
+  logic [15:0] timing4_t_buf_wd;
+  logic timing4_t_buf_we;
+  logic [30:0] timeout_ctrl_val_qs;
+  logic [30:0] timeout_ctrl_val_wd;
+  logic timeout_ctrl_val_we;
+  logic timeout_ctrl_en_qs;
+  logic timeout_ctrl_en_wd;
+  logic timeout_ctrl_en_we;
+
+  // Register instances
+  // R[intr_state]: V(False)
+
+  //   F[fmt_watermark]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_fmt_watermark (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_fmt_watermark_we),
+    .wd     (intr_state_fmt_watermark_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.fmt_watermark.de),
+    .d      (hw2reg.intr_state.fmt_watermark.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.fmt_watermark.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_fmt_watermark_qs)
+  );
+
+
+  //   F[rx_watermark]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_rx_watermark (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_rx_watermark_we),
+    .wd     (intr_state_rx_watermark_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.rx_watermark.de),
+    .d      (hw2reg.intr_state.rx_watermark.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.rx_watermark.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_rx_watermark_qs)
+  );
+
+
+  //   F[fmt_overflow]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_fmt_overflow (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_fmt_overflow_we),
+    .wd     (intr_state_fmt_overflow_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.fmt_overflow.de),
+    .d      (hw2reg.intr_state.fmt_overflow.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.fmt_overflow.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_fmt_overflow_qs)
+  );
+
+
+  //   F[rx_overflow]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_rx_overflow (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_rx_overflow_we),
+    .wd     (intr_state_rx_overflow_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.rx_overflow.de),
+    .d      (hw2reg.intr_state.rx_overflow.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.rx_overflow.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_rx_overflow_qs)
+  );
+
+
+  //   F[nak]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_nak (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_nak_we),
+    .wd     (intr_state_nak_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.nak.de),
+    .d      (hw2reg.intr_state.nak.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.nak.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_nak_qs)
+  );
+
+
+  //   F[scl_interference]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_scl_interference (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_scl_interference_we),
+    .wd     (intr_state_scl_interference_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.scl_interference.de),
+    .d      (hw2reg.intr_state.scl_interference.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.scl_interference.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_scl_interference_qs)
+  );
+
+
+  //   F[sda_interference]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_sda_interference (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_sda_interference_we),
+    .wd     (intr_state_sda_interference_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.sda_interference.de),
+    .d      (hw2reg.intr_state.sda_interference.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.sda_interference.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_sda_interference_qs)
+  );
+
+
+  //   F[stretch_timeout]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_stretch_timeout (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_stretch_timeout_we),
+    .wd     (intr_state_stretch_timeout_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.stretch_timeout.de),
+    .d      (hw2reg.intr_state.stretch_timeout.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.stretch_timeout.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_stretch_timeout_qs)
+  );
+
+
+  //   F[sda_unstable]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_intr_state_sda_unstable (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_state_sda_unstable_we),
+    .wd     (intr_state_sda_unstable_wd),
+
+    // from internal hardware
+    .de     (hw2reg.intr_state.sda_unstable.de),
+    .d      (hw2reg.intr_state.sda_unstable.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_state.sda_unstable.q ),
+
+    // to register interface (read)
+    .qs     (intr_state_sda_unstable_qs)
+  );
+
+
+  // R[intr_enable]: V(False)
+
+  //   F[fmt_watermark]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_fmt_watermark (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_fmt_watermark_we),
+    .wd     (intr_enable_fmt_watermark_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.fmt_watermark.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_fmt_watermark_qs)
+  );
+
+
+  //   F[rx_watermark]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_rx_watermark (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_rx_watermark_we),
+    .wd     (intr_enable_rx_watermark_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.rx_watermark.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_rx_watermark_qs)
+  );
+
+
+  //   F[fmt_overflow]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_fmt_overflow (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_fmt_overflow_we),
+    .wd     (intr_enable_fmt_overflow_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.fmt_overflow.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_fmt_overflow_qs)
+  );
+
+
+  //   F[rx_overflow]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_rx_overflow (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_rx_overflow_we),
+    .wd     (intr_enable_rx_overflow_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.rx_overflow.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_rx_overflow_qs)
+  );
+
+
+  //   F[nak]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_nak (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_nak_we),
+    .wd     (intr_enable_nak_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.nak.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_nak_qs)
+  );
+
+
+  //   F[scl_interference]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_scl_interference (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_scl_interference_we),
+    .wd     (intr_enable_scl_interference_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.scl_interference.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_scl_interference_qs)
+  );
+
+
+  //   F[sda_interference]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_sda_interference (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_sda_interference_we),
+    .wd     (intr_enable_sda_interference_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.sda_interference.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_sda_interference_qs)
+  );
+
+
+  //   F[stretch_timeout]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_stretch_timeout (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_stretch_timeout_we),
+    .wd     (intr_enable_stretch_timeout_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.stretch_timeout.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_stretch_timeout_qs)
+  );
+
+
+  //   F[sda_unstable]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_intr_enable_sda_unstable (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (intr_enable_sda_unstable_we),
+    .wd     (intr_enable_sda_unstable_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.intr_enable.sda_unstable.q ),
+
+    // to register interface (read)
+    .qs     (intr_enable_sda_unstable_qs)
+  );
+
+
+  // R[intr_test]: V(True)
+
+  //   F[fmt_watermark]: 0:0
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_fmt_watermark (
+    .re     (1'b0),
+    .we     (intr_test_fmt_watermark_we),
+    .wd     (intr_test_fmt_watermark_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.fmt_watermark.qe),
+    .q      (reg2hw.intr_test.fmt_watermark.q ),
+    .qs     ()
+  );
+
+
+  //   F[rx_watermark]: 1:1
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_rx_watermark (
+    .re     (1'b0),
+    .we     (intr_test_rx_watermark_we),
+    .wd     (intr_test_rx_watermark_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.rx_watermark.qe),
+    .q      (reg2hw.intr_test.rx_watermark.q ),
+    .qs     ()
+  );
+
+
+  //   F[fmt_overflow]: 2:2
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_fmt_overflow (
+    .re     (1'b0),
+    .we     (intr_test_fmt_overflow_we),
+    .wd     (intr_test_fmt_overflow_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.fmt_overflow.qe),
+    .q      (reg2hw.intr_test.fmt_overflow.q ),
+    .qs     ()
+  );
+
+
+  //   F[rx_overflow]: 3:3
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_rx_overflow (
+    .re     (1'b0),
+    .we     (intr_test_rx_overflow_we),
+    .wd     (intr_test_rx_overflow_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.rx_overflow.qe),
+    .q      (reg2hw.intr_test.rx_overflow.q ),
+    .qs     ()
+  );
+
+
+  //   F[nak]: 4:4
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_nak (
+    .re     (1'b0),
+    .we     (intr_test_nak_we),
+    .wd     (intr_test_nak_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.nak.qe),
+    .q      (reg2hw.intr_test.nak.q ),
+    .qs     ()
+  );
+
+
+  //   F[scl_interference]: 5:5
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_scl_interference (
+    .re     (1'b0),
+    .we     (intr_test_scl_interference_we),
+    .wd     (intr_test_scl_interference_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.scl_interference.qe),
+    .q      (reg2hw.intr_test.scl_interference.q ),
+    .qs     ()
+  );
+
+
+  //   F[sda_interference]: 6:6
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_sda_interference (
+    .re     (1'b0),
+    .we     (intr_test_sda_interference_we),
+    .wd     (intr_test_sda_interference_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.sda_interference.qe),
+    .q      (reg2hw.intr_test.sda_interference.q ),
+    .qs     ()
+  );
+
+
+  //   F[stretch_timeout]: 7:7
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_stretch_timeout (
+    .re     (1'b0),
+    .we     (intr_test_stretch_timeout_we),
+    .wd     (intr_test_stretch_timeout_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.stretch_timeout.qe),
+    .q      (reg2hw.intr_test.stretch_timeout.q ),
+    .qs     ()
+  );
+
+
+  //   F[sda_unstable]: 8:8
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_intr_test_sda_unstable (
+    .re     (1'b0),
+    .we     (intr_test_sda_unstable_we),
+    .wd     (intr_test_sda_unstable_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.intr_test.sda_unstable.qe),
+    .q      (reg2hw.intr_test.sda_unstable.q ),
+    .qs     ()
+  );
+
+
+  // R[ctrl]: V(False)
+
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ctrl (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ctrl_we),
+    .wd     (ctrl_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ctrl.q ),
+
+    // to register interface (read)
+    .qs     (ctrl_qs)
+  );
+
+
+  // R[status]: V(True)
+
+  //   F[fmtfull]: 0:0
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_fmtfull (
+    .re     (status_fmtfull_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.fmtfull.d),
+    .qre    (reg2hw.status.fmtfull.re),
+    .qe     (),
+    .q      (reg2hw.status.fmtfull.q ),
+    .qs     (status_fmtfull_qs)
+  );
+
+
+  //   F[rxfull]: 1:1
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_rxfull (
+    .re     (status_rxfull_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.rxfull.d),
+    .qre    (reg2hw.status.rxfull.re),
+    .qe     (),
+    .q      (reg2hw.status.rxfull.q ),
+    .qs     (status_rxfull_qs)
+  );
+
+
+  //   F[fmtempty]: 2:2
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_fmtempty (
+    .re     (status_fmtempty_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.fmtempty.d),
+    .qre    (reg2hw.status.fmtempty.re),
+    .qe     (),
+    .q      (reg2hw.status.fmtempty.q ),
+    .qs     (status_fmtempty_qs)
+  );
+
+
+  //   F[hostidle]: 3:3
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_hostidle (
+    .re     (status_hostidle_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.hostidle.d),
+    .qre    (reg2hw.status.hostidle.re),
+    .qe     (),
+    .q      (reg2hw.status.hostidle.q ),
+    .qs     (status_hostidle_qs)
+  );
+
+
+  //   F[targetidle]: 4:4
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_targetidle (
+    .re     (status_targetidle_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.targetidle.d),
+    .qre    (reg2hw.status.targetidle.re),
+    .qe     (),
+    .q      (reg2hw.status.targetidle.q ),
+    .qs     (status_targetidle_qs)
+  );
+
+
+  //   F[rxempty]: 5:5
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_status_rxempty (
+    .re     (status_rxempty_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.status.rxempty.d),
+    .qre    (reg2hw.status.rxempty.re),
+    .qe     (),
+    .q      (reg2hw.status.rxempty.q ),
+    .qs     (status_rxempty_qs)
+  );
+
+
+  // R[rdata]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (8)
+  ) u_rdata (
+    .re     (rdata_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      ('0),
+    .qre    (reg2hw.rdata.re),
+    .qe     (),
+    .q      (reg2hw.rdata.q ),
+    .qs     (rdata_qs)
+  );
+
+
+  // R[fdata]: V(False)
+
+  //   F[fbyte]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SWACCESS("WO"),
+    .RESVAL  (8'h0)
+  ) u_fdata_fbyte (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_fbyte_we),
+    .wd     (fdata_fbyte_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.fbyte.qe),
+    .q      (reg2hw.fdata.fbyte.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[start]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fdata_start (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_start_we),
+    .wd     (fdata_start_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.start.qe),
+    .q      (reg2hw.fdata.start.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[stop]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fdata_stop (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_stop_we),
+    .wd     (fdata_stop_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.stop.qe),
+    .q      (reg2hw.fdata.stop.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[read]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fdata_read (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_read_we),
+    .wd     (fdata_read_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.read.qe),
+    .q      (reg2hw.fdata.read.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[rcont]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fdata_rcont (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_rcont_we),
+    .wd     (fdata_rcont_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.rcont.qe),
+    .q      (reg2hw.fdata.rcont.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[nakok]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fdata_nakok (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fdata_nakok_we),
+    .wd     (fdata_nakok_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fdata.nakok.qe),
+    .q      (reg2hw.fdata.nakok.q ),
+
+    .qs     ()
+  );
+
+
+  // R[fifo_ctrl]: V(False)
+
+  //   F[rxrst]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fifo_ctrl_rxrst (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fifo_ctrl_rxrst_we),
+    .wd     (fifo_ctrl_rxrst_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fifo_ctrl.rxrst.qe),
+    .q      (reg2hw.fifo_ctrl.rxrst.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[fmtrst]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("WO"),
+    .RESVAL  (1'h0)
+  ) u_fifo_ctrl_fmtrst (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fifo_ctrl_fmtrst_we),
+    .wd     (fifo_ctrl_fmtrst_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fifo_ctrl.fmtrst.qe),
+    .q      (reg2hw.fifo_ctrl.fmtrst.q ),
+
+    .qs     ()
+  );
+
+
+  //   F[rxilvl]: 4:2
+  prim_subreg #(
+    .DW      (3),
+    .SWACCESS("RW"),
+    .RESVAL  (3'h0)
+  ) u_fifo_ctrl_rxilvl (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fifo_ctrl_rxilvl_we),
+    .wd     (fifo_ctrl_rxilvl_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fifo_ctrl.rxilvl.qe),
+    .q      (reg2hw.fifo_ctrl.rxilvl.q ),
+
+    // to register interface (read)
+    .qs     (fifo_ctrl_rxilvl_qs)
+  );
+
+
+  //   F[fmtilvl]: 6:5
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_fifo_ctrl_fmtilvl (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (fifo_ctrl_fmtilvl_we),
+    .wd     (fifo_ctrl_fmtilvl_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.fifo_ctrl.fmtilvl.qe),
+    .q      (reg2hw.fifo_ctrl.fmtilvl.q ),
+
+    // to register interface (read)
+    .qs     (fifo_ctrl_fmtilvl_qs)
+  );
+
+
+  // R[fifo_status]: V(True)
+
+  //   F[fmtlvl]: 5:0
+  prim_subreg_ext #(
+    .DW    (6)
+  ) u_fifo_status_fmtlvl (
+    .re     (fifo_status_fmtlvl_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.fifo_status.fmtlvl.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (fifo_status_fmtlvl_qs)
+  );
+
+
+  //   F[rxlvl]: 21:16
+  prim_subreg_ext #(
+    .DW    (6)
+  ) u_fifo_status_rxlvl (
+    .re     (fifo_status_rxlvl_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.fifo_status.rxlvl.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (fifo_status_rxlvl_qs)
+  );
+
+
+  // R[ovrd]: V(False)
+
+  //   F[txovrden]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ovrd_txovrden (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ovrd_txovrden_we),
+    .wd     (ovrd_txovrden_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ovrd.txovrden.q ),
+
+    // to register interface (read)
+    .qs     (ovrd_txovrden_qs)
+  );
+
+
+  //   F[sclval]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ovrd_sclval (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ovrd_sclval_we),
+    .wd     (ovrd_sclval_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ovrd.sclval.q ),
+
+    // to register interface (read)
+    .qs     (ovrd_sclval_qs)
+  );
+
+
+  //   F[sdaval]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ovrd_sdaval (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ovrd_sdaval_we),
+    .wd     (ovrd_sdaval_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ovrd.sdaval.q ),
+
+    // to register interface (read)
+    .qs     (ovrd_sdaval_qs)
+  );
+
+
+  // R[val]: V(True)
+
+  //   F[scl_rx]: 15:0
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_val_scl_rx (
+    .re     (val_scl_rx_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.val.scl_rx.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (val_scl_rx_qs)
+  );
+
+
+  //   F[sda_rx]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_val_sda_rx (
+    .re     (val_sda_rx_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.val.sda_rx.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (val_sda_rx_qs)
+  );
+
+
+  // R[timing0]: V(False)
+
+  //   F[thigh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing0_thigh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing0_thigh_we),
+    .wd     (timing0_thigh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing0.thigh.q ),
+
+    // to register interface (read)
+    .qs     (timing0_thigh_qs)
+  );
+
+
+  //   F[tlow]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing0_tlow (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing0_tlow_we),
+    .wd     (timing0_tlow_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing0.tlow.q ),
+
+    // to register interface (read)
+    .qs     (timing0_tlow_qs)
+  );
+
+
+  // R[timing1]: V(False)
+
+  //   F[t_r]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing1_t_r (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing1_t_r_we),
+    .wd     (timing1_t_r_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing1.t_r.q ),
+
+    // to register interface (read)
+    .qs     (timing1_t_r_qs)
+  );
+
+
+  //   F[t_f]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing1_t_f (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing1_t_f_we),
+    .wd     (timing1_t_f_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing1.t_f.q ),
+
+    // to register interface (read)
+    .qs     (timing1_t_f_qs)
+  );
+
+
+  // R[timing2]: V(False)
+
+  //   F[tsu_sta]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing2_tsu_sta (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing2_tsu_sta_we),
+    .wd     (timing2_tsu_sta_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing2.tsu_sta.q ),
+
+    // to register interface (read)
+    .qs     (timing2_tsu_sta_qs)
+  );
+
+
+  //   F[thd_st]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing2_thd_st (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing2_thd_st_we),
+    .wd     (timing2_thd_st_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing2.thd_st.q ),
+
+    // to register interface (read)
+    .qs     (timing2_thd_st_qs)
+  );
+
+
+  // R[timing3]: V(False)
+
+  //   F[tsu_dat]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing3_tsu_dat (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing3_tsu_dat_we),
+    .wd     (timing3_tsu_dat_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing3.tsu_dat.q ),
+
+    // to register interface (read)
+    .qs     (timing3_tsu_dat_qs)
+  );
+
+
+  //   F[thd_dat]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing3_thd_dat (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing3_thd_dat_we),
+    .wd     (timing3_thd_dat_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing3.thd_dat.q ),
+
+    // to register interface (read)
+    .qs     (timing3_thd_dat_qs)
+  );
+
+
+  // R[timing4]: V(False)
+
+  //   F[tsu_sto]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing4_tsu_sto (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing4_tsu_sto_we),
+    .wd     (timing4_tsu_sto_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing4.tsu_sto.q ),
+
+    // to register interface (read)
+    .qs     (timing4_tsu_sto_qs)
+  );
+
+
+  //   F[t_buf]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h0)
+  ) u_timing4_t_buf (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timing4_t_buf_we),
+    .wd     (timing4_t_buf_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timing4.t_buf.q ),
+
+    // to register interface (read)
+    .qs     (timing4_t_buf_qs)
+  );
+
+
+  // R[timeout_ctrl]: V(False)
+
+  //   F[val]: 30:0
+  prim_subreg #(
+    .DW      (31),
+    .SWACCESS("RW"),
+    .RESVAL  (31'h0)
+  ) u_timeout_ctrl_val (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timeout_ctrl_val_we),
+    .wd     (timeout_ctrl_val_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timeout_ctrl.val.q ),
+
+    // to register interface (read)
+    .qs     (timeout_ctrl_val_qs)
+  );
+
+
+  //   F[en]: 31:31
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_timeout_ctrl_en (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (timeout_ctrl_en_we),
+    .wd     (timeout_ctrl_en_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.timeout_ctrl.en.q ),
+
+    // to register interface (read)
+    .qs     (timeout_ctrl_en_qs)
+  );
+
+
+
+  logic [16:0] addr_hit;
+  always_comb begin
+    addr_hit = '0;
+    addr_hit[ 0] = (reg_addr == I2C_INTR_STATE_OFFSET);
+    addr_hit[ 1] = (reg_addr == I2C_INTR_ENABLE_OFFSET);
+    addr_hit[ 2] = (reg_addr == I2C_INTR_TEST_OFFSET);
+    addr_hit[ 3] = (reg_addr == I2C_CTRL_OFFSET);
+    addr_hit[ 4] = (reg_addr == I2C_STATUS_OFFSET);
+    addr_hit[ 5] = (reg_addr == I2C_RDATA_OFFSET);
+    addr_hit[ 6] = (reg_addr == I2C_FDATA_OFFSET);
+    addr_hit[ 7] = (reg_addr == I2C_FIFO_CTRL_OFFSET);
+    addr_hit[ 8] = (reg_addr == I2C_FIFO_STATUS_OFFSET);
+    addr_hit[ 9] = (reg_addr == I2C_OVRD_OFFSET);
+    addr_hit[10] = (reg_addr == I2C_VAL_OFFSET);
+    addr_hit[11] = (reg_addr == I2C_TIMING0_OFFSET);
+    addr_hit[12] = (reg_addr == I2C_TIMING1_OFFSET);
+    addr_hit[13] = (reg_addr == I2C_TIMING2_OFFSET);
+    addr_hit[14] = (reg_addr == I2C_TIMING3_OFFSET);
+    addr_hit[15] = (reg_addr == I2C_TIMING4_OFFSET);
+    addr_hit[16] = (reg_addr == I2C_TIMEOUT_CTRL_OFFSET);
+  end
+
+  assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
+
+  // Check sub-word write is permitted
+  always_comb begin
+    wr_err = 1'b0;
+    if (addr_hit[ 0] && reg_we && (I2C_PERMIT[ 0] != (I2C_PERMIT[ 0] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 1] && reg_we && (I2C_PERMIT[ 1] != (I2C_PERMIT[ 1] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 2] && reg_we && (I2C_PERMIT[ 2] != (I2C_PERMIT[ 2] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 3] && reg_we && (I2C_PERMIT[ 3] != (I2C_PERMIT[ 3] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 4] && reg_we && (I2C_PERMIT[ 4] != (I2C_PERMIT[ 4] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 5] && reg_we && (I2C_PERMIT[ 5] != (I2C_PERMIT[ 5] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 6] && reg_we && (I2C_PERMIT[ 6] != (I2C_PERMIT[ 6] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 7] && reg_we && (I2C_PERMIT[ 7] != (I2C_PERMIT[ 7] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 8] && reg_we && (I2C_PERMIT[ 8] != (I2C_PERMIT[ 8] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[ 9] && reg_we && (I2C_PERMIT[ 9] != (I2C_PERMIT[ 9] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[10] && reg_we && (I2C_PERMIT[10] != (I2C_PERMIT[10] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[11] && reg_we && (I2C_PERMIT[11] != (I2C_PERMIT[11] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[12] && reg_we && (I2C_PERMIT[12] != (I2C_PERMIT[12] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[13] && reg_we && (I2C_PERMIT[13] != (I2C_PERMIT[13] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[14] && reg_we && (I2C_PERMIT[14] != (I2C_PERMIT[14] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[15] && reg_we && (I2C_PERMIT[15] != (I2C_PERMIT[15] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[16] && reg_we && (I2C_PERMIT[16] != (I2C_PERMIT[16] & reg_be))) wr_err = 1'b1 ;
+  end
+
+  assign intr_state_fmt_watermark_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_fmt_watermark_wd = reg_wdata[0];
+
+  assign intr_state_rx_watermark_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_rx_watermark_wd = reg_wdata[1];
+
+  assign intr_state_fmt_overflow_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_fmt_overflow_wd = reg_wdata[2];
+
+  assign intr_state_rx_overflow_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_rx_overflow_wd = reg_wdata[3];
+
+  assign intr_state_nak_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_nak_wd = reg_wdata[4];
+
+  assign intr_state_scl_interference_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_scl_interference_wd = reg_wdata[5];
+
+  assign intr_state_sda_interference_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_sda_interference_wd = reg_wdata[6];
+
+  assign intr_state_stretch_timeout_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_stretch_timeout_wd = reg_wdata[7];
+
+  assign intr_state_sda_unstable_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_sda_unstable_wd = reg_wdata[8];
+
+  assign intr_enable_fmt_watermark_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_fmt_watermark_wd = reg_wdata[0];
+
+  assign intr_enable_rx_watermark_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_rx_watermark_wd = reg_wdata[1];
+
+  assign intr_enable_fmt_overflow_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_fmt_overflow_wd = reg_wdata[2];
+
+  assign intr_enable_rx_overflow_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_rx_overflow_wd = reg_wdata[3];
+
+  assign intr_enable_nak_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_nak_wd = reg_wdata[4];
+
+  assign intr_enable_scl_interference_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_scl_interference_wd = reg_wdata[5];
+
+  assign intr_enable_sda_interference_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_sda_interference_wd = reg_wdata[6];
+
+  assign intr_enable_stretch_timeout_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_stretch_timeout_wd = reg_wdata[7];
+
+  assign intr_enable_sda_unstable_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_sda_unstable_wd = reg_wdata[8];
+
+  assign intr_test_fmt_watermark_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_fmt_watermark_wd = reg_wdata[0];
+
+  assign intr_test_rx_watermark_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_rx_watermark_wd = reg_wdata[1];
+
+  assign intr_test_fmt_overflow_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_fmt_overflow_wd = reg_wdata[2];
+
+  assign intr_test_rx_overflow_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_rx_overflow_wd = reg_wdata[3];
+
+  assign intr_test_nak_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_nak_wd = reg_wdata[4];
+
+  assign intr_test_scl_interference_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_scl_interference_wd = reg_wdata[5];
+
+  assign intr_test_sda_interference_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_sda_interference_wd = reg_wdata[6];
+
+  assign intr_test_stretch_timeout_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_stretch_timeout_wd = reg_wdata[7];
+
+  assign intr_test_sda_unstable_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_sda_unstable_wd = reg_wdata[8];
+
+  assign ctrl_we = addr_hit[3] & reg_we & ~wr_err;
+  assign ctrl_wd = reg_wdata[0];
+
+  assign status_fmtfull_re = addr_hit[4] && reg_re;
+
+  assign status_rxfull_re = addr_hit[4] && reg_re;
+
+  assign status_fmtempty_re = addr_hit[4] && reg_re;
+
+  assign status_hostidle_re = addr_hit[4] && reg_re;
+
+  assign status_targetidle_re = addr_hit[4] && reg_re;
+
+  assign status_rxempty_re = addr_hit[4] && reg_re;
+
+  assign rdata_re = addr_hit[5] && reg_re;
+
+  assign fdata_fbyte_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_fbyte_wd = reg_wdata[7:0];
+
+  assign fdata_start_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_start_wd = reg_wdata[8];
+
+  assign fdata_stop_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_stop_wd = reg_wdata[9];
+
+  assign fdata_read_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_read_wd = reg_wdata[10];
+
+  assign fdata_rcont_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_rcont_wd = reg_wdata[11];
+
+  assign fdata_nakok_we = addr_hit[6] & reg_we & ~wr_err;
+  assign fdata_nakok_wd = reg_wdata[12];
+
+  assign fifo_ctrl_rxrst_we = addr_hit[7] & reg_we & ~wr_err;
+  assign fifo_ctrl_rxrst_wd = reg_wdata[0];
+
+  assign fifo_ctrl_fmtrst_we = addr_hit[7] & reg_we & ~wr_err;
+  assign fifo_ctrl_fmtrst_wd = reg_wdata[1];
+
+  assign fifo_ctrl_rxilvl_we = addr_hit[7] & reg_we & ~wr_err;
+  assign fifo_ctrl_rxilvl_wd = reg_wdata[4:2];
+
+  assign fifo_ctrl_fmtilvl_we = addr_hit[7] & reg_we & ~wr_err;
+  assign fifo_ctrl_fmtilvl_wd = reg_wdata[6:5];
+
+  assign fifo_status_fmtlvl_re = addr_hit[8] && reg_re;
+
+  assign fifo_status_rxlvl_re = addr_hit[8] && reg_re;
+
+  assign ovrd_txovrden_we = addr_hit[9] & reg_we & ~wr_err;
+  assign ovrd_txovrden_wd = reg_wdata[0];
+
+  assign ovrd_sclval_we = addr_hit[9] & reg_we & ~wr_err;
+  assign ovrd_sclval_wd = reg_wdata[1];
+
+  assign ovrd_sdaval_we = addr_hit[9] & reg_we & ~wr_err;
+  assign ovrd_sdaval_wd = reg_wdata[2];
+
+  assign val_scl_rx_re = addr_hit[10] && reg_re;
+
+  assign val_sda_rx_re = addr_hit[10] && reg_re;
+
+  assign timing0_thigh_we = addr_hit[11] & reg_we & ~wr_err;
+  assign timing0_thigh_wd = reg_wdata[15:0];
+
+  assign timing0_tlow_we = addr_hit[11] & reg_we & ~wr_err;
+  assign timing0_tlow_wd = reg_wdata[31:16];
+
+  assign timing1_t_r_we = addr_hit[12] & reg_we & ~wr_err;
+  assign timing1_t_r_wd = reg_wdata[15:0];
+
+  assign timing1_t_f_we = addr_hit[12] & reg_we & ~wr_err;
+  assign timing1_t_f_wd = reg_wdata[31:16];
+
+  assign timing2_tsu_sta_we = addr_hit[13] & reg_we & ~wr_err;
+  assign timing2_tsu_sta_wd = reg_wdata[15:0];
+
+  assign timing2_thd_st_we = addr_hit[13] & reg_we & ~wr_err;
+  assign timing2_thd_st_wd = reg_wdata[31:16];
+
+  assign timing3_tsu_dat_we = addr_hit[14] & reg_we & ~wr_err;
+  assign timing3_tsu_dat_wd = reg_wdata[15:0];
+
+  assign timing3_thd_dat_we = addr_hit[14] & reg_we & ~wr_err;
+  assign timing3_thd_dat_wd = reg_wdata[31:16];
+
+  assign timing4_tsu_sto_we = addr_hit[15] & reg_we & ~wr_err;
+  assign timing4_tsu_sto_wd = reg_wdata[15:0];
+
+  assign timing4_t_buf_we = addr_hit[15] & reg_we & ~wr_err;
+  assign timing4_t_buf_wd = reg_wdata[31:16];
+
+  assign timeout_ctrl_val_we = addr_hit[16] & reg_we & ~wr_err;
+  assign timeout_ctrl_val_wd = reg_wdata[30:0];
+
+  assign timeout_ctrl_en_we = addr_hit[16] & reg_we & ~wr_err;
+  assign timeout_ctrl_en_wd = reg_wdata[31];
+
+  // Read data return
+  always_comb begin
+    reg_rdata_next = '0;
+    unique case (1'b1)
+      addr_hit[0]: begin
+        reg_rdata_next[0] = intr_state_fmt_watermark_qs;
+        reg_rdata_next[1] = intr_state_rx_watermark_qs;
+        reg_rdata_next[2] = intr_state_fmt_overflow_qs;
+        reg_rdata_next[3] = intr_state_rx_overflow_qs;
+        reg_rdata_next[4] = intr_state_nak_qs;
+        reg_rdata_next[5] = intr_state_scl_interference_qs;
+        reg_rdata_next[6] = intr_state_sda_interference_qs;
+        reg_rdata_next[7] = intr_state_stretch_timeout_qs;
+        reg_rdata_next[8] = intr_state_sda_unstable_qs;
+      end
+
+      addr_hit[1]: begin
+        reg_rdata_next[0] = intr_enable_fmt_watermark_qs;
+        reg_rdata_next[1] = intr_enable_rx_watermark_qs;
+        reg_rdata_next[2] = intr_enable_fmt_overflow_qs;
+        reg_rdata_next[3] = intr_enable_rx_overflow_qs;
+        reg_rdata_next[4] = intr_enable_nak_qs;
+        reg_rdata_next[5] = intr_enable_scl_interference_qs;
+        reg_rdata_next[6] = intr_enable_sda_interference_qs;
+        reg_rdata_next[7] = intr_enable_stretch_timeout_qs;
+        reg_rdata_next[8] = intr_enable_sda_unstable_qs;
+      end
+
+      addr_hit[2]: begin
+        reg_rdata_next[0] = '0;
+        reg_rdata_next[1] = '0;
+        reg_rdata_next[2] = '0;
+        reg_rdata_next[3] = '0;
+        reg_rdata_next[4] = '0;
+        reg_rdata_next[5] = '0;
+        reg_rdata_next[6] = '0;
+        reg_rdata_next[7] = '0;
+        reg_rdata_next[8] = '0;
+      end
+
+      addr_hit[3]: begin
+        reg_rdata_next[0] = ctrl_qs;
+      end
+
+      addr_hit[4]: begin
+        reg_rdata_next[0] = status_fmtfull_qs;
+        reg_rdata_next[1] = status_rxfull_qs;
+        reg_rdata_next[2] = status_fmtempty_qs;
+        reg_rdata_next[3] = status_hostidle_qs;
+        reg_rdata_next[4] = status_targetidle_qs;
+        reg_rdata_next[5] = status_rxempty_qs;
+      end
+
+      addr_hit[5]: begin
+        reg_rdata_next[7:0] = rdata_qs;
+      end
+
+      addr_hit[6]: begin
+        reg_rdata_next[7:0] = '0;
+        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[7]: begin
+        reg_rdata_next[0] = '0;
+        reg_rdata_next[1] = '0;
+        reg_rdata_next[4:2] = fifo_ctrl_rxilvl_qs;
+        reg_rdata_next[6:5] = fifo_ctrl_fmtilvl_qs;
+      end
+
+      addr_hit[8]: begin
+        reg_rdata_next[5:0] = fifo_status_fmtlvl_qs;
+        reg_rdata_next[21:16] = fifo_status_rxlvl_qs;
+      end
+
+      addr_hit[9]: begin
+        reg_rdata_next[0] = ovrd_txovrden_qs;
+        reg_rdata_next[1] = ovrd_sclval_qs;
+        reg_rdata_next[2] = ovrd_sdaval_qs;
+      end
+
+      addr_hit[10]: begin
+        reg_rdata_next[15:0] = val_scl_rx_qs;
+        reg_rdata_next[31:16] = val_sda_rx_qs;
+      end
+
+      addr_hit[11]: begin
+        reg_rdata_next[15:0] = timing0_thigh_qs;
+        reg_rdata_next[31:16] = timing0_tlow_qs;
+      end
+
+      addr_hit[12]: begin
+        reg_rdata_next[15:0] = timing1_t_r_qs;
+        reg_rdata_next[31:16] = timing1_t_f_qs;
+      end
+
+      addr_hit[13]: begin
+        reg_rdata_next[15:0] = timing2_tsu_sta_qs;
+        reg_rdata_next[31:16] = timing2_thd_st_qs;
+      end
+
+      addr_hit[14]: begin
+        reg_rdata_next[15:0] = timing3_tsu_dat_qs;
+        reg_rdata_next[31:16] = timing3_thd_dat_qs;
+      end
+
+      addr_hit[15]: begin
+        reg_rdata_next[15:0] = timing4_tsu_sto_qs;
+        reg_rdata_next[31:16] = timing4_t_buf_qs;
+      end
+
+      addr_hit[16]: begin
+        reg_rdata_next[30:0] = timeout_ctrl_val_qs;
+        reg_rdata_next[31] = timeout_ctrl_en_qs;
+      end
+
+      default: begin
+        reg_rdata_next = '1;
+      end
+    endcase
+  end
+
+  // Assertions for Register Interface
+  `ASSERT_PULSE(wePulse, reg_we, clk_i, !rst_ni)
+  `ASSERT_PULSE(rePulse, reg_re, clk_i, !rst_ni)
+
+  `ASSERT(reAfterRv, $rose(reg_re || reg_we) |=> tl_o.d_valid, clk_i, !rst_ni)
+
+  `ASSERT(en2addrHit, (reg_we || reg_re) |-> $onehot0(addr_hit), clk_i, !rst_ni)
+
+  `ASSERT(reqParity, tl_reg_h2d.a_valid |-> tl_reg_h2d.a_user.parity_en == 1'b0, clk_i, !rst_ni)
+
+endmodule