From 6e612423c5587b99435d113af6736c329cd82c41 Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Fri, 5 Nov 2021 13:00:35 +0100
Subject: [PATCH] Added verification for w =4, r = 2, 3 amd for w = 5, r = 3.

---
 libraries/base/common/tb/vhdl/tb_round.vhd    | 288 ++++++++++++++----
 libraries/base/common/tb/vhdl/tb_tb_round.vhd |   3 +
 2 files changed, 234 insertions(+), 57 deletions(-)

diff --git a/libraries/base/common/tb/vhdl/tb_round.vhd b/libraries/base/common/tb/vhdl/tb_round.vhd
index ee7235dc93..68d5cd7b26 100644
--- a/libraries/base/common/tb/vhdl/tb_round.vhd
+++ b/libraries/base/common/tb/vhdl/tb_round.vhd
@@ -24,7 +24,9 @@
 -- Description:
 --   The signal names in this VHDL tb are the same as in the document [1] and
 --   in the Python tb [2].
---   The verification uses expected results from [2].
+--   The verification uses expected results that were obtained and copied
+--   from [2]. The tb_tb_round.vhd tries different settings for w and r.
+--
 -- References:
 -- [1] https://support.astron.nl/confluence/display/L2M/L4+SDPFW+Decision%3A+Number+representation%2C+resizing+and+rounding
 -- [2] common_round_tb.py
@@ -40,8 +42,8 @@ USE work.common_pkg.ALL;
 
 ENTITY tb_round IS
   GENERIC (
-    g_in_dat_w        : NATURAL := 4;
-    g_out_dat_w       : NATURAL := 3
+    g_in_dat_w        : NATURAL := 4;  -- w = g_in_dat_w, in [2]
+    g_out_dat_w       : NATURAL := 1   -- r = g_in_dat_w - g_out_dat_w, in [2]
   );
 END tb_round;
 
@@ -56,32 +58,79 @@ ARCHITECTURE tb OF tb_round IS
   CONSTANT c_round_w          : INTEGER := g_in_dat_w - g_out_dat_w;
   
   -- Expected rounded results from [2] for w = g_in_dat_w = 4 and r = c_round_w = 1
