From 5cf05f8d8b9b8668adaf8052546d26d4bdbb2e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Bron=C3=A8s?= <romain.brones@synchrotron-soleil.fr> Date: Thu, 4 Jul 2024 09:03:31 +0200 Subject: [PATCH] Change quantification of matrix multiplication * increase coeff +2 bits * add saturation and proper rounding on result (sat 7 bits, round 15 bits) * In scale with Libera implementation of MatMult --- hdl/matrix_mul.vhd | 6 ++++-- hdl/pkg_corrmatrix.vhd | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/hdl/matrix_mul.vhd b/hdl/matrix_mul.vhd index be3293e..07a7d79 100644 --- a/hdl/matrix_mul.vhd +++ b/hdl/matrix_mul.vhd @@ -241,8 +241,10 @@ begin matmult(I) <= (others => '0'); matmult(I+C_N_MM_PSC/2) <= (others => '0'); elsif rising_edge(clk) then - matmult(I) <= f_resize_sat(f_resize_lsb(accu_x, C_W_MM_ACCU-C_N_MM_RND), C_W_MM); - matmult(I+C_N_MM_PSC/2) <= f_resize_sat(f_resize_lsb(accu_y, C_W_MM_ACCU-C_N_MM_RND), C_W_MM); + matmult(I) <= f_resize_sat(f_resize_lsb(accu_x, C_W_MM_ACCU-C_N_MM_RND), C_W_MM) when accu_x(C_N_MM_RND-1) = '0' else + f_resize_sat(f_sum_sat(f_resize_lsb(accu_x, C_W_MM_ACCU-C_N_MM_RND), to_signed(1, C_W_MM_ACCU-C_N_MM_RND)), C_W_MM); + matmult(I+C_N_MM_PSC/2) <= f_resize_sat(f_resize_lsb(accu_y, C_W_MM_ACCU-C_N_MM_RND), C_W_MM) when accu_y(C_N_MM_RND-1) = '0' else + f_resize_sat(f_sum_sat(f_resize_lsb(accu_y, C_W_MM_ACCU-C_N_MM_RND), to_signed(1, C_W_MM_ACCU-C_N_MM_RND)), C_W_MM); end if; end process; diff --git a/hdl/pkg_corrmatrix.vhd b/hdl/pkg_corrmatrix.vhd index 6347315..bd5305b 100644 --- a/hdl/pkg_corrmatrix.vhd +++ b/hdl/pkg_corrmatrix.vhd @@ -26,15 +26,15 @@ package pkg_corr_matrix is constant C_N_MM_BPM : natural := 122; -- number of bpm (matrix columns) constant C_N_MM_PSC : natural := 100; -- number of psc (matrix lines) - constant C_W_MM_COEF : natural := 24; + constant C_W_MM_COEF : natural := 26; - constant C_W_MM_MULT : natural := 48; -- C_W_OE+C_W_MM_COEF; + constant C_W_MM_MULT : natural := 50; -- C_W_OE+C_W_MM_COEF; constant C_W_MM_IDCNT : natural := 8; -- > natural(ceil(log2(real(C_N_MM_BPM)))); - constant C_W_MM_ACCU : natural := 56; -- C_W_MM_MULT+C_W_MM_IDCNT; + constant C_W_MM_ACCU : natural := 58; -- C_W_MM_MULT+C_W_MM_IDCNT; - constant C_N_MM_SAT : natural := 0; - constant C_N_MM_RND : natural := 23; - constant C_W_MM : natural := 32; --C_W_MM_ACCU-C_N_MM_SAT-C_N_MM_RND + constant C_N_MM_SAT : natural := 7; + constant C_N_MM_RND : natural := 15; + constant C_W_MM : natural := 36; --C_W_MM_ACCU-C_N_MM_SAT-C_N_MM_RND -- PI corrector constant C_W_COR_COEF : natural := 17; -- GitLab