OpenCores
URL https://opencores.org/ocsvn/pltbutils/pltbutils/trunk

Subversion Repositories pltbutils

[/] [pltbutils/] [trunk/] [src/] [vhdl/] [pltbutils_comp.vhd] - Rev 107

Compare with Previous | Blame | View Log

----------------------------------------------------------------------
----                                                              ----
---- PlTbUtils Components                                         ----
----                                                              ----
---- This file is part of the PlTbUtils project                   ----
---- http://opencores.org/project,pltbutils                       ----
----                                                              ----
---- Description:                                                 ----
---- PlTbUtils is a collection of functions, procedures and       ----
---- components for easily creating stimuli and checking response ----
---- in automatic self-checking testbenches.                      ----
----                                                              ----
---- pltbutils_comp.vhd (this file) defines testbench components. ----
----                                                              ----
----                                                              ----
---- To Do:                                                       ----
---- -                                                            ----
----                                                              ----
---- Author(s):                                                   ----
---- - Per Larsson, pela.opencores@gmail.com                      ----
----                                                              ----
----------------------------------------------------------------------
----                                                              ----
---- Copyright (C) 2013-2020 Authors and OPENCORES.ORG            ----
----                                                              ----
---- This source file may be used and distributed without         ----
---- restriction provided that this copyright statement is not    ----
---- removed from the file and that any derivative work contains  ----
---- the original copyright notice and the associated disclaimer. ----
----                                                              ----
---- This source file is free software; you can redistribute it   ----
---- and/or modify it under the terms of the GNU Lesser General   ----
---- Public License as published by the Free Software Foundation; ----
---- either version 2.1 of the License, or (at your option) any   ----
---- later version.                                               ----
----                                                              ----
---- This source is distributed in the hope that it will be       ----
---- useful, but WITHOUT ANY WARRANTY; without even the implied   ----
---- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ----
---- PURPOSE. See the GNU Lesser General Public License for more  ----
---- details.                                                     ----
----                                                              ----
---- You should have received a copy of the GNU Lesser General    ----
---- Public License along with this source; if not, download it   ----
---- from http://www.opencores.org/lgpl.shtml                     ----
----                                                              ----
----------------------------------------------------------------------
 
----------------------------------------------------------------------
-- pltbutils_clkgen
-- Creates a clock for use in a testbech.
-- A non-inverted as well as an inverted output is available, 
-- use one or both depending on if you need a single-ended or
-- differential clock.
-- The clock stops when input port stop_sim goes '1'.
-- This makes the simulator stop (unless there are other infinite 
-- processes running in the simulation).
----------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
 
entity pltbutils_clkgen is
  generic (
    G_PERIOD        : time := 10 ns;
    G_INITVALUE     : std_logic := '0'
  );
  port (
    clk_o           : out std_logic;
    clk_n_o         : out std_logic;
    stop_sim_i      : in  std_logic
  );
end entity pltbutils_clkgen;
 
architecture bhv of pltbutils_clkgen is
  constant C_HALF_PERIOD    : time := G_PERIOD / 2;
  signal   clk              : std_logic := G_INITVALUE;
begin
 
  clk       <= not clk and not stop_sim_i after C_HALF_PERIOD;
  clk_o     <= clk;
  clk_n_o   <= not clk;
 
end architecture bhv;
 
 
----------------------------------------------------------------------
-- pltbutils_time_measure
-- Measures high-time, low-time and period of a signal, usually a
-- clock.
-- Setting G_VERBOSITY to at least 20 reports measures times. 
-- Set G_RPT_LABEL to a prefix used in reports, typically the name
-- of the signal being measured. 
----------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
 
entity pltbutils_time_measure is
  generic (
    G_VERBOSITY     : integer := 0;
    G_RPT_LABEL     : string  := "pltbutils_time_measure" 
  );
  port (
    t_hi_o          : out time;             -- High time
    t_lo_o          : out time;             -- Low time
    t_per_o         : out time;             -- Period time
    s_i             : in  std_logic         -- Signal to measure
  );
end entity pltbutils_time_measure;
 
architecture bhv of pltbutils_time_measure is
  signal   t_hi         : time := 0 ns;
  signal   t_lo         : time := 0 ns;
  signal   t_per        : time := 0 ns;
begin
 
  measure_p : process (s_i)
    variable last_rising_edge  : time := -1 ns;
    variable last_falling_edge : time := -1 ns;
  begin
    if rising_edge(s_i) then
      if last_falling_edge >= 0 ns then
        t_lo <= now - last_falling_edge;
      end if;
      if last_rising_edge >= 0 ns then
        t_per <= now - last_rising_edge;
      end if;
      last_rising_edge := now;
    end if;
 
    if falling_edge(s_i) then
      if last_rising_edge >= 0 ns then
        t_hi <= now - last_rising_edge;
      end if;
      last_falling_edge := now;
    end if;
  end process measure_p;
 
  assert not (G_VERBOSITY >  20 and t_lo'event)
    report G_RPT_LABEL & ": t_lo=" & time'image(t_lo)
    severity note;
 
  assert not (G_VERBOSITY >  20 and t_hi'event)
    report G_RPT_LABEL & ": t_hi=" & time'image(t_hi)
    severity note;
 
  assert not (G_VERBOSITY >  20 and t_per'event)
    report G_RPT_LABEL & ": t_hi=" & time'image(t_per)
    severity note;
 
  t_hi_o        <= t_hi;
  t_lo_o        <= t_lo;
  t_per_o       <= t_per;
 
end architecture bhv;
 
 
----------------------------------------------------------------------
-- pltbutils_diff_check
-- Checks that the negative half of a diff pair is the
-- always the complement of the positive half.
-- Setting G_VERBOSITY to at least 100 reports number of diff errors.
-- Set G_RPT_LABEL to a prefix used in reports, typically the name
-- of the signal being measured. 
----------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
 
entity pltbutils_diff_check is
  generic (
    G_VERBOSITY     : integer := 0;
    G_RPT_LABEL     : string  := "pltbutils_diff_check" 
  );
  port (
    diff_error_o    : out std_logic;        -- High when diff error detected
    diff_errors_o   : out integer;          -- Number of diff errors detected
    s_i             : in  std_logic;        -- Pos half of diff pair to check
    s_n_i           : in  std_logic := '0'; -- Neg half of diff pair to check
    rst_errors_i    : in  std_logic := '0'  -- High resets diff error counter
  );
end entity pltbutils_diff_check;
 
architecture bhv of pltbutils_diff_check is
  constant C_INTEGER_MAX : integer := (2**30) + ((2**30)-1); -- Equals (2**31)-1 without overflowing;
  signal   diff_error   : std_logic := '0';
  signal   diff_errors  : integer := 0;
begin
 
  diff_check_p : process (s_i, s_n_i, rst_errors_i)
  -- TODO: allow a small (configurable) timing tolerance between edges of s_i and s_n_i
  begin
    if s_i /= not s_n_i then
      diff_error  <= '1';
      if diff_errors < C_INTEGER_MAX then
        diff_errors <= diff_errors + 1;
      end if;
    else 
      diff_error  <= '0';
    end if;
    if rst_errors_i = '1' then
      diff_errors <= 0;
    end if;
  end process diff_check_p;
 
  assert not (G_VERBOSITY > 100 and diff_errors'event)
    report G_RPT_LABEL & ": diff_errors=" & integer'image(diff_errors)
    severity note;
 
  diff_error_o  <= diff_error;
  diff_errors_o <= diff_errors;
 
end architecture bhv;
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.