-  CONSTANT c_exp_w4_r1_signed_truncate               : t_integer_arr(0 TO 15) := (-4, -4, -3, -3, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, 3, 3);
-  CONSTANT c_exp_w4_r1_signed_round_half_away        : t_integer_arr(0 TO 15) := (-4, -4, -3, -3, -2, -2, -1, -1, 0, 1, 1, 2, 2, 3, 3, -4);
-  CONSTANT c_exp_w4_r1_signed_round_half_away_clip   : t_integer_arr(0 TO 15) := (-4, -4, -3, -3, -2, -2, -1, -1, 0, 1, 1, 2, 2, 3, 3, 3);
-  CONSTANT c_exp_w4_r1_signed_round_half_even        : t_integer_arr(0 TO 15) := (-4, -4, -3, -2, -2, -2, -1, 0, 0, 0, 1, 2, 2, 2, 3, -4);
-  CONSTANT c_exp_w4_r1_signed_round_half_even_clip   : t_integer_arr(0 TO 15) := (-4, -4, -3, -2, -2, -2, -1, 0, 0, 0, 1, 2, 2, 2, 3, 3);
-
-  CONSTANT c_exp_w4_r1_unsigned_truncate             : t_natural_arr(0 TO 15) := (0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7);
-  CONSTANT c_exp_w4_r1_unsigned_round_half_up        : t_natural_arr(0 TO 15) := (0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0);
-  CONSTANT c_exp_w4_r1_unsigned_round_half_up_clip   : t_natural_arr(0 TO 15) := (0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7);
-  CONSTANT c_exp_w4_r1_unsigned_round_half_even      : t_natural_arr(0 TO 15) := (0, 0, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 0);
-  CONSTANT c_exp_w4_r1_unsigned_round_half_even_clip : t_natural_arr(0 TO 15) := (0, 0, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 7);
+  CONSTANT c_exp_w4_r1_sreal_fixed_point             : t_real_arr(0 TO 15)    := (-4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5);
+  CONSTANT c_exp_w4_r1_signed_truncate               : t_integer_arr(0 TO 15) := (-4,   -4,   -3,   -3,   -2,   -2,   -1,   -1,   0,   0,   1,   1,   2,   2,   3,   3);
+  CONSTANT c_exp_w4_r1_signed_round_half_away        : t_integer_arr(0 TO 15) := (-4,   -4,   -3,   -3,   -2,   -2,   -1,   -1,   0,   1,   1,   2,   2,   3,   3,  -4);
+  CONSTANT c_exp_w4_r1_signed_round_half_away_clip   : t_integer_arr(0 TO 15) := (-4,   -4,   -3,   -3,   -2,   -2,   -1,   -1,   0,   1,   1,   2,   2,   3,   3,   3);
+  CONSTANT c_exp_w4_r1_signed_round_half_even        : t_integer_arr(0 TO 15) := (-4,   -4,   -3,   -2,   -2,   -2,   -1,    0,   0,   0,   1,   2,   2,   2,   3,  -4);
+  CONSTANT c_exp_w4_r1_signed_round_half_even_clip   : t_integer_arr(0 TO 15) := (-4,   -4,   -3,   -2,   -2,   -2,   -1,    0,   0,   0,   1,   2,   2,   2,   3,   3);
+
+  CONSTANT c_exp_w4_r1_unsigned_fixed_point          : t_real_arr(0 TO 15)    := (0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5);
+  CONSTANT c_exp_w4_r1_unsigned_truncate             : t_natural_arr(0 TO 15) := (0,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7);
+  CONSTANT c_exp_w4_r1_unsigned_round_half_up        : t_natural_arr(0 TO 15) := (0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   0);
+  CONSTANT c_exp_w4_r1_unsigned_round_half_up_clip   : t_natural_arr(0 TO 15) := (0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   7);
+  CONSTANT c_exp_w4_r1_unsigned_round_half_even      : t_natural_arr(0 TO 15) := (0,   0,   1,   2,   2,   2,   3,   4,   4,   4,   5,   6,   6,   6,   7,   0);
+  CONSTANT c_exp_w4_r1_unsigned_round_half_even_clip : t_natural_arr(0 TO 15) := (0,   0,   1,   2,   2,   2,   3,   4,   4,   4,   5,   6,   6,   6,   7,   7);
+
+  -- Expected rounded results from [2] for w = g_in_dat_w = 4 and r = c_round_w = 2
+  CONSTANT c_exp_w4_r2_sreal_fixed_point           : t_real_arr(0 TO 15)    := (-2.0, -1.75, -1.5, -1.25, -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75);
+  CONSTANT c_exp_w4_r2_signed_truncate             : t_integer_arr(0 TO 15) := (-2,   -2,    -2,   -2,    -1,   -1,    -1,   -1,    0,   0,    0,   0,    1,   1,    1,   1);
+  CONSTANT c_exp_w4_r2_signed_round_half_away      : t_integer_arr(0 TO 15) := (-2,   -2,    -2,   -1,    -1,   -1,    -1,    0,    0,   0,    1,   1,    1,   1,   -2,  -2);
+  CONSTANT c_exp_w4_r2_signed_round_half_away_clip : t_integer_arr(0 TO 15) := (-2,   -2,    -2,   -1,    -1,   -1,    -1,    0,    0,   0,    1,   1,    1,   1,    1,   1);
+  CONSTANT c_exp_w4_r2_signed_round_half_even      : t_integer_arr(0 TO 15) := (-2,   -2,    -2,   -1,    -1,   -1,     0,    0,    0,   0,    0,   1,    1,   1,   -2,  -2);
+  CONSTANT c_exp_w4_r2_signed_round_half_even_clip : t_integer_arr(0 TO 15) := (-2,   -2,    -2,   -1,    -1,   -1,     0,    0,    0,   0,    0,   1,    1,   1,    1,   1);
+
+  CONSTANT c_exp_w4_r2_unsigned_fixed_point          : t_real_arr(0 TO 15)    := (0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75);
+  CONSTANT c_exp_w4_r2_unsigned_truncate             : t_natural_arr(0 TO 15) := (0,   0,    0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3);
+  CONSTANT c_exp_w4_r2_unsigned_round_half_up        : t_natural_arr(0 TO 15) := (0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    0,   0);
+  CONSTANT c_exp_w4_r2_unsigned_round_half_up_clip   : t_natural_arr(0 TO 15) := (0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    3,   3);
+  CONSTANT c_exp_w4_r2_unsigned_round_half_even      : t_natural_arr(0 TO 15) := (0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,    0,   0);
+  CONSTANT c_exp_w4_r2_unsigned_round_half_even_clip : t_natural_arr(0 TO 15) := (0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,    3,   3);
+
+  -- Expected rounded results from [2] for w = g_in_dat_w = 4 and r = c_round_w = 3
+  CONSTANT c_exp_w4_r3_sreal_fixed_point           : t_real_arr(0 TO 15)    := (-1.0, -0.875, -0.75, -0.625, -0.5, -0.375, -0.25, -0.125, 0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875);
+  CONSTANT c_exp_w4_r3_signed_truncate             : t_integer_arr(0 TO 15) := (-1,   -1,     -1,    -1,     -1,   -1,     -1,    -1,     0,   0,     0,    0,     0,   0,     0,    0);
+  CONSTANT c_exp_w4_r3_signed_round_half_away      : t_integer_arr(0 TO 15) := (-1,   -1,     -1,    -1,     -1,    0,      0,     0,     0,   0,     0,    0,    -1,  -1,    -1,   -1);
+  CONSTANT c_exp_w4_r3_signed_round_half_away_clip : t_integer_arr(0 TO 15) := (-1,   -1,     -1,    -1,     -1,    0,      0,     0,     0,   0,     0,    0,     0,   0,     0,    0);
+  CONSTANT c_exp_w4_r3_signed_round_half_even      : t_integer_arr(0 TO 15) := (-1,   -1,     -1,    -1,      0,    0,      0,     0,     0,   0,     0,    0,     0,  -1,    -1,   -1);
+  CONSTANT c_exp_w4_r3_signed_round_half_even_clip : t_integer_arr(0 TO 15) := (-1,   -1,     -1,    -1,      0,    0,      0,     0,     0,   0,     0,    0,     0,   0,     0,    0);
+
+  CONSTANT c_exp_w4_r3_unsigned_fixed_point          : t_real_arr(0 TO 15)    := (0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875);
+  CONSTANT c_exp_w4_r3_unsigned_truncate             : t_natural_arr(0 TO 15) := (0,   0,     0,    0,     0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1);
+  CONSTANT c_exp_w4_r3_unsigned_round_half_up        : t_natural_arr(0 TO 15) := (0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     0,   0,     0,    0);
+  CONSTANT c_exp_w4_r3_unsigned_round_half_up_clip   : t_natural_arr(0 TO 15) := (0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     1,   1,     1,    1);
+  CONSTANT c_exp_w4_r3_unsigned_round_half_even      : t_natural_arr(0 TO 15) := (0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,     0,   0,     0,    0);
+  CONSTANT c_exp_w4_r3_unsigned_round_half_even_clip : t_natural_arr(0 TO 15) := (0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,     1,   1,     1,    1);
 
   -- Expected rounded results from [2] for w = g_in_dat_w = 5 and r = c_round_w = 2
