From c72c374f8df61b8f31b20ccf26a0ea0658db8604 Mon Sep 17 00:00:00 2001
From: donker <donker@astron.nl>
Date: Thu, 5 Nov 2020 07:52:00 +0100
Subject: [PATCH] L2SDP-180, processed review comments.

---
 libraries/base/common/hdllib.cfg              |  1 +
 .../common/src/vhdl/common_variable_delay.vhd | 51 ++++++++++---------
 .../src/vhdl/mms_common_variable_delay.vhd    |  1 -
 .../tb/vhdl/tb_common_variable_delay.vhd      | 14 +----
 .../tb/vhdl/tb_mms_common_variable_delay.vhd  | 12 +----
 5 files changed, 31 insertions(+), 48 deletions(-)

diff --git a/libraries/base/common/hdllib.cfg b/libraries/base/common/hdllib.cfg
index 37b78e93b8..b8178c2f19 100644
--- a/libraries/base/common/hdllib.cfg
+++ b/libraries/base/common/hdllib.cfg
@@ -217,6 +217,7 @@ regression_test_vhdl =
     tb/vhdl/tb_common_shiftram.vhd
     tb/vhdl/tb_common_shiftreg.vhd
     tb/vhdl/tb_common_transpose_symbol.vhd
+    tb/vhdl/tb_common_variable_delay.vhd
     tb/vhdl/tb_resize.vhd
     #tb/vhdl/tb_round.vhd           -- has no self verification yet
     tb/vhdl/tb_requantize.vhd
diff --git a/libraries/base/common/src/vhdl/common_variable_delay.vhd b/libraries/base/common/src/vhdl/common_variable_delay.vhd
index 33876f3e20..d7388c21df 100644
--- a/libraries/base/common/src/vhdl/common_variable_delay.vhd
+++ b/libraries/base/common/src/vhdl/common_variable_delay.vhd
@@ -23,7 +23,7 @@
 -- . Delay input pulse by number of given delay cycles
 -- Description:
 -- . delay input pulse by nof_cycles_delay
--- . output pulse is derived form low-high transition of input pulse.
+-- . output pulse is derived from low-high transition of input pulse.
 -- . during delay other input pulses are ignored
 -- --------------------------------------------------------------------------
 
@@ -33,11 +33,14 @@ USE work.common_pkg.ALL;
 
 
 ENTITY common_variable_delay IS
