aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd')
-rw-r--r--fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd119
1 files changed, 119 insertions, 0 deletions
diff --git a/fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd b/fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd
new file mode 100644
index 000000000..eb5cbcf08
--- /dev/null
+++ b/fpga/usrp3/top/x400/rf/sim/tb_capture_sysref.vhd
@@ -0,0 +1,119 @@
+--
+-- Copyright 2021 Ettus Research, a National Instruments Brand
+--
+-- SPDX-License-Identifier: LGPL-3.0-or-later
+--
+-- Module: tb_capture_sysref
+--
+-- Description:
+--
+-- Self-checking testbench for tb_capture_sysref.
+--
+
+library IEEE;
+ use IEEE.std_logic_1164.all;
+ use IEEE.numeric_std.all;
+
+entity tb_capture_sysref is
+end tb_capture_sysref;
+
+
+architecture RTL of tb_capture_sysref is
+
+ component capture_sysref
+ port (
+ pll_ref_clk : in std_logic;
+ rfdc_clk : in std_logic;
+ sysref_in : in std_logic;
+ enable_rclk : in std_logic;
+ sysref_out_pclk : out std_logic;
+ sysref_out_rclk : out std_logic);
+ end component;
+
+ signal enable_rclk : std_logic := '0';
+ signal sysref_out_pclk : std_logic := '0';
+ signal sysref_out_rclk : std_logic := '0';
+ signal sysref_in : std_logic := '0';
+
+ signal SysrefDly, SysrefDlyDly, rSysref : std_logic := '0';
+
+ signal StopSim : boolean;
+ constant kPerPRC : time := 30 ns;
+ constant kPerRF : time := 10 ns;
+
+ signal PllRefClk : std_logic := '1';
+ signal RfdcClk : std_logic := '1';
+
+ procedure ClkWait(X : positive := 1) is
+ begin
+ for i in 1 to X loop
+ wait until rising_edge(PllRefClk);
+ end loop;
+ end procedure ClkWait;
+
+begin
+
+ PllRefClk <= not PllRefClk after kPerPRC/2 when not StopSim else '0';
+ RfdcClk <= not RfdcClk after kPerRF/2 when not StopSim else '0';
+
+ dut: capture_sysref
+ port map (
+ pll_ref_clk => PllRefClk,
+ rfdc_clk => RfdcClk,
+ sysref_in => sysref_in,
+ enable_rclk => enable_rclk,
+ sysref_out_pclk => sysref_out_pclk,
+ sysref_out_rclk => sysref_out_rclk
+ );
+
+ main: process
+ begin
+ enable_rclk <= '1';
+ ClkWait(100);
+ wait until falling_edge(sysref_out_rclk);
+ ClkWait;
+ wait until falling_edge(RfdcClk);
+ enable_rclk <= '0';
+ ClkWait(100);
+ wait until falling_edge(RfdcClk);
+ enable_rclk <= '1';
+ ClkWait(100);
+
+ StopSim <= true;
+ wait;
+ end process;
+
+ sysref: process(PllRefClk)
+ variable count : integer := 1;
+ begin
+ if rising_edge(PllRefClk) then
+ count := count +1;
+ if count = 10 then
+ sysref_in <= not sysref_in;
+ count := 1;
+ end if;
+ end if;
+ end process;
+
+ checker_pll_ref_clk: process(PllRefClk)
+ begin
+ if falling_edge(PllRefClk) then
+ SysrefDly <= sysref_in;
+ SysrefDlyDly <= SysrefDly;
+ assert SysrefDlyDly = sysref_out_pclk
+ report "SYSREF incorrectly captured in the PllRefClk domain"
+ severity error;
+ end if;
+ end process;
+
+ checker_rfdc_clk: process(RfdcClk)
+ begin
+ if falling_edge(RfdcClk) then
+ rSysref <= sysref_out_pclk;
+ assert (rSysref = sysref_out_rclk) or (enable_rclk = '0')
+ report "SYSREF incorrectly captured in the RfdcClk domain."
+ severity error;
+ end if;
+ end process;
+
+end RTL;