-  CONSTANT c_exp_w5_r2_signed_truncate               : t_integer_arr(0 TO 31) := (-4, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3);
-  CONSTANT c_exp_w5_r2_signed_round_half_away        : t_integer_arr(0 TO 31) := (-4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, -4, -4);
-  CONSTANT c_exp_w5_r2_signed_round_half_away_clip   : t_integer_arr(0 TO 31) := (-4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -2, -1, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3);
-  CONSTANT c_exp_w5_r2_signed_round_half_even        : t_integer_arr(0 TO 31) := (-4, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, -4, -4);
-  CONSTANT c_exp_w5_r2_signed_round_half_even_clip   : t_integer_arr(0 TO 31) := (-4, -4, -4, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3);
-
-  CONSTANT c_exp_w5_r2_unsigned_truncate             : t_natural_arr(0 TO 31) := (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7);
-  CONSTANT c_exp_w5_r2_unsigned_truncate_symmetric   : t_natural_arr(0 TO 31) := (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7);
-  CONSTANT c_exp_w5_r2_unsigned_round_half_up        : t_natural_arr(0 TO 31) := (0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0);
-  CONSTANT c_exp_w5_r2_unsigned_round_half_up_clip   : t_natural_arr(0 TO 31) := (0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7);
-  CONSTANT c_exp_w5_r2_unsigned_round_half_even      : t_natural_arr(0 TO 31) := (0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 0, 0);
-  CONSTANT c_exp_w5_r2_unsigned_round_half_even_clip : t_natural_arr(0 TO 31) := (0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7);
-
+  CONSTANT c_exp_w5_r2_sreal_fixed_point             : t_real_arr(0 TO 31)    := (-4.0, -3.75, -3.5, -3.25, -3.0, -2.75, -2.5, -2.25, -2.0, -1.75, -1.5, -1.25, -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75);
+  CONSTANT c_exp_w5_r2_signed_truncate               : t_integer_arr(0 TO 31) := (-4,   -4,    -4,   -4,    -3,   -3,    -3,   -3,    -2,   -2,    -2,   -2,    -1,   -1,    -1,   -1,    0,   0,    0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3);
+  CONSTANT c_exp_w5_r2_signed_round_half_away        : t_integer_arr(0 TO 31) := (-4,   -4,    -4,   -3,    -3,   -3,    -3,   -2,    -2,   -2,    -2,   -1,    -1,   -1,    -1,    0,    0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,   -4,  -4);
+  CONSTANT c_exp_w5_r2_signed_round_half_away_clip   : t_integer_arr(0 TO 31) := (-4,   -4,    -4,   -3,    -3,   -3,    -3,   -2,    -2,   -2,    -2,   -1,    -1,   -1,    -1,    0,    0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    3,   3);
+  CONSTANT c_exp_w5_r2_signed_round_half_even        : t_integer_arr(0 TO 31) := (-4,   -4,    -4,   -3,    -3,   -3,    -2,   -2,    -2,   -2,    -2,   -1,    -1,   -1,     0,    0,    0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,   -4,  -4);
+  CONSTANT c_exp_w5_r2_signed_round_half_even_clip   : t_integer_arr(0 TO 31) := (-4,   -4,    -4,   -3,    -3,   -3,    -2,   -2,    -2,   -2,    -2,   -1,    -1,   -1,     0,    0,    0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,    3,   3);
+
+  CONSTANT c_exp_w5_r2_unsigned_fixed_point          : t_real_arr(0 TO 31)    := (0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75);
+  CONSTANT c_exp_w5_r2_unsigned_truncate             : t_natural_arr(0 TO 31) := (0,   0,    0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    4,   4,    4,   4,    5,   5,    5,   5,    6,   6,    6,   6,    7,   7,    7,   7);
+  CONSTANT c_exp_w5_r2_unsigned_round_half_up        : t_natural_arr(0 TO 31) := (0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    4,   4,    4,   4,    5,   5,    5,   5,    6,   6,    6,   6,    7,   7,    7,   7,    0,   0);
+  CONSTANT c_exp_w5_r2_unsigned_round_half_up_clip   : t_natural_arr(0 TO 31) := (0,   0,    1,   1,    1,   1,    2,   2,    2,   2,    3,   3,    3,   3,    4,   4,    4,   4,    5,   5,    5,   5,    6,   6,    6,   6,    7,   7,    7,   7,    7,   7);
+  CONSTANT c_exp_w5_r2_unsigned_round_half_even      : t_natural_arr(0 TO 31) := (0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,    4,   4,    4,   4,    4,   5,    5,   5,    6,   6,    6,   6,    6,   7,    7,   7,    0,   0);
+  CONSTANT c_exp_w5_r2_unsigned_round_half_even_clip : t_natural_arr(0 TO 31) := (0,   0,    0,   1,    1,   1,    2,   2,    2,   2,    2,   3,    3,   3,    4,   4,    4,   4,    4,   5,    5,   5,    6,   6,    6,   6,    6,   7,    7,   7,    7,   7);
+
+  -- Expected rounded results from [2] for w = g_in_dat_w = 5 and r = c_round_w = 3
+  CONSTANT c_exp_w5_r3_sreal_fixed_point           : t_real_arr(0 TO 31)    := (-2.0, -1.875, -1.75, -1.625, -1.5, -1.375, -1.25, -1.125, -1.0, -0.875, -0.75, -0.625, -0.5, -0.375, -0.25, -0.125, 0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875);
+  CONSTANT c_exp_w5_r3_signed_truncate             : t_integer_arr(0 TO 31) := (-2,   -2,     -2,    -2,     -2,   -2,     -2,    -2,     -1,   -1,     -1,    -1,     -1,   -1,     -1,    -1,     0,   0,     0,    0,     0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1);
+  CONSTANT c_exp_w5_r3_signed_round_half_away      : t_integer_arr(0 TO 31) := (-2,   -2,     -2,    -2,     -2,   -1,     -1,    -1,     -1,   -1,     -1,    -1,     -1,    0,      0,     0,     0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,    -2,  -2,    -2,   -2);
+  CONSTANT c_exp_w5_r3_signed_round_half_away_clip : t_integer_arr(0 TO 31) := (-2,   -2,     -2,    -2,     -2,   -1,     -1,    -1,     -1,   -1,     -1,    -1,     -1,    0,      0,     0,     0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     1,   1,     1,    1);
+  CONSTANT c_exp_w5_r3_signed_round_half_even      : t_integer_arr(0 TO 31) := (-2,   -2,     -2,    -2,     -2,   -1,     -1,    -1,     -1,   -1,     -1,    -1,      0,    0,      0,     0,     0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,    -2,  -2,    -2,   -2);
+  CONSTANT c_exp_w5_r3_signed_round_half_even_clip : t_integer_arr(0 TO 31) := (-2,   -2,     -2,    -2,     -2,   -1,     -1,    -1,     -1,   -1,     -1,    -1,      0,    0,      0,     0,     0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,     1,   1,     1,    1);
+
+  CONSTANT c_exp_w5_r3_unsigned_fixed_point          : t_real_arr(0 TO 31)    := (0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 2.0, 2.125, 2.25, 2.375, 2.5, 2.625, 2.75, 2.875, 3.0, 3.125, 3.25, 3.375, 3.5, 3.625, 3.75, 3.875);
+  CONSTANT c_exp_w5_r3_unsigned_truncate             : t_natural_arr(0 TO 31) := (0,   0,     0,    0,     0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     2,   2,     2,    2,     2,   2,     2,    2,     3,   3,     3,    3,     3,   3,     3,    3);
+  CONSTANT c_exp_w5_r3_unsigned_round_half_up        : t_natural_arr(0 TO 31) := (0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     2,   2,     2,    2,     2,   2,     2,    2,     3,   3,     3,    3,     3,   3,     3,    3,     0,   0,     0,    0);
+  CONSTANT c_exp_w5_r3_unsigned_round_half_up_clip   : t_natural_arr(0 TO 31) := (0,   0,     0,    0,     1,   1,     1,    1,     1,   1,     1,    1,     2,   2,     2,    2,     2,   2,     2,    2,     3,   3,     3,    3,     3,   3,     3,    3,     3,   3,     3,    3);
+  CONSTANT c_exp_w5_r3_unsigned_round_half_even      : t_natural_arr(0 TO 31) := (0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,     2,   2,     2,    2,     2,   2,     2,    2,     2,   3,     3,    3,     3,   3,     3,    3,     0,   0,     0,    0);
+  CONSTANT c_exp_w5_r3_unsigned_round_half_even_clip : t_natural_arr(0 TO 31) := (0,   0,     0,    0,     0,   1,     1,    1,     1,   1,     1,    1,     2,   2,     2,    2,     2,   2,     2,    2,     2,   3,     3,    3,     3,   3,     3,    3,     3,   3,     3,    3);
 
   SIGNAL tb_end               : STD_LOGIC := '0';
   SIGNAL clk                  : STD_LOGIC := '1';
