diff --git a/notebooks/6-FINN-CodeGenerationAndCompilation.ipynb b/notebooks/6-FINN-CodeGenerationAndCompilation.ipynb
index df28989756bde4e1984bb18f94528ef935854f3c..66d6d0fe9516c2fa721dce08b1e9e4f7eba86a50 100644
--- a/notebooks/6-FINN-CodeGenerationAndCompilation.ipynb
+++ b/notebooks/6-FINN-CodeGenerationAndCompilation.ipynb
@@ -53,7 +53,7 @@
    "outputs": [],
    "source": [
     "from onnx import TensorProto, helper\n",
-    "import finn.core.utils as util\n",
+    "import finn.util.basic as util\n",
     "from finn.core.datatype import DataType\n",
     "from finn.core.modelwrapper import ModelWrapper"
    ]
diff --git a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py
index d7485b924e7ddb7f59fbc9e316df4d74e50218bc..ff20adce6c513c212059373823ebf3aaf76b8cea 100644
--- a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py
+++ b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py
@@ -1,8 +1,8 @@
 import os
 import xml.etree.ElementTree as ET
 
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 
 
 def hls_synth_res_estimation(model):
diff --git a/src/finn/analysis/fpgadataflow/res_estimation.py b/src/finn/analysis/fpgadataflow/res_estimation.py
index 1693e413dcf0f2bee2587984c4f1db9de8a9cb68..eb2d81037774fe7f888c2b3f547da9288b2201e9 100644
--- a/src/finn/analysis/fpgadataflow/res_estimation.py
+++ b/src/finn/analysis/fpgadataflow/res_estimation.py
@@ -1,5 +1,5 @@
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 
 
 def res_estimation(model):
diff --git a/src/finn/core/modelwrapper.py b/src/finn/core/modelwrapper.py
index 483fc0bcf1f1029c50a18ace37bc8d855d55285b..3b541b06ee4dd7a6e51b5d4ad131838bc9b2542c 100644
--- a/src/finn/core/modelwrapper.py
+++ b/src/finn/core/modelwrapper.py
@@ -5,7 +5,7 @@ import onnx.helper as oh
 import onnx.numpy_helper as np_helper
 from onnx import TensorProto
 
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.core.datatype import DataType
 
 
diff --git a/src/finn/custom_op/__init__.py b/src/finn/custom_op/__init__.py
index 797916cf20ce9c61cc349df41383b687ed0c101b..4e95763f3a7aa52f23b3c0ed8b0b7840c76c9ebf 100644
--- a/src/finn/custom_op/__init__.py
+++ b/src/finn/custom_op/__init__.py
@@ -1,5 +1,5 @@
 from abc import ABC, abstractmethod
-from finn.core.utils import get_by_name
+from finn.util.basic import get_by_name
 import onnx.helper as helper
 
 
diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py
index 99a3e5be1848eae49931a8b77497f1db815c56ba..d95503dc2e5edc2087dc67d1796ad0a68de227bc 100644
--- a/src/finn/custom_op/fpgadataflow/__init__.py
+++ b/src/finn/custom_op/fpgadataflow/__init__.py
@@ -3,7 +3,7 @@ import numpy as np
 import os
 import subprocess
 from finn.custom_op import CustomOp
-from finn.core.utils import CppBuilder, IPGenBuilder
+from finn.util.basic import CppBuilder, IPGenBuilder
 from . import templates
 
 
diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
index acd577be3d5d58d1abcef8a1a2b64a029e9ced62..7585a6e8cc455aeffba7e3b34856b7d482998d37 100644
--- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
+++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py
@@ -4,14 +4,14 @@ import os
 import numpy as np
 from pyverilator import PyVerilator
 
