From edb44a8034e5a89023e360701d071225cf4cb983 Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <yamanu@xilinx.com>
Date: Thu, 20 Feb 2020 16:13:10 +0000
Subject: [PATCH] [rtlsim] add optional tracing support to whole-model rtlsim

---
 src/finn/core/rtlsim_exec.py | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/finn/core/rtlsim_exec.py b/src/finn/core/rtlsim_exec.py
index 051b2e988..bc8d74b3e 100644
--- a/src/finn/core/rtlsim_exec.py
+++ b/src/finn/core/rtlsim_exec.py
@@ -14,6 +14,7 @@ def rtlsim_exec(model, execution_context):
     # ensure stitched ip project already exists
     assert os.path.isfile(model.get_metadata_prop("wrapper_filename"))
     assert os.path.isdir(model.get_metadata_prop("vivado_stitch_proj"))
+    trace_file = model.get_metadata_prop("rtlsim_trace")
     # extract input shape
     # TODO extend for multiple inputs
     i_name = model.graph.input[0].name
@@ -41,7 +42,7 @@ def rtlsim_exec(model, execution_context):
     sim = pyverilate_stitched_ip(model)
     _reset_rtlsim(sim)
     _toggle_clk(sim)
-    ret = _run_rtlsim(sim, packed_input, num_out_values)
+    ret = _run_rtlsim(sim, packed_input, num_out_values, trace_file)
     packed_output = ret[0]
     model.set_metadata_prop("sim_cycles", str(ret[1]))
     # unpack output and put into context
@@ -64,7 +65,7 @@ def _toggle_clk(sim):
     sim.io.ap_clk_0 = 0
 
 
-def _run_rtlsim(sim, inp, num_out_values):
+def _run_rtlsim(sim, inp, num_out_values, trace_file=None):
     # import pdb; pdb.set_trace()
     inputs = inp
     outputs = []
@@ -81,6 +82,9 @@ def _run_rtlsim(sim, inp, num_out_values):
     old_outputs = outputs
     liveness_threshold = pyverilate_get_liveness_threshold_cycles()
 
+    if trace_file is not None:
+        sim.start_vcd_trace(trace_file)
+
     while not (output_observed):
         sim.io.in0_V_V_0_tvalid = 1 if len(inputs) > 0 else 0
         sim.io.in0_V_V_0_tdata = inputs[0] if len(inputs) > 0 else 0
@@ -100,6 +104,9 @@ def _run_rtlsim(sim, inp, num_out_values):
 
         if no_change_count == liveness_threshold:
             if old_outputs == outputs:
+                if trace_file is not None:
+                    sim.flush_vcd_trace()
+                    sim.stop_vcd_trace()
                 raise Exception(
                     "Error in simulation! Takes too long to produce output."
                     "Consider setting the LIVENESS_THRESHOLD env.var. to a "
@@ -108,5 +115,8 @@ def _run_rtlsim(sim, inp, num_out_values):
             else:
                 no_change_count = 0
                 old_outputs = outputs
+    if trace_file is not None:
+        sim.flush_vcd_trace()
+        sim.stop_vcd_trace()
 
     return (outputs, sim_cycles)
-- 
GitLab