@@ -91,7 +140,7 @@ ARCHITECTURE tb OF tb_round IS
   SIGNAL in_dat               : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
   SIGNAL reg_val              : STD_LOGIC;
   SIGNAL reg_dat              : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
-  
+
   -- Signed output data
   -- . view as radix decimal in Wave window
   SIGNAL fs_signed_integer                : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
@@ -101,20 +150,38 @@ ARCHITECTURE tb OF tb_round IS
   SIGNAL fs_signed_round_half_even        : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
   SIGNAL fs_signed_round_half_even_clip   : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
 
-  SIGNAL S_w4_r1                                 : NATURAL;  -- lookup index for signed
+  SIGNAL S_w4                                    : NATURAL;  -- lookup index for signed
   SIGNAL exp_w4_r1_signed_truncate               : INTEGER;
   SIGNAL exp_w4_r1_signed_round_half_away        : INTEGER;
   SIGNAL exp_w4_r1_signed_round_half_away_clip   : INTEGER;
   SIGNAL exp_w4_r1_signed_round_half_even        : INTEGER;
   SIGNAL exp_w4_r1_signed_round_half_even_clip   : INTEGER;
 
-  SIGNAL S_w5_r2                                 : NATURAL;  -- lookup index for signed
+  SIGNAL exp_w4_r2_signed_truncate               : INTEGER;
+  SIGNAL exp_w4_r2_signed_round_half_away        : INTEGER;
+  SIGNAL exp_w4_r2_signed_round_half_away_clip   : INTEGER;
+  SIGNAL exp_w4_r2_signed_round_half_even        : INTEGER;
+  SIGNAL exp_w4_r2_signed_round_half_even_clip   : INTEGER;
+
+  SIGNAL exp_w4_r3_signed_truncate               : INTEGER;
+  SIGNAL exp_w4_r3_signed_round_half_away        : INTEGER;
+  SIGNAL exp_w4_r3_signed_round_half_away_clip   : INTEGER;
+  SIGNAL exp_w4_r3_signed_round_half_even        : INTEGER;
+  SIGNAL exp_w4_r3_signed_round_half_even_clip   : INTEGER;
+
+  SIGNAL S_w5                                    : NATURAL;  -- lookup index for signed
   SIGNAL exp_w5_r2_signed_truncate               : INTEGER;
   SIGNAL exp_w5_r2_signed_round_half_away        : INTEGER;
   SIGNAL exp_w5_r2_signed_round_half_away_clip   : INTEGER;
   SIGNAL exp_w5_r2_signed_round_half_even        : INTEGER;
   SIGNAL exp_w5_r2_signed_round_half_even_clip   : INTEGER;
 
