diff --git a/src/finn/util/pyverilator.py b/src/finn/util/pyverilator.py
index 41b72db9504ebeb8d10c5d838977da93b27f94ed..0c96b935f0cadc330707f69a9987b5522b509184 100644
--- a/src/finn/util/pyverilator.py
+++ b/src/finn/util/pyverilator.py
@@ -27,22 +27,42 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
+def _find_signal(sim, signal_name):
+    # handle both mixed caps and lowercase signal names
+    if signal_name in sim.io:
+        return signal_name
+    elif signal_name.lower() in sim.io:
+        return signal_name.lower()
+    else:
+        raise Exception("Signal not found: " + signal_name)
+
+
+def _read_signal(sim, signal_name):
+    signal_name = _find_signal(sim, signal_name)
+    return sim.io[signal_name]
+
+
+def _write_signal(sim, signal_name, signal_value):
+    signal_name = _find_signal(sim, signal_name)
+    sim.io[signal_name] = signal_value
+
+
 def reset_rtlsim(sim, rst_name="ap_rst_n", active_low=True):
     """Sets reset input in pyverilator to zero, toggles the clock and set it
     back to one"""
-    sim.io[rst_name] = 0 if active_low else 1
+    _write_signal(sim, rst_name, 0 if active_low else 1)
     toggle_clk(sim)
     toggle_clk(sim)
-    sim.io[rst_name] = 1 if active_low else 0
+    _write_signal(sim, rst_name, 1 if active_low else 0)
     toggle_clk(sim)
     toggle_clk(sim)
 
 
 def toggle_clk(sim, clk_name="ap_clk"):
     """Toggles the clock input in pyverilator once."""
-    sim.io[clk_name] = 0
+    _write_signal(sim, clk_name, 0)
     sim.eval()
-    sim.io[clk_name] = 1
+    _write_signal(sim, clk_name, 1)
     sim.eval()
 
 
@@ -62,11 +82,13 @@ def wait_for_handshake(sim, ifname, basename="s_axi_control_", dataname="DATA"):
     ret = None
     while 1:
         hs = (
-            sim.io[basename + ifname + "READY"] == 1
-            and sim.io[basename + ifname + "VALID"] == 1
+            _read_signal(sim, basename + ifname + "READY") == 1
+            and _read_signal(sim, basename + ifname + "VALID") == 1
         )
-        if basename + ifname + dataname in sim.io:
-            ret = sim.io[basename + ifname + dataname]
+        try:
+            ret = _read_signal(sim, basename + ifname + dataname)
+        except Exception:
+            ret = None
         toggle_clk(sim)
         if hs:
             break
@@ -83,23 +105,23 @@ def axilite_write(sim, addr, val, basename="s_axi_control_", wstrb=0xF):
     - basename : prefix for AXI lite interface name
     - wstrb : write strobe value to do partial writes, see AXI protocol reference
     """
-    sim.io[basename + "WSTRB"] = wstrb
-    sim.io[basename + "AWADDR"] = addr
-    sim.io[basename + "AWVALID"] = 1
+    _write_signal(sim, basename + "WSTRB", wstrb)
+    _write_signal(sim, basename + "AWADDR", addr)
+    _write_signal(sim, basename + "AWVALID", 1)
     wait_for_handshake(sim, "AW", basename=basename)
     # write request done
-    sim.io[basename + "AWVALID"] = 0
+    _write_signal(sim, basename + "AWVALID", 0)
     # write data
-    sim.io[basename + "WDATA"] = val
-    sim.io[basename + "WVALID"] = 1
+    _write_signal(sim, basename + "WDATA", val)
+    _write_signal(sim, basename + "WVALID", 1)
     wait_for_handshake(sim, "W", basename=basename)
     # write data OK
-    sim.io[basename + "WVALID"] = 0
+    _write_signal(sim, basename + "WVALID", 0)
     # wait for write response
-    sim.io[basename + "BREADY"] = 1
+    _write_signal(sim, basename + "BREADY", 1)
     wait_for_handshake(sim, "B", basename=basename)
     # write response OK
-    sim.io[basename + "BREADY"] = 0
+    _write_signal(sim, basename + "BREADY", 0)
 
 
 def axilite_read(sim, addr, basename="s_axi_control_"):
@@ -112,13 +134,13 @@ def axilite_read(sim, addr, basename="s_axi_control_"):
 
     Returns: read value from AXI lite interface at given addr
     """
-    sim.io[basename + "ARADDR"] = addr
-    sim.io[basename + "ARVALID"] = 1
+    _write_signal(sim, basename + "ARADDR", addr)
+    _write_signal(sim, basename + "ARVALID", 1)
     wait_for_handshake(sim, "AR", basename=basename)
     # read request OK
-    sim.io[basename + "ARVALID"] = 0
+    _write_signal(sim, basename + "ARVALID", 0)
     # wait for read response
-    sim.io[basename + "RREADY"] = 1
+    _write_signal(sim, basename + "RREADY", 1)
     ret_data = wait_for_handshake(sim, "R", basename=basename)
-    sim.io[basename + "RREADY"] = 0
+    _write_signal(sim, basename + "RREADY", 0)
     return ret_data