diff --git a/src/finn/util/pyverilator.py b/src/finn/util/pyverilator.py
index a00899cf784cbe3985b942af6b3d9a4c14cd8706..8d188585694c172d97d73fa6b5820edb7b48a948 100644
--- a/src/finn/util/pyverilator.py
+++ b/src/finn/util/pyverilator.py
@@ -133,6 +133,7 @@ def verilator_fifosim(model, n_inputs, max_iters=100000000):
     and throughput measurement."""
 
     vivado_stitch_proj_dir = prepare_stitched_ip_for_verilator(model)
+    verilog_header_dir = vivado_stitch_proj_dir + "/pyverilator_vh"
     build_dir = make_build_dir("verilator_fifosim_")
     fifosim_cpp_fname = pk.resource_filename(
         "finn.qnn-data", "cpp/verilator_fifosim.cpp"
@@ -184,6 +185,19 @@ def verilator_fifosim(model, n_inputs, max_iters=100000000):
     if which_verilator is None:
         raise Exception("'verilator' executable not found")
 
+    # add defines to make certain XPM src files work with Verilator
+    xpm_args = []
+    xpm_args.append("-DDISABLE_XPM_ASSERTIONS")
+    xpm_args.append("-DOBSOLETE")
+    xpm_args.append("-DONESPIN")
+    xpm_args.append("--bbox-unsup")
+    vivado_path = os.environ["VIVADO_PATH"]
+    # additional SystemVerilog modules to make XPMs work with Verilator
+    xpm_memory = f"{vivado_path}/data/ip/xpm/xpm_memory/hdl/xpm_memory.sv"
+    xpm_cdc = f"{vivado_path}/data/ip/xpm/xpm_cdc/hdl/xpm_cdc.sv"
+    xpm_fifo = f"{vivado_path}/data/ip/xpm/xpm_fifo/hdl/xpm_fifo.sv"
+    verilog_file_arg = ["finn_design_wrapper.v", xpm_memory, xpm_cdc, xpm_fifo]
+
     verilator_args = [
         "perl",
         which_verilator,
@@ -192,6 +206,8 @@ def verilator_fifosim(model, n_inputs, max_iters=100000000):
         build_dir,
         "-y",
         vivado_stitch_proj_dir,
+        "-y",
+        verilog_header_dir,
         "--CFLAGS",
         "--std=c++11",
         "-O3",
@@ -201,13 +217,14 @@ def verilator_fifosim(model, n_inputs, max_iters=100000000):
         "fast",
         "--noassert",
         "--cc",
-        "finn_design_wrapper.v",
+        *verilog_file_arg,
         "--top-module",
         "finn_design_wrapper",
         "--exe",
         "verilator_fifosim.cpp",
         "--threads",
         "4",
+        *xpm_args,
     ]
 
     proc_env = os.environ.copy()