diff --git a/finn-rtllib/checksum/checksum.cpp b/finn-rtllib/checksum/checksum.cpp
index 494adee8504e635040f8a00e897d57d492e6ca4a..3ea3870d354a494b2d840688b8762cbc3cca9c44 100644
--- a/finn-rtllib/checksum/checksum.cpp
+++ b/finn-rtllib/checksum/checksum.cpp
@@ -33,19 +33,4 @@
  *
  *******************************************************************************/
 #include "checksum.hpp"
-
-
-using  T = ap_uint<32>;
-
-void checksum_top(
-	hls::stream<T> &src,
-	hls::stream<T> &dst,
-	ap_uint<32>    &chk
-) {
-#pragma HLS interface port=src axis
-#pragma HLS interface port=dst axis
-#pragma HLS interface port=chk ap_ovld
-#pragma HLS interface port=return ap_ctrl_none
-#pragma HLS dataflow
-	checksum<60, 4>(src, dst, chk);
-}
+CHECKSUM_TOP(WORDS_PER_FRAME, WORD_SIZE, ITEMS_PER_WORD)
diff --git a/finn-rtllib/checksum/checksum.hpp b/finn-rtllib/checksum/checksum.hpp
index ed45b5d5700685bfe735b7e7eb5bc3bad47626f6..e38b66b0b08d9cf1d506e2e2a74e287453430273 100644
--- a/finn-rtllib/checksum/checksum.hpp
+++ b/finn-rtllib/checksum/checksum.hpp
@@ -112,3 +112,20 @@ void checksum(
 #pragma HLS reset variable=cnt
 	chk = (cnt++, s);
 }
+
+#define CHECKSUM_TOP_(WORDS_PER_FRAME, WORD_SIZE, ITEMS_PER_WORD) \
+	using  T = ap_uint<WORD_SIZE>; \
+	void checksum_ ## WORDS_PER_FRAME ## _ ## WORD_SIZE ## _ ## ITEMS_PER_WORD ( \
+		hls::stream<T> &src, \
+		hls::stream<T> &dst, \
+		ap_uint<32>    &chk \
+	) { \
+	_Pragma("HLS interface port=src axis") \
+	_Pragma("HLS interface port=dst axis") \
+	_Pragma("HLS interface port=chk s_axilite") \
+	_Pragma("HLS interface port=return ap_ctrl_none") \
+	_Pragma("HLS dataflow") \
+		checksum<WORDS_PER_FRAME, ITEMS_PER_WORD>(src, dst, chk); \
+	}
+#define CHECKSUM_TOP(WORDS_PER_FRAME, WORD_SIZE, ITEMS_PER_WORD) \
+	CHECKSUM_TOP_(WORDS_PER_FRAME, WORD_SIZE, ITEMS_PER_WORD)