From 836fc73e7b3642c1481f472bcb53045e11de039f Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <maltanar@gmail.com>
Date: Thu, 20 Feb 2020 10:01:40 +0000
Subject: [PATCH] [rtlsim] Use env.var. LIVENESS_CYCLES to set threshold

---
 src/finn/core/rtlsim_exec.py                | 12 +++++++++---
 src/finn/custom_op/fpgadataflow/__init__.py | 12 +++++++++---
 src/finn/util/fpgadataflow.py               |  7 +++++++
 3 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/finn/core/rtlsim_exec.py b/src/finn/core/rtlsim_exec.py
index 51cd57457..051b2e988 100644
--- a/src/finn/core/rtlsim_exec.py
+++ b/src/finn/core/rtlsim_exec.py
@@ -2,7 +2,10 @@ import os
 
 from finn.custom_op.registry import getCustomOp
 from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy
-from finn.util.fpgadataflow import pyverilate_stitched_ip
+from finn.util.fpgadataflow import (
+    pyverilate_get_liveness_threshold_cycles,
+    pyverilate_stitched_ip,
+)
 
 
 def rtlsim_exec(model, execution_context):
@@ -73,9 +76,10 @@ def _run_rtlsim(sim, inp, num_out_values):
     observation_count = 0
 
     # avoid infinite looping of simulation by aborting when there is no change in
-    # output values after 100 cycles
+    # output values after LIVENESS_THRESHOLD cycles
     no_change_count = 0
     old_outputs = outputs
+    liveness_threshold = pyverilate_get_liveness_threshold_cycles()
 
     while not (output_observed):
         sim.io.in0_V_V_0_tvalid = 1 if len(inputs) > 0 else 0
@@ -94,10 +98,12 @@ def _run_rtlsim(sim, inp, num_out_values):
             sim_cycles = observation_count
             output_observed = True
 
-        if no_change_count == 100:
+        if no_change_count == liveness_threshold:
             if old_outputs == outputs:
                 raise Exception(
                     "Error in simulation! Takes too long to produce output."
+                    "Consider setting the LIVENESS_THRESHOLD env.var. to a "
+                    "larger value."
                 )
             else:
                 no_change_count = 0
diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py
index b786944ed..61f9bc513 100644
--- a/src/finn/custom_op/fpgadataflow/__init__.py
+++ b/src/finn/custom_op/fpgadataflow/__init__.py
@@ -4,7 +4,10 @@ import os
 import subprocess
 from finn.custom_op import CustomOp
 from finn.util.basic import CppBuilder
-from finn.util.fpgadataflow import IPGenBuilder
+from finn.util.fpgadataflow import (
+    IPGenBuilder,
+    pyverilate_get_liveness_threshold_cycles,
+)
 from . import templates
 
 
@@ -206,6 +209,7 @@ compilation transformations?
         # output values after 100 cycles
         no_change_count = 0
         old_outputs = outputs
+        liveness_threshold = pyverilate_get_liveness_threshold_cycles()
 
         while not (output_observed):
             sim.io.in0_V_V_TVALID = 1 if len(inputs) > 0 else 0
@@ -224,10 +228,12 @@ compilation transformations?
                 self.set_nodeattr("sim_cycles", observation_count)
                 output_observed = True
 
-            if no_change_count == 100:
+            if no_change_count == liveness_threshold:
                 if old_outputs == outputs:
                     raise Exception(
-                        "Error in simulation! Takes too long to produce output."
+                        "Error in simulation! Takes too long to produce output. "
+                        "Consider setting the LIVENESS_THRESHOLD env.var. to a "
+                        "larger value."
                     )
                 else:
                     no_change_count = 0
diff --git a/src/finn/util/fpgadataflow.py b/src/finn/util/fpgadataflow.py
index f11192a12..c27255748 100644
--- a/src/finn/util/fpgadataflow.py
+++ b/src/finn/util/fpgadataflow.py
@@ -45,3 +45,10 @@ def pyverilate_stitched_ip(model):
     top_verilog = model.get_metadata_prop("wrapper_filename")
     sim = PyVerilator.build(top_verilog, verilog_path=all_verilog_dirs)
     return sim
+
+
+def pyverilate_get_liveness_threshold_cycles():
+    """Return the number of no-output cycles rtlsim will wait before assuming
+    the simulation is not finishing and throwing an exception."""
+
+    return os.getenv("LIVENESS_THRESHOLD", 100)
-- 
GitLab