diff --git a/tests/end2end/test_end2end_tfc.py b/tests/end2end/test_end2end_tfc.py
index fd5ecf0f76c195f033012486489d900b2fca2e3a..86889af717b22d7151c2164de958cfd2fc5d3327 100644
--- a/tests/end2end/test_end2end_tfc.py
+++ b/tests/end2end/test_end2end_tfc.py
@@ -1,5 +1,6 @@
 import os
 
+import numpy as np
 # as of Feb'20 there is a bug that segfaults ONNX shape inference if we
 # import pytorch before onnx, so we make sure to import onnx first
 import onnx  # NOQA
@@ -7,11 +8,14 @@ import onnx  # NOQA
 import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls
 import finn.transformation.streamline.absorb as absorb
 from finn.core.modelwrapper import ModelWrapper
+from finn.core.onnx_exec import execute_onnx
 from finn.custom_op.registry import getCustomOp
 from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount
 from finn.transformation.fold_constants import FoldConstants
 from finn.transformation.fpgadataflow.codegen_ipgen import CodeGen_ipgen
 from finn.transformation.fpgadataflow.codegen_ipstitch import CodeGen_ipstitch
+from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
+from finn.transformation.fpgadataflow.compile import Compile
 from finn.transformation.fpgadataflow.create_dataflow_partition import (
     CreateDataflowPartition,
 )
@@ -22,6 +26,7 @@ from finn.transformation.fpgadataflow.make_pynq_proj import MakePYNQProject
 from finn.transformation.fpgadataflow.replace_verilog_relpaths import (
     ReplaceVerilogRelPaths,
 )
+from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode
 from finn.transformation.fpgadataflow.synth_pynq_proj import SynthPYNQProject
 from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames
 from finn.transformation.infer_datatypes import InferDataTypes
@@ -124,6 +129,27 @@ def test_end2end_tfc_ip_stitch():
     model.save(build_dir + "/end2end_tfc_w1_a1_ipstitch.onnx")
 
 
+def test_end2end_tfc_verify_ip_stitch():
+    model = ModelWrapper(build_dir + "/end2end_tfc_w1_a1_ipstitch.onnx")
+    x = np.zeros((1, 784), dtype=np.float32)
+    inp_name = model.graph.input[0].name
+    out_name = model.graph.output[0].name
+    inp_dict = {inp_name: x}
+    # npysim
+    model = model.transform(CodeGen_npysim())
+    model = model.transform(Compile())
+    model = model.transform(SetExecMode("npysim"))
+    res_npysim = execute_onnx(model, inp_dict)[out_name]
+    # node-by-node rtlsim
+    model = model.transform(SetExecMode("rtlsim"))
+    res_rtlsim_nodebynode = execute_onnx(model, inp_dict)[out_name]
+    # whole-network (ip-stitched) rtlsim
+    model.set_metadata_prop("exec_mode", "rtlsim")
+    res_rtlsim_ipstitched = execute_onnx(model, inp_dict)[out_name]
+    assert np.isclose(res_npysim, res_rtlsim_nodebynode).all()
+    assert np.isclose(res_npysim, res_rtlsim_ipstitched).all()
+
+
 def test_end2end_tfc_make_pynq_proj():
     model = ModelWrapper(build_dir + "/end2end_tfc_w1_a1_ipstitch.onnx")
     model = model.transform(MakePYNQProject(test_pynq_board))