-from finn.backend.fpgadataflow.utils import (
+from finn.core.datatype import DataType
+from finn.custom_op.fpgadataflow import HLSCustomOp
+from finn.util.basic import interleave_matrix_outer_dim_from_partitions
+from finn.util.fpgadataflow import (
     npy_to_rtlsim_input,
     numpy_to_hls_code,
     rtlsim_output_to_npy,
 )
-from finn.core.datatype import DataType
-from finn.core.utils import interleave_matrix_outer_dim_from_partitions
-from finn.custom_op.fpgadataflow import HLSCustomOp
 
 
 class StreamingFCLayer_Batch(HLSCustomOp):
diff --git a/src/finn/transformation/bipolar_to_xnor.py b/src/finn/transformation/bipolar_to_xnor.py
index ad785699f607cab0608884828795cd0f5e7017d3..26892e29c9c4d882f215de45d97651eb094a2251 100644
--- a/src/finn/transformation/bipolar_to_xnor.py
+++ b/src/finn/transformation/bipolar_to_xnor.py
@@ -3,9 +3,9 @@ from onnx import TensorProto
 from onnx import helper as oh
 
 from finn.core.datatype import DataType
-from finn.core.utils import get_by_name
 from finn.transformation import Transformation
 from finn.transformation.infer_shapes import InferShapes
+from finn.util.basic import get_by_name
 
 
 class ConvertBipolarMatMulToXnorPopcount(Transformation):
diff --git a/src/finn/transformation/fpgadataflow/cleanup.py b/src/finn/transformation/fpgadataflow/cleanup.py
index 741b69d57b09846ce1f6989bdb15de77f8175ce1..5979193fb383ede09014c5a66576baab9aecafdc 100644
--- a/src/finn/transformation/fpgadataflow/cleanup.py
+++ b/src/finn/transformation/fpgadataflow/cleanup.py
@@ -1,8 +1,8 @@
 import os
 import shutil
 
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 from finn.transformation import Transformation
 
 
diff --git a/src/finn/transformation/fpgadataflow/codegen_ipgen.py b/src/finn/transformation/fpgadataflow/codegen_ipgen.py
index 13686f846c7ee9893dd0ad7d12add79402599efb..2774aaaebd3029de38a786e556e8b57c8c1ed9cf 100644
--- a/src/finn/transformation/fpgadataflow/codegen_ipgen.py
+++ b/src/finn/transformation/fpgadataflow/codegen_ipgen.py
@@ -1,8 +1,8 @@
 import os
 
 import finn.custom_op.registry as registry
-from finn.core.utils import get_by_name, make_build_dir
 from finn.transformation import Transformation
+from finn.util.basic import get_by_name, make_build_dir
 
 
 def _codegen_single_node(node, model, fpgapart, clk):
diff --git a/src/finn/transformation/fpgadataflow/codegen_ipstitch.py b/src/finn/transformation/fpgadataflow/codegen_ipstitch.py
index e4c303f847940bb00bfe86bd917535ba477891a6..4cb148b17610719276410c4fa35a27bee6ac7493 100644
--- a/src/finn/transformation/fpgadataflow/codegen_ipstitch.py
+++ b/src/finn/transformation/fpgadataflow/codegen_ipstitch.py
@@ -1,8 +1,8 @@
 import os
 import subprocess
 
-from finn.core.utils import get_by_name, make_build_dir
 from finn.transformation import Transformation
+from finn.util.basic import get_by_name, make_build_dir
 
 
 class CodeGen_ipstitch(Transformation):
@@ -84,8 +84,7 @@ class CodeGen_ipstitch(Transformation):
                 assert node.op_type == "TLastMarker"
                 # make output external
                 connect_cmds.append(
-                    "make_bd_intf_pins_external [get_bd_intf_pins %s/out_r]"
-                    % inst_name
+                    "make_bd_intf_pins_external [get_bd_intf_pins %s/out_r]" % inst_name
                 )
 
         # create a temporary folder for the project
diff --git a/src/finn/transformation/fpgadataflow/codegen_npysim.py b/src/finn/transformation/fpgadataflow/codegen_npysim.py
index 51a7c5bb8257afbf8cadda11c97e87ef2c12e725..c0c90239072df525ab40b87274c75a0971f992ce 100644
--- a/src/finn/transformation/fpgadataflow/codegen_npysim.py
+++ b/src/finn/transformation/fpgadataflow/codegen_npysim.py
@@ -1,8 +1,8 @@
 import os
 
 import finn.custom_op.registry as registry
-from finn.core.utils import get_by_name, make_build_dir
 from finn.transformation import Transformation
+from finn.util.basic import get_by_name, make_build_dir
 
 
 def _codegen_single_node(node, model):
diff --git a/src/finn/transformation/fpgadataflow/compile.py b/src/finn/transformation/fpgadataflow/compile.py
index c4f6a1a094f0963845440280add791f2a349ba9d..8592844c7d908966b6f19ef5317d2bdb6313bb07 100644
--- a/src/finn/transformation/fpgadataflow/compile.py
+++ b/src/finn/transformation/fpgadataflow/compile.py
@@ -1,5 +1,5 @@
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 from finn.transformation import Transformation
 
 
diff --git a/src/finn/transformation/fpgadataflow/hlssynth_ipgen.py b/src/finn/transformation/fpgadataflow/hlssynth_ipgen.py
index f704b513e78e78b4dc08302efa56f19acfa62423..dd87ae51c9f51f494fb5181edc7be99f1e1ae7e1 100644
--- a/src/finn/transformation/fpgadataflow/hlssynth_ipgen.py
+++ b/src/finn/transformation/fpgadataflow/hlssynth_ipgen.py
@@ -1,5 +1,5 @@
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 from finn.transformation import Transformation
 
 
diff --git a/src/finn/transformation/fpgadataflow/make_pynq_proj.py b/src/finn/transformation/fpgadataflow/make_pynq_proj.py
index 4150ca532f272d84448f4b6d0e30c0a9d93390a4..a2bf211061546d05161e44737622b24de31a176a 100644
--- a/src/finn/transformation/fpgadataflow/make_pynq_proj.py
+++ b/src/finn/transformation/fpgadataflow/make_pynq_proj.py
@@ -3,8 +3,8 @@ import subprocess
 
 import numpy as np
 
-from finn.core.utils import get_by_name, make_build_dir, roundup_to_integer_multiple
 from finn.transformation import Transformation
+from finn.util.basic import get_by_name, make_build_dir, roundup_to_integer_multiple
 
 from . import templates
 
diff --git a/src/finn/transformation/fpgadataflow/set_sim_mode.py b/src/finn/transformation/fpgadataflow/set_sim_mode.py
index 31692c89bb8285f0aba70b27a344e8d66c21533c..2e760e3bb8d4808b3db945a109ed8d9d8370d100 100644
--- a/src/finn/transformation/fpgadataflow/set_sim_mode.py
+++ b/src/finn/transformation/fpgadataflow/set_sim_mode.py
@@ -1,5 +1,5 @@
-import finn.core.utils as util
 import finn.custom_op.registry as registry
+import finn.util.basic as util
 from finn.transformation import Transformation
 
 
diff --git a/src/finn/transformation/general.py b/src/finn/transformation/general.py
index b6845312b06c409fe244ad1126d6ce37c0d85ca2..5c138c5aad0cc4adf59a6aedad233321def9c4c4 100644
--- a/src/finn/transformation/general.py
+++ b/src/finn/transformation/general.py
@@ -1,4 +1,4 @@
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.transformation import Transformation
 
 
diff --git a/src/finn/backend/fpgadataflow/__init__.py b/src/finn/util/__init__.py
similarity index 100%
rename from src/finn/backend/fpgadataflow/__init__.py
rename to src/finn/util/__init__.py
diff --git a/src/finn/core/utils.py b/src/finn/util/basic.py
similarity index 100%
rename from src/finn/core/utils.py
rename to src/finn/util/basic.py
diff --git a/src/finn/backend/fpgadataflow/utils.py b/src/finn/util/fpgadataflow.py
similarity index 97%
rename from src/finn/backend/fpgadataflow/utils.py
rename to src/finn/util/fpgadataflow.py
index 257c2b0988b6dd8ed724c37cef120b1c4f0da473..c2d848d48a245a1c594dd10f3bdcda8783995b24 100644
--- a/src/finn/backend/fpgadataflow/utils.py
+++ b/src/finn/util/fpgadataflow.py
@@ -3,7 +3,7 @@ import sys
 import numpy as np
 
 from finn.core.datatype import DataType
-from finn.core.utils import (
+from finn.util.basic import (
     pack_innermost_dim_as_hex_string,
     unpack_innermost_dim_from_hex_string,
 )
@@ -65,7 +65,7 @@ def npy_to_rtlsim_input(input_file, input_dtype, pad_to_nbits):
     """Convert the multidimensional NumPy array of integers (stored as floats)
     from input_file into a flattened sequence of Python arbitrary-precision
     integers, packing the innermost dimension. See
-    finn.core.utils.pack_innermost_dim_as_hex_string() for more info on how the
+    finn.util.basic.pack_innermost_dim_as_hex_string() for more info on how the
     packing works."""
 
     inp = np.load(input_file)
diff --git a/tests/fpgadataflow/test_code_gen_trafo.py b/tests/fpgadataflow/test_code_gen_trafo.py
index 308f2c3b278fd9ef56d413ce94775a35e8240101..db966c4952f7cf971ad7c85eb3c53ea5dc8fe41f 100644
--- a/tests/fpgadataflow/test_code_gen_trafo.py
+++ b/tests/fpgadataflow/test_code_gen_trafo.py
@@ -2,7 +2,7 @@ import os
 
 from onnx import TensorProto, helper
 
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.fpgadataflow.cleanup import CleanUp
diff --git a/tests/fpgadataflow/test_compilation_trafo.py b/tests/fpgadataflow/test_compilation_trafo.py
index d6e5d3f111d4c0595305fc54653b925bdefc2157..3579485f37fb84a4bed6b5ca575e27c689a6521d 100644
--- a/tests/fpgadataflow/test_compilation_trafo.py
+++ b/tests/fpgadataflow/test_compilation_trafo.py
@@ -2,7 +2,7 @@ import os
 
 from onnx import TensorProto, helper
 
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.fpgadataflow.cleanup import CleanUp
diff --git a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
index e558807d7936e084a3cd8d8739fc4335f6642c0e..7b08e4ae8629c74776380b95a9d0ba26558bf95b 100644
--- a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
+++ b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py
@@ -6,7 +6,6 @@ from onnx import TensorProto, helper
 import finn.core.onnx_exec as oxe
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
-from finn.core.utils import gen_finn_dt_tensor
 from finn.transformation.fpgadataflow.cleanup import CleanUp
 from finn.transformation.fpgadataflow.codegen_ipgen import CodeGen_ipgen
 from finn.transformation.fpgadataflow.codegen_npysim import CodeGen_npysim
@@ -14,6 +13,7 @@ from finn.transformation.fpgadataflow.compile import Compile
 from finn.transformation.fpgadataflow.hlssynth_ipgen import HLSSynth_IPGen
 from finn.transformation.fpgadataflow.set_sim_mode import SetSimMode
 from finn.transformation.general import GiveUniqueNodeNames
+from finn.util.basic import gen_finn_dt_tensor
 
 
 def get_im2col_indices(x_shape, k, stride):
diff --git a/tests/fpgadataflow/test_fpgadataflow_fclayer.py b/tests/fpgadataflow/test_fpgadataflow_fclayer.py
index 0c40000762019c93c049eeadc684c5f6043f6fcb..9e174b3d39f35495e0c8f269ad8bd136f288b86c 100644
--- a/tests/fpgadataflow/test_fpgadataflow_fclayer.py
+++ b/tests/fpgadataflow/test_fpgadataflow_fclayer.py
@@ -8,7 +8,6 @@ import finn.custom_op.xnorpopcount as xp
 from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
-from finn.core.utils import calculate_signed_dot_prod_range, gen_finn_dt_tensor
 from finn.custom_op.multithreshold import multithreshold
 from finn.transformation.fpgadataflow.cleanup import CleanUp
 from finn.transformation.fpgadataflow.codegen_ipgen import CodeGen_ipgen
@@ -17,6 +16,7 @@ from finn.transformation.fpgadataflow.compile import Compile
 from finn.transformation.fpgadataflow.hlssynth_ipgen import HLSSynth_IPGen
 from finn.transformation.fpgadataflow.set_sim_mode import SetSimMode
 from finn.transformation.general import GiveUniqueNodeNames
+from finn.util.basic import calculate_signed_dot_prod_range, gen_finn_dt_tensor
 
 
 def make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T=None, tdt=None):
diff --git a/tests/fpgadataflow/test_fpgadataflow_ip_stitch.py b/tests/fpgadataflow/test_fpgadataflow_ip_stitch.py
index c17925531ac80b99353df3eab38033e8ec6c897b..604ddf1a581388bd294664058eff015a9f19bd1e 100644
--- a/tests/fpgadataflow/test_fpgadataflow_ip_stitch.py
+++ b/tests/fpgadataflow/test_fpgadataflow_ip_stitch.py
@@ -7,13 +7,13 @@ from onnx import TensorProto, helper
 
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
-from finn.core.utils import calculate_signed_dot_prod_range, gen_finn_dt_tensor
 from finn.transformation.fpgadataflow.codegen_ipgen import CodeGen_ipgen
 from finn.transformation.fpgadataflow.codegen_ipstitch import CodeGen_ipstitch
 from finn.transformation.fpgadataflow.hlssynth_ipgen import HLSSynth_IPGen
 from finn.transformation.fpgadataflow.make_pynq_proj import MakePYNQProject
 from finn.transformation.fpgadataflow.synth_pynq_proj import SynthPYNQProject
 from finn.transformation.general import GiveUniqueNodeNames
+from finn.util.basic import calculate_signed_dot_prod_range, gen_finn_dt_tensor
 
 # TODO control board/part for tests from a global place
 # settings for Ultra96
diff --git a/tests/fpgadataflow/test_npy2hls.py b/tests/fpgadataflow/test_npy2hls.py
index 775b486c0ac3c9b9354f33b28127b00adc694af6..daa6356a66296dfb243447796284e44a2c91d4c6 100644
--- a/tests/fpgadataflow/test_npy2hls.py
+++ b/tests/fpgadataflow/test_npy2hls.py
@@ -3,13 +3,13 @@ import subprocess
 
 import numpy as np
 
-import finn.core.utils as cutil
-from finn.backend.fpgadataflow.utils import numpy_to_hls_code
+import finn.util.basic as cutil
 from finn.core.datatype import DataType
+from finn.util.fpgadataflow import numpy_to_hls_code
 
 
 def make_npy2apintstream_testcase(ndarray, dtype):
-    test_dir = make_build_dir(prefix="test_npy2apintstream_")
+    test_dir = cutil.make_build_dir(prefix="test_npy2apintstream_")
     shape = ndarray.shape
     elem_bits = dtype.bitwidth()
     packed_bits = shape[-1] * elem_bits
diff --git a/tests/fpgadataflow/test_rtlsim2npy.py b/tests/fpgadataflow/test_rtlsim2npy.py
index 9c8087906dd9e5700811568fb3459cc1c168ac32..56281d6bfd88958a39ddb215e70b7eb38a879d10 100644
--- a/tests/fpgadataflow/test_rtlsim2npy.py
+++ b/tests/fpgadataflow/test_rtlsim2npy.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 from finn.core.datatype import DataType
-from finn.core.utils import unpack_innermost_dim_from_hex_string
+from finn.util.basic import unpack_innermost_dim_from_hex_string
 
 
 def test_unpack_innermost_dim_from_hex_string():
diff --git a/tests/test_gen_FINN_dt_tensor.py b/tests/test_gen_finn_dt_tensor.py
similarity index 97%
rename from tests/test_gen_FINN_dt_tensor.py
rename to tests/test_gen_finn_dt_tensor.py
index 444b60ed42b5d13927f93ab95eeabb9727ce907f..a640690ab44abdd24206e4f8fc4260e46c9cb808 100644
--- a/tests/test_gen_FINN_dt_tensor.py
+++ b/tests/test_gen_finn_dt_tensor.py
@@ -1,6 +1,4 @@
-import numpy as np
-
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.core.datatype import DataType
 
 
diff --git a/tests/test_padding.py b/tests/test_padding.py
index 8075b1be8fc2ad442e29ef9ed56b22b178ce66ee..4475c44c3bc8d05be858d77fe02a82d480e8c372 100644
--- a/tests/test_padding.py
+++ b/tests/test_padding.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-from finn.core.utils import pad_tensor_to_multiple_of
+from finn.util.basic import pad_tensor_to_multiple_of
 
 
 def test_pad_tensor_to_multiple_of():
diff --git a/tests/test_set_attribute.py b/tests/test_set_attribute.py
index 7e56fdbb938441115bf458532560af8ac803b4f9..50e379194d715a9be68dcf44feefa1c3a351cd72 100644
--- a/tests/test_set_attribute.py
+++ b/tests/test_set_attribute.py
@@ -2,7 +2,7 @@ from onnx import TensorProto, helper
 
 from finn.core.datatype import DataType
 from finn.core.modelwrapper import ModelWrapper
-from finn.core.utils import get_by_name
+from finn.util.basic import get_by_name
 
 
 def test_set_attribute():
diff --git a/tests/test_shape_utils.py b/tests/test_shape_utils.py
index 09e14bb05a52579af56d65cd0f4ef75c49fd5d81..f24461a12ace586b540ae51aff0079e3b9694318 100644
--- a/tests/test_shape_utils.py
+++ b/tests/test_shape_utils.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-import finn.core.utils as util
+import finn.util.basic as util
 
 
 def test_interleave_matrix_outer_dim_from_partitions():
diff --git a/tests/transformation/test_infer_shapes.py b/tests/transformation/test_infer_shapes.py
index 20841b32275968ed842fdbbebffa7168b61b7e06..253344ed46c17ea44a20e96149c19f225fc12ceb 100644
--- a/tests/transformation/test_infer_shapes.py
+++ b/tests/transformation/test_infer_shapes.py
@@ -3,7 +3,7 @@ from pkgutil import get_data
 import numpy as np
 from onnx import TensorProto, helper
 
-import finn.core.utils as util
+import finn.util.basic as util
 from finn.core.modelwrapper import ModelWrapper
 from finn.transformation.infer_shapes import InferShapes