+  SIGNAL exp_w5_r3_signed_truncate               : INTEGER;
+  SIGNAL exp_w5_r3_signed_round_half_away        : INTEGER;
+  SIGNAL exp_w5_r3_signed_round_half_away_clip   : INTEGER;
+  SIGNAL exp_w5_r3_signed_round_half_even        : INTEGER;
+  SIGNAL exp_w5_r3_signed_round_half_even_clip   : INTEGER;
+
   -- . show as real in Wave window
   SIGNAL fs_sreal_fixed_point             : REAL := 0.0;
   SIGNAL fs_sreal_truncate                : REAL := 0.0;
@@ -132,20 +199,38 @@ ARCHITECTURE tb OF tb_round IS
   SIGNAL fs_unsigned_round_half_even      : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
   SIGNAL fs_unsigned_round_half_even_clip : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
 
-  SIGNAL U_w4_r1                                 : NATURAL;  -- lookup index for unsigned
+  SIGNAL U_w4                                    : NATURAL;  -- lookup index for unsigned
   SIGNAL exp_w4_r1_unsigned_truncate             : INTEGER;
   SIGNAL exp_w4_r1_unsigned_round_half_up        : INTEGER;
   SIGNAL exp_w4_r1_unsigned_round_half_up_clip   : INTEGER;
   SIGNAL exp_w4_r1_unsigned_round_half_even      : INTEGER;
   SIGNAL exp_w4_r1_unsigned_round_half_even_clip : INTEGER;
 
-  SIGNAL U_w5_r2                                 : NATURAL;  -- lookup index for unsigned
+  SIGNAL exp_w4_r2_unsigned_truncate             : INTEGER;
+  SIGNAL exp_w4_r2_unsigned_round_half_up        : INTEGER;
+  SIGNAL exp_w4_r2_unsigned_round_half_up_clip   : INTEGER;
+  SIGNAL exp_w4_r2_unsigned_round_half_even      : INTEGER;
+  SIGNAL exp_w4_r2_unsigned_round_half_even_clip : INTEGER;
+
+  SIGNAL exp_w4_r3_unsigned_truncate             : INTEGER;
+  SIGNAL exp_w4_r3_unsigned_round_half_up        : INTEGER;
+  SIGNAL exp_w4_r3_unsigned_round_half_up_clip   : INTEGER;
+  SIGNAL exp_w4_r3_unsigned_round_half_even      : INTEGER;
+  SIGNAL exp_w4_r3_unsigned_round_half_even_clip : INTEGER;
+
+  SIGNAL U_w5                                    : NATURAL;  -- lookup index for unsigned
   SIGNAL exp_w5_r2_unsigned_truncate             : INTEGER;
   SIGNAL exp_w5_r2_unsigned_round_half_up        : INTEGER;
   SIGNAL exp_w5_r2_unsigned_round_half_up_clip   : INTEGER;
   SIGNAL exp_w5_r2_unsigned_round_half_even      : INTEGER;
   SIGNAL exp_w5_r2_unsigned_round_half_even_clip : INTEGER;
 
+  SIGNAL exp_w5_r3_unsigned_truncate             : INTEGER;
+  SIGNAL exp_w5_r3_unsigned_round_half_up        : INTEGER;
+  SIGNAL exp_w5_r3_unsigned_round_half_up_clip   : INTEGER;
+  SIGNAL exp_w5_r3_unsigned_round_half_even      : INTEGER;
+  SIGNAL exp_w5_r3_unsigned_round_half_even_clip : INTEGER;
+
   -- . show as real in Wave window
   SIGNAL fs_ureal_fixed_point             : REAL := 0.0;
   SIGNAL fs_ureal_truncate                : REAL := 0.0;
@@ -376,31 +461,78 @@ BEGIN
   fs_ureal_round_half_even_clip <= TO_UREAL(fs_unsigned_round_half_even_clip, 0);
 
   -- Expected rounded values