+  GENERIC (
+    g_max_delay : NATURAL := 200 * 10**6
+  );
   PORT (
     rst        : IN  STD_LOGIC;
     clk        : IN  STD_LOGIC;
 
-    delay      : IN  NATURAL := 0;
+    delay      : IN  NATURAL RANGE 0 TO g_max_delay := 0;
     enable     : IN  STD_LOGIC := '0';
     in_val     : IN  STD_LOGIC;
     out_val    : OUT STD_LOGIC
@@ -48,40 +51,40 @@ END common_variable_delay;
 ARCHITECTURE rtl OF common_variable_delay IS
 
   SIGNAL i_out_val       : STD_LOGIC;
-  SIGNAL nxt_i_out_val   : STD_LOGIC;
+  SIGNAL nxt_out_val     : STD_LOGIC;
   SIGNAL delay_cnt       : NATURAL;
   SIGNAL nxt_delay_cnt   : NATURAL;
-  SIGNAL in_val_lock     : STD_LOGIC;
-  SIGNAL nxt_in_val_lock : STD_LOGIC;
+  SIGNAL in_val_lock     : STD_LOGIC := '0';
+  SIGNAL prev_in_val     : STD_LOGIC := '0';
 
 BEGIN
-  out_val <= i_out_val; -- AND enable;
-
-  p_delay: PROCESS(enable, delay, in_val, i_out_val, delay_cnt, in_val_lock)
+  out_val <= i_out_val;
+  
+  p_delay: PROCESS(enable, in_val, prev_in_val, in_val_lock, nxt_delay_cnt, delay_cnt, delay, i_out_val)
   BEGIN
-    nxt_i_out_val   <= '0';
-    nxt_delay_cnt   <= delay_cnt + 1;
-    nxt_in_val_lock <= in_val_lock;
 
     IF enable = '1' THEN
-      IF rising_edge(in_val) THEN
-        nxt_in_val_lock <= '1';
-        IF delay = 0 THEN
-          nxt_delay_cnt <= 0;  
-        END IF;
+      IF in_val = '1' AND prev_in_val = '0' THEN  -- detect rising_edge of in_val
+        in_val_lock <= '1';
       END IF;
 
-      IF nxt_in_val_lock = '0' THEN
+      IF in_val_lock = '1' THEN
+        IF delay_cnt = delay THEN
+          nxt_out_val <= '1';
+        END IF;  
+        nxt_delay_cnt <= delay_cnt + 1;
+      ELSE
         nxt_delay_cnt <= 0;
       END IF;
 
-      IF nxt_delay_cnt = (delay+1) THEN
-        nxt_i_out_val   <= '1';
-        nxt_in_val_lock <= '0';
+      IF i_out_val = '1' THEN 
+        nxt_out_val <= '0';
+        in_val_lock <= '0';
       END IF;
     ELSE
       nxt_delay_cnt <= 0;
-      nxt_in_val_lock <= '0';
+      nxt_out_val   <= '0';
+      in_val_lock   <= '0';
     END IF;
 
   END PROCESS; 
@@ -91,11 +94,11 @@ BEGIN
     IF rst = '1' THEN
       i_out_val   <= '0';
       delay_cnt   <= 0;
-      in_val_lock <= '0';
+      prev_in_val <= '0';
     ELSIF rising_edge(clk) THEN
-      i_out_val   <= nxt_i_out_val;
+      i_out_val   <= nxt_out_val;
       delay_cnt   <= nxt_delay_cnt;
-      in_val_lock <= nxt_in_val_lock;
+      prev_in_val <= in_val;
     END IF;
   END PROCESS;
 
diff --git a/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd b/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd
index 3963ea5803..ed05567afe 100644
--- a/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd
+++ b/libraries/base/common/src/vhdl/mms_common_variable_delay.vhd
@@ -57,7 +57,6 @@ ARCHITECTURE rtl OF mms_common_variable_delay IS
 
   SIGNAL enable : STD_LOGIC := '0';
 
-
 BEGIN
   enable <= sl(enable_reg);
   
diff --git a/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd b/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
index d78e7ad23f..41c1d53574 100644
--- a/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
+++ b/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
@@ -40,7 +40,7 @@ ARCHITECTURE tb OF tb_common_variable_delay IS
 
   CONSTANT c_clk_period       : TIME    := 10 ns;
   CONSTANT c_trigger_interval : NATURAL := 40;  -- in clk's
-  CONSTANT c_trigger_latency  : NATURAL := 3;  -- in clk's
+  CONSTANT c_trigger_latency  : NATURAL := 1;  -- in clk's
   CONSTANT c_delay_arr        : t_natural_arr(0 TO 3) := (0, 1, 3, 12);
   
   SIGNAL tb_end : STD_LOGIC := '0';
@@ -58,17 +58,7 @@ BEGIN
   rst <= '1', '0' AFTER c_clk_period*4;
 
   -- generate trigger signal
-  p_trigger : PROCESS
-  BEGIN
-    WAIT UNTIL rst = '0';
-    proc_common_wait_some_cycles(clk, 10);
-    WAIT UNTIL rising_edge(clk);
-    WHILE tb_end = '0' LOOP
-      trigger <= NOT trigger;
-      proc_common_wait_some_cycles(clk, c_trigger_interval/2);
-    END LOOP;
-    WAIT;
-  END PROCESS;
+  proc_common_gen_pulse(c_trigger_interval/2, c_trigger_interval, '1', rst, clk, trigger);
 
   
   p_in_stimuli : PROCESS
diff --git a/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd b/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd
index 76cd50dcab..198edb5007 100644
--- a/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd
+++ b/libraries/base/common/tb/vhdl/tb_mms_common_variable_delay.vhd
@@ -86,17 +86,7 @@ BEGIN
   END PROCESS;
 
   -- generate trigger signal
-  p_trigger : PROCESS
-  BEGIN
-    WAIT UNTIL rst = '0';
-    proc_common_wait_some_cycles(clk, 10);
-    WAIT UNTIL rising_edge(clk);
-    WHILE tb_end = '0' LOOP
-      trigger <= NOT trigger;
-      proc_common_wait_some_cycles(clk, c_trigger_interval/2);
-    END LOOP;
-    WAIT;
-  END PROCESS;
+  proc_common_gen_pulse(c_trigger_interval/2, c_trigger_interval, '1', rst, clk, trigger);
 
   -- device under test
   u_dut : ENTITY work.mms_common_variable_delay
-- 
GitLab