diff --git a/docker/finn_entrypoint.sh b/docker/finn_entrypoint.sh index 58b2e133ea2cad6644350eb8bf4d22afbb129cf9..945bb86760e22b40fb8465c3161e2577a305a6e5 100644 --- a/docker/finn_entrypoint.sh +++ b/docker/finn_entrypoint.sh @@ -17,7 +17,7 @@ BREVITAS_COMMIT=215cf44c76d562339fca368c8c3afee3110033e8 BREVITAS_EXAMPLES_COMMIT=2059f96bd576bf71f32c757e7f92617a70190c90 CNPY_COMMIT=4e8810b1a8637695171ed346ce68f6984e585ef4 HLSLIB_COMMIT=b139bf051ac8f8e0a3625509247f714127cf3317 -PYVERILATOR_COMMIT=307fc5c82db748620836307a2002fdc9fe170226 +PYVERILATOR_COMMIT=fb1afefa5b207acf6fec28f8abb72a862f2ca1d2 PYNQSHELL_COMMIT=db7e418767ce2a8e08fe732ddb3aa56ee79b7560 diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py index 9a6f66087fafff3745e239da4cb9f05c4ec73451..8579fdfba73eaceba92c7435d97e02f873c13aba 100644 --- a/src/finn/custom_op/fpgadataflow/__init__.py +++ b/src/finn/custom_op/fpgadataflow/__init__.py @@ -31,7 +31,12 @@ import numpy as np import os import subprocess from finn.custom_op import CustomOp -from finn.util.basic import CppBuilder, make_build_dir, roundup_to_integer_multiple +from finn.util.basic import ( + CppBuilder, + make_build_dir, + roundup_to_integer_multiple, + get_rtlsim_trace_depth, +) from finn.util.fpgadataflow import ( IPGenBuilder, pyverilate_get_liveness_threshold_cycles, @@ -128,6 +133,7 @@ class HLSCustomOp(CustomOp): code_gen_dir, self.onnx_node.name ) ], + trace_depth=get_rtlsim_trace_depth(), ) # save generated lib filename in attribute self.set_nodeattr("rtlsim_so", sim.lib._name) diff --git a/src/finn/util/basic.py b/src/finn/util/basic.py index 4eb0e6cb874f80620e3cb25017abcc29368b261b..bc413bf665e96be1d58a5de13b0744fd6a80f855 100644 --- a/src/finn/util/basic.py +++ b/src/finn/util/basic.py @@ -44,6 +44,19 @@ pynq_part_map["Pynq-Z2"] = "xc7z020clg400-1" pynq_part_map["ZCU104"] = "xczu7ev-ffvc1156-2-e" +def get_rtlsim_trace_depth(): + """Return the trace depth for rtlsim via PyVerilator. Controllable + via the RTLSIM_TRACE_DEPTH environment variable. If the env.var. is + undefined, the default value of 1 is returned. A trace depth of 1 + will only show top-level signals and yield smaller .vcd files. + """ + + try: + return int(os.environ["RTLSIM_TRACE_DEPTH"]) + except KeyError: + return 1 + + def get_num_default_workers(): """Return the number of workers for parallel transformations. Controllable via the NUM_DEFAULT_WORKERS environment variable. If the env.var. is diff --git a/src/finn/util/fpgadataflow.py b/src/finn/util/fpgadataflow.py index e84532d8d24909cc5add09fbc623a13c955ffb72..7a404cd53e0fcbc758a960fa2d31792fb6263a18 100644 --- a/src/finn/util/fpgadataflow.py +++ b/src/finn/util/fpgadataflow.py @@ -33,7 +33,7 @@ try: from pyverilator import PyVerilator except ModuleNotFoundError: PyVerilator = None -from finn.util.basic import get_by_name, make_build_dir +from finn.util.basic import get_by_name, make_build_dir, get_rtlsim_trace_depth class IPGenBuilder: @@ -87,7 +87,10 @@ def pyverilate_stitched_ip(model): top_verilog = model.get_metadata_prop("wrapper_filename") build_dir = make_build_dir("pyverilator_ipstitched_") sim = PyVerilator.build( - top_verilog, verilog_path=all_verilog_dirs, build_dir=build_dir + top_verilog, + verilog_path=all_verilog_dirs, + build_dir=build_dir, + trace_depth=get_rtlsim_trace_depth(), ) return sim diff --git a/tests/end2end/test_end2end_cnv_w1a1.py b/tests/end2end/test_end2end_cnv_w1a1.py index 53f34d4d772a458eed3d417cdeb8a962338b099c..527145ab0c1686fba7f93ddedfce6f28db09c01a 100644 --- a/tests/end2end/test_end2end_cnv_w1a1.py +++ b/tests/end2end/test_end2end_cnv_w1a1.py @@ -200,15 +200,11 @@ def test_end2end_cnv_w1a1_verify_dataflow_part(): # node-by-node rtlsim model = model.transform(SetExecMode("rtlsim")) model = model.transform(PrepareRTLSim()) - fc_layers = model.get_nodes_by_op_type("StreamingFCLayer_Batch") - for fcl in fc_layers: - getCustomOp(fcl).set_nodeattr("rtlsim_trace", "default") model.save(build_dir + "/end2end_cnv_w1a1_ipgen_nodebynode_rtlsim.onnx") ret_rtlsim_nodebynode = execute_onnx(model, inp_dict, True) res_rtlsim_nodebynode = ret_rtlsim_nodebynode[out_name] # whole-network (ip-stitched) rtlsim model.set_metadata_prop("exec_mode", "rtlsim") - model.set_metadata_prop("rtlsim_trace", "whole_trace.vcd") model.save(build_dir + "/end2end_cnv_w1a1_ipstitch_whole_rtlsim.onnx") # this is a particularly long-running test, set liveness thr. to unlimited os.environ["LIVENESS_THRESHOLD"] = "-1" diff --git a/tests/end2end/test_end2end_tfc_w1a1.py b/tests/end2end/test_end2end_tfc_w1a1.py index c30fd8dc04642be7fe59d24a2dfd10dbf29e8488..faf2d1031562ea9dabd63345c3583bfcffa83081 100644 --- a/tests/end2end/test_end2end_tfc_w1a1.py +++ b/tests/end2end/test_end2end_tfc_w1a1.py @@ -191,15 +191,11 @@ def test_end2end_tfc_w1a1_verify_dataflow_part(): # node-by-node rtlsim model = model.transform(SetExecMode("rtlsim")) model = model.transform(PrepareRTLSim()) - fc_layers = model.get_nodes_by_op_type("StreamingFCLayer_Batch") - for fcl in fc_layers: - getCustomOp(fcl).set_nodeattr("rtlsim_trace", "default") model.save(build_dir + "/end2end_tfc_w1a1_ipstitch_nodebynode_rtlsim.onnx") ret_rtlsim_nodebynode = execute_onnx(model, inp_dict, True) res_rtlsim_nodebynode = ret_rtlsim_nodebynode[out_name] # whole-network (ip-stitched) rtlsim model.set_metadata_prop("exec_mode", "rtlsim") - model.set_metadata_prop("rtlsim_trace", "whole_trace.vcd") model.save(build_dir + "/end2end_tfc_w1a1_ipstitch_whole_rtlsim.onnx") ret_rtlsim_whole = execute_onnx(model, inp_dict, True) res_rtlsim_whole = ret_rtlsim_whole[out_name] diff --git a/tests/end2end/test_end2end_tfc_w1a2.py b/tests/end2end/test_end2end_tfc_w1a2.py index b55d985e07ac40fc875c49ba201c9552fd62c411..18b42e245819ef9b4ea188a2e153043f85feb31a 100644 --- a/tests/end2end/test_end2end_tfc_w1a2.py +++ b/tests/end2end/test_end2end_tfc_w1a2.py @@ -175,15 +175,11 @@ def test_end2end_tfc_w1a2_verify_dataflow_part(): # node-by-node rtlsim model = model.transform(SetExecMode("rtlsim")) model = model.transform(PrepareRTLSim()) - fc_layers = model.get_nodes_by_op_type("StreamingFCLayer_Batch") - for fcl in fc_layers: - getCustomOp(fcl).set_nodeattr("rtlsim_trace", "default") model.save(build_dir + "/end2end_tfc_w1a2_ipstitch_nodebynode_rtlsim.onnx") ret_rtlsim_nodebynode = execute_onnx(model, inp_dict, True) res_rtlsim_nodebynode = ret_rtlsim_nodebynode[out_name] # whole-network (ip-stitched) rtlsim model.set_metadata_prop("exec_mode", "rtlsim") - model.set_metadata_prop("rtlsim_trace", "whole_trace.vcd") model.save(build_dir + "/end2end_tfc_w1a2_ipstitch_whole_rtlsim.onnx") ret_rtlsim_whole = execute_onnx(model, inp_dict, True) res_rtlsim_whole = ret_rtlsim_whole[out_name] diff --git a/tests/end2end/test_end2end_tfc_w2a2.py b/tests/end2end/test_end2end_tfc_w2a2.py index 92b8b18bc0253a07eec988c2bace9a9178682147..bd52a4585f660bfc46822722acd3188ba403d200 100644 --- a/tests/end2end/test_end2end_tfc_w2a2.py +++ b/tests/end2end/test_end2end_tfc_w2a2.py @@ -175,15 +175,11 @@ def test_end2end_tfc_w2a2_verify_dataflow_part(): # node-by-node rtlsim model = model.transform(SetExecMode("rtlsim")) model = model.transform(PrepareRTLSim()) - fc_layers = model.get_nodes_by_op_type("StreamingFCLayer_Batch") - for fcl in fc_layers: - getCustomOp(fcl).set_nodeattr("rtlsim_trace", "default") model.save(build_dir + "/end2end_tfc_w2a2_ipstitch_nodebynode_rtlsim.onnx") ret_rtlsim_nodebynode = execute_onnx(model, inp_dict, True) res_rtlsim_nodebynode = ret_rtlsim_nodebynode[out_name] # whole-network (ip-stitched) rtlsim model.set_metadata_prop("exec_mode", "rtlsim") - model.set_metadata_prop("rtlsim_trace", "whole_trace.vcd") model.save(build_dir + "/end2end_tfc_w2a2_ipstitch_whole_rtlsim.onnx") ret_rtlsim_whole = execute_onnx(model, inp_dict, True) res_rtlsim_whole = ret_rtlsim_whole[out_name]