-  S_w4_r1 <= (TO_UINT(in_dat) + 8) MOD 16;  -- 2**4 = 16
-  exp_w4_r1_signed_truncate             <= c_exp_w4_r1_signed_truncate(S_w4_r1);
-  exp_w4_r1_signed_round_half_away      <= c_exp_w4_r1_signed_round_half_away(S_w4_r1);
-  exp_w4_r1_signed_round_half_away_clip <= c_exp_w4_r1_signed_round_half_away_clip(S_w4_r1);
-  exp_w4_r1_signed_round_half_even      <= c_exp_w4_r1_signed_round_half_even(S_w4_r1);
-  exp_w4_r1_signed_round_half_even_clip <= c_exp_w4_r1_signed_round_half_even_clip(S_w4_r1);
-  U_w4_r1 <= TO_UINT(in_dat) MOD 16;
-  exp_w4_r1_unsigned_truncate             <= c_exp_w4_r1_unsigned_truncate(U_w4_r1);
-  exp_w4_r1_unsigned_round_half_up        <= c_exp_w4_r1_unsigned_round_half_up(U_w4_r1);
-  exp_w4_r1_unsigned_round_half_up_clip   <= c_exp_w4_r1_unsigned_round_half_up_clip(U_w4_r1);
-  exp_w4_r1_unsigned_round_half_even      <= c_exp_w4_r1_unsigned_round_half_even(U_w4_r1);
-  exp_w4_r1_unsigned_round_half_even_clip <= c_exp_w4_r1_unsigned_round_half_even_clip(U_w4_r1);
-
-  S_w5_r2 <= (TO_UINT(in_dat) + 16) MOD 32;  -- 2**5 = 32
-  exp_w5_r2_signed_truncate             <= c_exp_w5_r2_signed_truncate(S_w5_r2);
-  exp_w5_r2_signed_round_half_away      <= c_exp_w5_r2_signed_round_half_away(S_w5_r2);
-  exp_w5_r2_signed_round_half_away_clip <= c_exp_w5_r2_signed_round_half_away_clip(S_w5_r2);
-  exp_w5_r2_signed_round_half_even      <= c_exp_w5_r2_signed_round_half_even(S_w5_r2);
-  exp_w5_r2_signed_round_half_even_clip <= c_exp_w5_r2_signed_round_half_even_clip(S_w5_r2);
-  U_w5_r2 <= TO_UINT(in_dat) MOD 32;
-  exp_w5_r2_unsigned_truncate             <= c_exp_w5_r2_unsigned_truncate(U_w5_r2);
-  exp_w5_r2_unsigned_round_half_up        <= c_exp_w5_r2_unsigned_round_half_up(U_w5_r2);
-  exp_w5_r2_unsigned_round_half_up_clip   <= c_exp_w5_r2_unsigned_round_half_up_clip(U_w5_r2);
-  exp_w5_r2_unsigned_round_half_even      <= c_exp_w5_r2_unsigned_round_half_even(U_w5_r2);
-  exp_w5_r2_unsigned_round_half_even_clip <= c_exp_w5_r2_unsigned_round_half_even_clip(U_w5_r2);
+  -- . w = 4
+  S_w4 <= (TO_UINT(in_dat) + 8) MOD 16;  -- 2**4 = 16
+  U_w4 <= TO_UINT(in_dat) MOD 16;
+
+  -- . w = 4, r = 1
+  exp_w4_r1_signed_truncate             <= c_exp_w4_r1_signed_truncate(S_w4);
+  exp_w4_r1_signed_round_half_away      <= c_exp_w4_r1_signed_round_half_away(S_w4);
+  exp_w4_r1_signed_round_half_away_clip <= c_exp_w4_r1_signed_round_half_away_clip(S_w4);
+  exp_w4_r1_signed_round_half_even      <= c_exp_w4_r1_signed_round_half_even(S_w4);
+  exp_w4_r1_signed_round_half_even_clip <= c_exp_w4_r1_signed_round_half_even_clip(S_w4);
+
+  exp_w4_r1_unsigned_truncate             <= c_exp_w4_r1_unsigned_truncate(U_w4);
+  exp_w4_r1_unsigned_round_half_up        <= c_exp_w4_r1_unsigned_round_half_up(U_w4);
+  exp_w4_r1_unsigned_round_half_up_clip   <= c_exp_w4_r1_unsigned_round_half_up_clip(U_w4);
+  exp_w4_r1_unsigned_round_half_even      <= c_exp_w4_r1_unsigned_round_half_even(U_w4);
+  exp_w4_r1_unsigned_round_half_even_clip <= c_exp_w4_r1_unsigned_round_half_even_clip(U_w4);
+
+  -- . w = 4, r = 2
+  exp_w4_r2_signed_truncate             <= c_exp_w4_r2_signed_truncate(S_w4);
+  exp_w4_r2_signed_round_half_away      <= c_exp_w4_r2_signed_round_half_away(S_w4);
+  exp_w4_r2_signed_round_half_away_clip <= c_exp_w4_r2_signed_round_half_away_clip(S_w4);
+  exp_w4_r2_signed_round_half_even      <= c_exp_w4_r2_signed_round_half_even(S_w4);
+  exp_w4_r2_signed_round_half_even_clip <= c_exp_w4_r2_signed_round_half_even_clip(S_w4);
+
+  exp_w4_r2_unsigned_truncate             <= c_exp_w4_r2_unsigned_truncate(U_w4);
+  exp_w4_r2_unsigned_round_half_up        <= c_exp_w4_r2_unsigned_round_half_up(U_w4);
+  exp_w4_r2_unsigned_round_half_up_clip   <= c_exp_w4_r2_unsigned_round_half_up_clip(U_w4);
+  exp_w4_r2_unsigned_round_half_even      <= c_exp_w4_r2_unsigned_round_half_even(U_w4);
+  exp_w4_r2_unsigned_round_half_even_clip <= c_exp_w4_r2_unsigned_round_half_even_clip(U_w4);
+
+  -- . w = 4, r = 3
+  exp_w4_r3_signed_truncate             <= c_exp_w4_r3_signed_truncate(S_w4);
+  exp_w4_r3_signed_round_half_away      <= c_exp_w4_r3_signed_round_half_away(S_w4);
+  exp_w4_r3_signed_round_half_away_clip <= c_exp_w4_r3_signed_round_half_away_clip(S_w4);
+  exp_w4_r3_signed_round_half_even      <= c_exp_w4_r3_signed_round_half_even(S_w4);
+  exp_w4_r3_signed_round_half_even_clip <= c_exp_w4_r3_signed_round_half_even_clip(S_w4);
+
+  exp_w4_r3_unsigned_truncate             <= c_exp_w4_r3_unsigned_truncate(U_w4);
+  exp_w4_r3_unsigned_round_half_up        <= c_exp_w4_r3_unsigned_round_half_up(U_w4);
+  exp_w4_r3_unsigned_round_half_up_clip   <= c_exp_w4_r3_unsigned_round_half_up_clip(U_w4);
+  exp_w4_r3_unsigned_round_half_even      <= c_exp_w4_r3_unsigned_round_half_even(U_w4);
+  exp_w4_r3_unsigned_round_half_even_clip <= c_exp_w4_r3_unsigned_round_half_even_clip(U_w4);
+
+  -- . w = 5
+  S_w5 <= (TO_UINT(in_dat) + 16) MOD 32;  -- 2**5 = 32
+  U_w5 <= TO_UINT(in_dat) MOD 32;
+
+  -- . w = 5, r = 2
+  exp_w5_r2_signed_truncate             <= c_exp_w5_r2_signed_truncate(S_w5);
+  exp_w5_r2_signed_round_half_away      <= c_exp_w5_r2_signed_round_half_away(S_w5);
+  exp_w5_r2_signed_round_half_away_clip <= c_exp_w5_r2_signed_round_half_away_clip(S_w5);
+  exp_w5_r2_signed_round_half_even      <= c_exp_w5_r2_signed_round_half_even(S_w5);
+  exp_w5_r2_signed_round_half_even_clip <= c_exp_w5_r2_signed_round_half_even_clip(S_w5);
+
+  exp_w5_r2_unsigned_truncate             <= c_exp_w5_r2_unsigned_truncate(U_w5);
+  exp_w5_r2_unsigned_round_half_up        <= c_exp_w5_r2_unsigned_round_half_up(U_w5);
+  exp_w5_r2_unsigned_round_half_up_clip   <= c_exp_w5_r2_unsigned_round_half_up_clip(U_w5);
+  exp_w5_r2_unsigned_round_half_even      <= c_exp_w5_r2_unsigned_round_half_even(U_w5);
+  exp_w5_r2_unsigned_round_half_even_clip <= c_exp_w5_r2_unsigned_round_half_even_clip(U_w5);
+
+  -- . w = 5, r = 3
+  exp_w5_r3_signed_truncate             <= c_exp_w5_r3_signed_truncate(S_w5);
+  exp_w5_r3_signed_round_half_away      <= c_exp_w5_r3_signed_round_half_away(S_w5);
+  exp_w5_r3_signed_round_half_away_clip <= c_exp_w5_r3_signed_round_half_away_clip(S_w5);
+  exp_w5_r3_signed_round_half_even      <= c_exp_w5_r3_signed_round_half_even(S_w5);
+  exp_w5_r3_signed_round_half_even_clip <= c_exp_w5_r3_signed_round_half_even_clip(S_w5);
+
+  exp_w5_r3_unsigned_truncate             <= c_exp_w5_r3_unsigned_truncate(U_w5);
+  exp_w5_r3_unsigned_round_half_up        <= c_exp_w5_r3_unsigned_round_half_up(U_w5);
+  exp_w5_r3_unsigned_round_half_up_clip   <= c_exp_w5_r3_unsigned_round_half_up_clip(U_w5);
+  exp_w5_r3_unsigned_round_half_even      <= c_exp_w5_r3_unsigned_round_half_even(U_w5);
+  exp_w5_r3_unsigned_round_half_even_clip <= c_exp_w5_r3_unsigned_round_half_even_clip(U_w5);
 
   -- Verification
   p_verify : PROCESS
