From 9419afdb74773cf966e5f14eac89b130ada723cb Mon Sep 17 00:00:00 2001
From: donker <donker@astron.nl>
Date: Tue, 3 Nov 2020 10:16:36 +0100
Subject: [PATCH] L2SDP-180, now with checks

---
 .../common/src/vhdl/common_variable_delay.vhd |  57 +++++-----
 .../tb/vhdl/tb_common_variable_delay.vhd      | 101 ++++++++++--------
 2 files changed, 81 insertions(+), 77 deletions(-)

diff --git a/libraries/base/common/src/vhdl/common_variable_delay.vhd b/libraries/base/common/src/vhdl/common_variable_delay.vhd
index c5be42f723..33876f3e20 100644
--- a/libraries/base/common/src/vhdl/common_variable_delay.vhd
+++ b/libraries/base/common/src/vhdl/common_variable_delay.vhd
@@ -33,13 +33,11 @@ USE work.common_pkg.ALL;
 
 
 ENTITY common_variable_delay IS
-  --GENERIC (
-  --);
   PORT (
     rst        : IN  STD_LOGIC;
     clk        : IN  STD_LOGIC;
 
-    delay      : IN NATURAL := 0;
+    delay      : IN  NATURAL := 0;
     enable     : IN  STD_LOGIC := '0';
     in_val     : IN  STD_LOGIC;
     out_val    : OUT STD_LOGIC
@@ -53,44 +51,39 @@ ARCHITECTURE rtl OF common_variable_delay IS
   SIGNAL nxt_i_out_val   : STD_LOGIC;
   SIGNAL delay_cnt       : NATURAL;
   SIGNAL nxt_delay_cnt   : NATURAL;
-  SIGNAL in_val_hold     : STD_LOGIC;
-  SIGNAL nxt_in_val_hold : STD_LOGIC;
+  SIGNAL in_val_lock     : STD_LOGIC;
+  SIGNAL nxt_in_val_lock : STD_LOGIC;
 
 BEGIN
-  out_val <= i_out_val AND enable;
+  out_val <= i_out_val; -- AND enable;
 
-  p_delay: PROCESS(delay, in_val, i_out_val, delay_cnt, in_val_hold)
+  p_delay: PROCESS(enable, delay, in_val, i_out_val, delay_cnt, in_val_lock)
   BEGIN
-    nxt_i_out_val <= i_out_val;
-    nxt_delay_cnt <= delay_cnt;
-    nxt_in_val_hold <= in_val_hold;
-
-    IF delay = 0 THEN
-      nxt_i_out_val <= in_val;
-    ELSE
-      IF RISING_EDGE(in_val) AND in_val_hold = '0' THEN
-        nxt_in_val_hold <= '1';
-        nxt_delay_cnt   <= 1;
-      END IF;
-
-      IF in_val_hold = '1' AND i_out_val = '1' THEN
-        nxt_in_val_hold <= '0';
+    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;
       END IF;
 
-      IF in_val_hold = '1' THEN
-        nxt_delay_cnt <= delay_cnt + 1;
+      IF nxt_in_val_lock = '0' THEN
+        nxt_delay_cnt <= 0;
       END IF;
 
-      IF i_out_val = '1' THEN
-        nxt_i_out_val <= '0';
-      END IF;
-
-      IF delay_cnt = delay THEN
+      IF nxt_delay_cnt = (delay+1) THEN
         nxt_i_out_val   <= '1';
-        nxt_in_val_hold <= '0';
-        --nxt_delay_cnt   <= 0;
+        nxt_in_val_lock <= '0';
       END IF;
+    ELSE
+      nxt_delay_cnt <= 0;
+      nxt_in_val_lock <= '0';
     END IF;
+
   END PROCESS; 
 
   p_clk : PROCESS(rst, clk)
@@ -98,11 +91,11 @@ BEGIN
     IF rst = '1' THEN
       i_out_val   <= '0';
       delay_cnt   <= 0;
-      in_val_hold <= '0';
+      in_val_lock <= '0';
     ELSIF rising_edge(clk) THEN
       i_out_val   <= nxt_i_out_val;
       delay_cnt   <= nxt_delay_cnt;
-      in_val_hold <= nxt_in_val_hold;
+      in_val_lock <= nxt_in_val_lock;
     END IF;
   END PROCESS;
 
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 d25232b835..41db5ceadb 100644
--- a/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
+++ b/libraries/base/common/tb/vhdl/tb_common_variable_delay.vhd
@@ -23,6 +23,7 @@ LIBRARY IEEE;
 USE IEEE.std_logic_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE work.common_pkg.ALL;
+USE work.common_str_pkg.ALL;
 USE work.tb_common_pkg.ALL;
 
 ENTITY tb_common_variable_delay IS
@@ -30,66 +31,79 @@ END tb_common_variable_delay;
 
 ARCHITECTURE tb OF tb_common_variable_delay IS
 
-  CONSTANT clk_period   : TIME := 10 ns;
-  CONSTANT max_delay : NATURAL := 5;
+  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_delay_arr        : t_natural_arr(0 TO 3) := (0, 1, 3, 12);
   
-  SIGNAL tb_end   : STD_LOGIC := '0';
-
-  SIGNAL rst      : STD_LOGIC;
-  SIGNAL clk      : STD_LOGIC := '0';
+  SIGNAL tb_end : STD_LOGIC := '0';
+  SIGNAL rst    : STD_LOGIC;
+  SIGNAL clk    : STD_LOGIC := '0';
   
-  SIGNAL delay   : NATURAL := 0;
-  SIGNAL enable  : STD_LOGIC := '0';
-  SIGNAL trigger : STD_LOGIC;
-  SIGNAL trigger_dly : STD_LOGIC;
+  SIGNAL delay       : NATURAL   := 0;
+  SIGNAL enable      : STD_LOGIC := '0';
+  SIGNAL trigger     : STD_LOGIC := '0';
+  SIGNAL trigger_dly : STD_LOGIC := '0';
+  SIGNAL clk_cnt     : NATURAL   := 0;
 BEGIN
 
-  clk <= (NOT clk) OR tb_end AFTER clk_period/2;
-  rst <= '1', '0' AFTER clk_period*3;
+  clk <= (NOT clk) OR tb_end AFTER c_clk_period/2;
+  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;
+
   
-  -- run 1 us
   p_in_stimuli : PROCESS
   BEGIN
-    delay       <= 0;
-    enable      <= '0';
-    trigger     <= '0';
+    delay  <= 0;
+    enable <= '0';
     
     WAIT UNTIL rst = '0';
     WAIT UNTIL rising_edge(clk);
     
-    -- Start counting
-    enable <= '0';
+    -- If enable = 0, no trigger_dly is expected, see wave-window
     proc_common_wait_some_cycles(clk, 50);
-    FOR i IN 0 TO 10 LOOP
-      trigger <= '1';
-      proc_common_wait_some_cycles(clk, 4);
-      trigger <= '0';
-      proc_common_wait_some_cycles(clk, 4);
-    END LOOP;
 
+    
     enable <= '1';
-    FOR i IN 0 TO 10 LOOP
-      trigger <= '1';
-      proc_common_wait_some_cycles(clk, 4);
-      trigger <= '0';
-      proc_common_wait_some_cycles(clk, 4);
+    -- enable trigger output and count clk's between trigger lo-hi and trigger_dly lo-hi
+    -- check if counted clk's = c_trigger_latency + delay 
+    FOR i IN 0 TO c_delay_arr'LENGTH-1 LOOP
+      delay <= c_delay_arr(i);
+      clk_cnt <= 0;
+      proc_common_wait_until_lo_hi(clk, trigger);
+      WHILE trigger_dly = '0' LOOP
+        clk_cnt <= clk_cnt + 1;
+        proc_common_wait_some_cycles(clk, 1);
+      END LOOP;
+      ASSERT clk_cnt = (c_trigger_latency + delay) REPORT "delay failure, got " & int_to_str(clk_cnt) & ", expect " & int_to_str(c_trigger_latency+delay) SEVERITY ERROR; 
+      proc_common_wait_some_cycles(clk, 10);
     END LOOP;
 
-    delay <= 1;
-    FOR i IN 0 TO 10 LOOP
-      trigger <= '1';
-      proc_common_wait_some_cycles(clk, 4);
-      trigger <= '0';
-      proc_common_wait_some_cycles(clk, 4);
+    -- If delay > trigger interval, trigger lo-hi shold not start new delay, see also wave window 
+    delay   <= c_trigger_interval+2;
+    clk_cnt <= 0;
+    proc_common_wait_until_lo_hi(clk, trigger);
+    WHILE trigger_dly = '0' LOOP
+      clk_cnt <= clk_cnt + 1;
+      proc_common_wait_some_cycles(clk, 1);
     END LOOP;
+    ASSERT clk_cnt = (c_trigger_latency + delay) REPORT "delay failure, got " & int_to_str(clk_cnt) & ", expect " & int_to_str(c_trigger_latency+delay) SEVERITY ERROR; 
+    proc_common_wait_some_cycles(clk, 10);
 
-    delay <= 12;
-    FOR i IN 0 TO 10 LOOP
-      trigger <= '1';
-      proc_common_wait_some_cycles(clk, 4);
-      trigger <= '0';
-      proc_common_wait_some_cycles(clk, 4);
-    END LOOP;
+    enable <= '0';
+    proc_common_wait_some_cycles(clk, 10);
 
 
     tb_end <= '1';    
@@ -98,9 +112,6 @@ BEGIN
 
   -- device under test
   u_dut : ENTITY work.common_variable_delay
-  GENERIC MAP (
-    g_max_delay => max_delay
-  )
   PORT MAP (
     rst     => rst,
     clk     => clk,
-- 
GitLab