@@ -437,6 +569,34 @@ BEGIN
           ASSERT UNSIGNED(fs_unsigned_round_half_even     ) = exp_w4_r1_unsigned_round_half_even      REPORT "Wrong exp_w4_r1_unsigned_round_half_even" SEVERITY ERROR;
           ASSERT UNSIGNED(fs_unsigned_round_half_even_clip) = exp_w4_r1_unsigned_round_half_even_clip REPORT "Wrong exp_w4_r1_unsigned_round_half_even_clip" SEVERITY ERROR;
         END IF;
+        IF g_in_dat_w = 4 AND c_round_w = 2 THEN
+          -- . signed
+          ASSERT SIGNED(fs_signed_truncate            ) = exp_w4_r2_signed_truncate             REPORT "Wrong exp_w4_r2_signed_truncate" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away     ) = exp_w4_r2_signed_round_half_away      REPORT "Wrong exp_w4_r2_signed_round_half_away" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away_clip) = exp_w4_r2_signed_round_half_away_clip REPORT "Wrong exp_w4_r2_signed_round_half_away_clip" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even     ) = exp_w4_r2_signed_round_half_even      REPORT "Wrong exp_w4_r2_signed_round_half_even" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even_clip) = exp_w4_r2_signed_round_half_even_clip REPORT "Wrong exp_w4_r2_signed_round_half_even_clip" SEVERITY ERROR;
+          -- . unsigned
+          ASSERT UNSIGNED(fs_unsigned_truncate            ) = exp_w4_r2_unsigned_truncate             REPORT "Wrong exp_w4_r2_unsigned_truncate" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up       ) = exp_w4_r2_unsigned_round_half_up        REPORT "Wrong exp_w4_r2_unsigned_round_half_up" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up_clip  ) = exp_w4_r2_unsigned_round_half_up_clip   REPORT "Wrong exp_w4_r2_unsigned_round_half_up_clip" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even     ) = exp_w4_r2_unsigned_round_half_even      REPORT "Wrong exp_w4_r2_unsigned_round_half_even" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even_clip) = exp_w4_r2_unsigned_round_half_even_clip REPORT "Wrong exp_w4_r2_unsigned_round_half_even_clip" SEVERITY ERROR;
+        END IF;
+        IF g_in_dat_w = 4 AND c_round_w = 3 THEN
+          -- . signed
+          ASSERT SIGNED(fs_signed_truncate            ) = exp_w4_r3_signed_truncate             REPORT "Wrong exp_w4_r3_signed_truncate" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away     ) = exp_w4_r3_signed_round_half_away      REPORT "Wrong exp_w4_r3_signed_round_half_away" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away_clip) = exp_w4_r3_signed_round_half_away_clip REPORT "Wrong exp_w4_r3_signed_round_half_away_clip" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even     ) = exp_w4_r3_signed_round_half_even      REPORT "Wrong exp_w4_r3_signed_round_half_even" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even_clip) = exp_w4_r3_signed_round_half_even_clip REPORT "Wrong exp_w4_r3_signed_round_half_even_clip" SEVERITY ERROR;
+          -- . unsigned
+          ASSERT UNSIGNED(fs_unsigned_truncate            ) = exp_w4_r3_unsigned_truncate             REPORT "Wrong exp_w4_r3_unsigned_truncate" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up       ) = exp_w4_r3_unsigned_round_half_up        REPORT "Wrong exp_w4_r3_unsigned_round_half_up" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up_clip  ) = exp_w4_r3_unsigned_round_half_up_clip   REPORT "Wrong exp_w4_r3_unsigned_round_half_up_clip" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even     ) = exp_w4_r3_unsigned_round_half_even      REPORT "Wrong exp_w4_r3_unsigned_round_half_even" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even_clip) = exp_w4_r3_unsigned_round_half_even_clip REPORT "Wrong exp_w4_r3_unsigned_round_half_even_clip" SEVERITY ERROR;
+        END IF;
         IF g_in_dat_w = 5 AND c_round_w = 2 THEN
           -- . signed
           ASSERT SIGNED(fs_signed_truncate            ) = exp_w5_r2_signed_truncate             REPORT "Wrong exp_w5_r2_signed_truncate" SEVERITY ERROR;
@@ -451,6 +611,20 @@ BEGIN
           ASSERT UNSIGNED(fs_unsigned_round_half_even     ) = exp_w5_r2_unsigned_round_half_even      REPORT "Wrong exp_w5_r2_unsigned_round_half_even" SEVERITY ERROR;
           ASSERT UNSIGNED(fs_unsigned_round_half_even_clip) = exp_w5_r2_unsigned_round_half_even_clip REPORT "Wrong exp_w5_r2_unsigned_round_half_even_clip" SEVERITY ERROR;
         END IF;
+        IF g_in_dat_w = 5 AND c_round_w = 3 THEN
+          -- . signed
+          ASSERT SIGNED(fs_signed_truncate            ) = exp_w5_r3_signed_truncate             REPORT "Wrong exp_w5_r3_signed_truncate" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away     ) = exp_w5_r3_signed_round_half_away      REPORT "Wrong exp_w5_r3_signed_round_half_away" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_away_clip) = exp_w5_r3_signed_round_half_away_clip REPORT "Wrong exp_w5_r3_signed_round_half_away_clip" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even     ) = exp_w5_r3_signed_round_half_even      REPORT "Wrong exp_w5_r3_signed_round_half_even" SEVERITY ERROR;
+          ASSERT SIGNED(fs_signed_round_half_even_clip) = exp_w5_r3_signed_round_half_even_clip REPORT "Wrong exp_w5_r3_signed_round_half_even_clip" SEVERITY ERROR;
+          -- . unsigned
+          ASSERT UNSIGNED(fs_unsigned_truncate            ) = exp_w5_r3_unsigned_truncate             REPORT "Wrong exp_w5_r3_unsigned_truncate" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up       ) = exp_w5_r3_unsigned_round_half_up        REPORT "Wrong exp_w5_r3_unsigned_round_half_up" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_up_clip  ) = exp_w5_r3_unsigned_round_half_up_clip   REPORT "Wrong exp_w5_r3_unsigned_round_half_up_clip" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even     ) = exp_w5_r3_unsigned_round_half_even      REPORT "Wrong exp_w5_r3_unsigned_round_half_even" SEVERITY ERROR;
+          ASSERT UNSIGNED(fs_unsigned_round_half_even_clip) = exp_w5_r3_unsigned_round_half_even_clip REPORT "Wrong exp_w5_r3_unsigned_round_half_even_clip" SEVERITY ERROR;
+        END IF;
       END IF;
     END IF;
   END PROCESS;
diff --git a/libraries/base/common/tb/vhdl/tb_tb_round.vhd b/libraries/base/common/tb/vhdl/tb_tb_round.vhd
index d3645dc0f2..40efae340b 100644
--- a/libraries/base/common/tb/vhdl/tb_tb_round.vhd
+++ b/libraries/base/common/tb/vhdl/tb_tb_round.vhd
@@ -35,5 +35,8 @@ BEGIN
   u_extend      : ENTITY work.tb_round GENERIC MAP (5, 6);
   u_wires       : ENTITY work.tb_round GENERIC MAP (5, 5);
   u_round_w4_r1 : ENTITY work.tb_round GENERIC MAP (4, 3);  -- -r = 4 - 3 = 1
+  u_round_w4_r2 : ENTITY work.tb_round GENERIC MAP (4, 2);  -- -r = 4 - 2 = 2
+  u_round_w4_r3 : ENTITY work.tb_round GENERIC MAP (4, 1);  -- -r = 4 - 1 = 3
   u_round_w5_r2 : ENTITY work.tb_round GENERIC MAP (5, 3);  -- -r = 5 - 3 = 2
+  u_round_w5_r3 : ENTITY work.tb_round GENERIC MAP (5, 2);  -- -r = 5 - 2 = 3
 END tb;
-- 
GitLab