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

Subversion Repositories pltbutils

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /pltbutils/trunk/src/vhdl
    from Rev 35 to Rev 36
    Reverse comparison

Rev 35 → Rev 36

/pltbutils_func_pkg.vhd
50,7 → 50,6
use ieee.numeric_std.all;
use std.textio.all;
use work.txt_util.all;
use work.pltbutils_type_pkg.all; -- Use for VHDL-2002, comment out for VHDL-93
use work.pltbutils_user_cfg_pkg.all;
 
package pltbutils_func_pkg is
59,40 → 58,44
constant C_PLTBUTILS_STRLEN : natural := 80;
constant C_PLTBUTILS_TIMEOUT : time := 10 sec;
constant C_WAIT_BEFORE_STOP_TIME : time := 1 us;
-- Counters for number of checks and number of errors
-- VHDL-2002:
shared variable v_pltbutils_testcase_name : pltbutils_p_string_t;
shared variable v_pltbutils_testcase_name_len : pltbutils_p_integer_t;
shared variable v_pltbutils_test_num : pltbutils_p_integer_t;
shared variable v_pltbutils_test_name : pltbutils_p_string_t;
shared variable v_pltbutils_test_name_len : pltbutils_p_integer_t;
shared variable v_pltbutils_info : pltbutils_p_string_t;
shared variable v_pltbutils_info_len : pltbutils_p_integer_t;
shared variable v_pltbutils_test_cnt : pltbutils_p_integer_t;
shared variable v_pltbutils_chk_cnt : pltbutils_p_integer_t;
shared variable v_pltbutils_err_cnt : pltbutils_p_integer_t;
shared variable v_pltbutils_chk_cnt_in_test : pltbutils_p_integer_t;
shared variable v_pltbutils_err_cnt_in_test : pltbutils_p_integer_t;
shared variable v_pltbutils_stop_sim : pltbutils_p_std_logic_t;
-- VHDL-1993:
--shared variable v_pltbutils_testcase_name : string(1 to C_PLTBUTILS_STRLEN) := (others => ' ');
--shared variable v_pltbutils_testcase_name_len : integer := 1;
--shared variable v_pltbutils_test_num : natural := 0;
--shared variable v_pltbutils_test_name : string(1 to C_PLTBUTILS_STRLEN) := (others => ' ');
--shared variable v_pltbutils_test_name_len : integer := 1;
--shared variable v_pltbutils_info : string(1 to C_PLTBUTILS_STRLEN) := (others => ' ');
--shared variable v_pltbutils_info_len : integer := 1;
--shared variable v_pltbutils_test_cnt : natural := 0;
--shared variable v_pltbutils_chk_cnt : natural := 0;
--shared variable v_pltbutils_err_cnt : natural := 0;
--shared variable v_pltbutils_chk_cnt_in_test : natural := 0;
--shared variable v_pltbutils_err_cnt_in_test : natural := 0;
--shared variable v_pltbutils_stop_sim : std_logic := '0';
-- Global status- and control signal
type pltbutils_sc_t is
record
 
-- Type for status- and control variable
type pltbv_t is
record
testcase_name : string(1 to C_PLTBUTILS_STRLEN);
testcase_name_len: integer;
test_num : integer;
test_name : string(1 to C_PLTBUTILS_STRLEN);
test_name_len : integer;
info : string(1 to C_PLTBUTILS_STRLEN);
info_len : integer;
test_cnt : integer;
chk_cnt : integer;
err_cnt : integer;
chk_cnt_in_test : integer;
err_cnt_in_test : integer;
stop_sim : std_logic;
end record;
constant C_PLTBV_INIT : pltbv_t := (
(others => ' '), -- testcase_name
1, -- testcase_name_len
0, -- test_num
(others => ' '), -- test_name
1, -- test_name_len
(others => ' '), -- info
1, -- info_len
0, -- test_cnt
0, -- chk_cnt
0, -- err_cnt
0, -- chk_cnt_in_test
0, -- err_cnt_in_test
'0' -- stop_sim
);
 
-- Status- and control signal (subset of pltbv_t)
type pltbs_t is
record
test_num : natural;
test_name : string(1 to C_PLTBUTILS_STRLEN);
info : string(1 to C_PLTBUTILS_STRLEN);
100,46 → 103,48
err_cnt : natural;
stop_sim : std_logic;
end record;
signal pltbutils_sc : pltbutils_sc_t;
-- startsim
constant C_PLTBS_INIT : pltbs_t := (
0, -- test_num
(others => ' '), -- test_name
(others => ' '), -- info
0, -- chk_cnt
0, -- err_cnt
'0' -- stop_sim
);
-- startsim
procedure startsim(
constant testcase_name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
-- endsim
procedure endsim(
signal pltbutils_sc : out pltbutils_sc_t;
constant show_success_fail : in boolean := false;
constant force : in boolean := false
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant show_success_fail : in boolean := false;
constant force : in boolean := false
);
 
-- starttest
procedure starttest(
constant num : in integer := -1;
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure starttest(
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
-- testname (depricated)
procedure testname(
constant num : in integer := -1;
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
);
procedure testname(
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
);
-- endtest
procedure endtest(
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
-- print, printv, print2
161,22 → 166,15
variable s : out string;
constant txt : in string
);
procedure printv(
constant active : in boolean;
variable s : inout pltbutils_p_string_t;
constant txt : in string
);
procedure printv(
variable s : inout pltbutils_p_string_t;
constant txt : in string
);
procedure print(
constant active : in boolean;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
);
procedure print(
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
);
procedure print2(
190,11 → 188,13
);
procedure print2(
constant active : in boolean;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
);
procedure print2(
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
);
 
202,17 → 202,19
procedure waitclks(
constant N : in natural;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
 
-- waitsig
procedure waitsig(
signal s : in integer;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
220,7 → 222,8
signal s : in std_logic;
constant value : in std_logic;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
228,15 → 231,17
signal s : in std_logic;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
);
procedure waitsig(
signal s : in std_logic_vector;
constant value : in std_logic_vector;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
244,7 → 249,8
signal s : in std_logic_vector;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
252,15 → 258,17
signal s : in unsigned;
constant value : in unsigned;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
);
procedure waitsig(
signal s : in unsigned;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
268,7 → 276,8
signal s : in signed;
constant value : in signed;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
276,35 → 285,40
signal s : in signed;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
);
);
 
-- check
procedure check(
constant rpt : in string;
constant actual : in integer;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in std_logic;
constant expected : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in std_logic;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in std_logic_vector;
constant expected : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
311,49 → 325,57
constant actual : in std_logic_vector;
constant expected : in std_logic_vector;
constant mask : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in std_logic_vector;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in std_logic_vector;
constant expected : in integer;
constant mask : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in unsigned;
constant expected : in unsigned;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in unsigned;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in signed;
constant expected : in signed;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant actual : in signed;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
);
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
constant expr : in boolean;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
procedure check(
constant rpt : in string;
361,9 → 383,10
constant actual : in string;
constant expected : in string;
constant mask : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
-- to_ascending
function to_ascending(
constant s : std_logic_vector
385,7 → 408,7
function to_descending(
constant s : signed
) return signed;
 
-- hxstr
function hxstr(
constant s : std_logic_vector;
404,15 → 427,26
) return string;
 
-- pltbutils internal procedure(s), do not call from user's code
procedure pltbutils_sc_update(
signal pltbutils_sc : out pltbutils_sc_t
procedure pltbs_update(
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
procedure stopsim(
constant timestamp : in time
);
 
procedure pltbutils_error(
constant rpt : in string;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
);
 
procedure startsim_msg(
constant testcase_name : in string;
constant timestamp : in time
);
 
procedure endsim_msg(
constant testcase_name : in string;
constant timestamp : in time;
421,13 → 455,13
constant num_errors : in integer;
constant show_success_fail : in boolean
);
 
procedure starttest_msg(
constant test_num : in integer;
constant test_name : in string;
constant timestamp : in time
);
 
procedure endtest_msg(
constant test_num : in integer;
constant test_name : in string;
434,37 → 468,29
constant timestamp : in time;
constant num_checks_in_test : in integer;
constant num_errors_in_test : in integer
);
);
 
procedure check_msg(
constant rpt : in string;
constant expr : in boolean;
constant timestamp : in time;
constant expr : in boolean;
constant actual : in string;
constant expected : in string;
constant mask : in string;
constant test_num : in integer;
constant test_num : in integer;
constant test_name : in string;
constant check_num : in integer;
constant err_cnt_in_test : in integer
);
procedure pltbutils_error(
constant rpt : in string;
signal pltbutils_sc : out pltbutils_sc_t
);
 
procedure error_msg(
constant rpt : in string;
constant timestamp : in time;
constant test_num : in integer;
constant test_num : in integer;
constant test_name : in string;
constant err_cnt_in_test : in integer
);
procedure stopsim(
constant timestamp : in time
);
 
end package pltbutils_func_pkg;
 
package body pltbutils_func_pkg is
474,18 → 500,19
--
-- procedure startsim(
-- constant testcase_name : in string;
-- signal pltbutils_sc : out pltbutils_sc_t
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- Displays a message at start of simulation message, and initializes
-- PlTbUtils' global status and control signal.
-- PlTbUtils' status and control variable and -signal.
-- Call startsim() only once.
--
-- Arguments:
-- testcase_name Name of the test case, e.g. "tc1".
--
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- NOTE:
-- The start-of-simulation message is not only intended to be informative
497,16 → 524,24
-- DO NOT OUTPUT AN IDENTICAL MESSAGE anywhere else.
--
-- Example:
-- startsim("tc1", pltbutils_sc);
-- startsim("tc1", pltbv, pltbs);
----------------------------------------------------------------------------
procedure startsim(
constant testcase_name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
variable dummy : integer;
variable timestamp : time;
variable timestamp : time;
begin
timestamp := now;
pltbv := C_PLTBV_INIT;
printv(pltbv.testcase_name, testcase_name);
pltbv.testcase_name_len := testcase_name'length;
printv(pltbv.test_name, "START OF SIMULATION");
pltbv.test_name_len := 19;
printv(pltbv.info, testcase_name);
pltbv.info_len := testcase_name'length;
pltbs_update(pltbv, pltbs);
if C_PLTBUTILS_USE_STD_STARTSIM_MSG then
startsim_msg(testcase_name, timestamp);
end if;
513,29 → 548,6
if C_PLTBUTILS_USE_CUSTOM_STARTSIM_MSG then
custom_startsim_msg(testcase_name, timestamp);
end if;
printv(v_pltbutils_info, testcase_name);
-- VHDL-2002:
v_pltbutils_testcase_name.set(testcase_name);
v_pltbutils_testcase_name_len.set(testcase_name'length);
v_pltbutils_stop_sim.clr;
v_pltbutils_test_num.clr;
v_pltbutils_test_name.set("START OF SIMULATION");
v_pltbutils_test_name_len.set(19);
v_pltbutils_chk_cnt.clr;
v_pltbutils_err_cnt.clr;
v_pltbutils_chk_cnt_in_test.clr;
v_pltbutils_err_cnt_in_test.clr;
pltbutils_sc_update(pltbutils_sc);
-- VHDL-1993:
--v_pltbutils_stop_sim := '0';
--v_pltbutils_test_num := 0;
--printv(v_pltbutils_test_name, "START OF SIMULATION");
--v_pltbutils_test_name_len := 19;
--v_pltbutils_chk_cnt := 0;
--v_pltbutils_err_cnt := 0;
--v_pltbutils_chk_cnt_in_test := 0;
--v_pltbutils_err_cnt_in_test := 0;
--pltbutils_sc_update(pltbutils_sc);
end procedure startsim;
 
----------------------------------------------------------------------------
542,20 → 554,21
-- endsim
--
-- procedure endsim(
-- signal pltbutils_sc : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant show_success_fail : in boolean := false;
-- constant force : in boolean := false
-- )
--
-- Displays a message at end of simulation message, presents the simulation
-- results, and stops the simulation.
-- results, and stops the simulation.
-- Call endsim() it only once.
--
-- Arguments:
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- Arguments:
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- show_success_fail If true, endsim() shows "*** SUCCESS ***",
-- show_success_fail If true, endsim() shows "*** SUCCESS ***",
-- "*** FAIL ***", or "*** NO CHECKS ***".
-- Optional, default is false.
--
566,8 → 579,8
-- Optional, default is false.
--
-- The testbench should be designed so that all clocks stop when endsim()
-- sets the signal stop_sim to '1'. This should stop the simulator.
-- In some cases, that doesn't work, then set the force argument to true, which
-- sets the signal pltbs.stop_sim to '1'. This should stop the simulator.
-- In some cases that doesn't work, then set the force argument to true, which
-- causes a false assert failure, which should stop the simulator.
-- Scripts searching transcript logs for errors and failures, should ignore
-- the failure with "--- FORCE END OF SIMULATION ---" as part of the report.
579,58 → 592,37
-- of regression tests.
-- For this reason, the message must be consistent and unique.
--
-- DO NOT MODIFY the messages "--- END OF SIMULATION ---",
-- DO NOT MODIFY the messages "--- END OF SIMULATION ---",
-- "*** SUCCESS ***", "*** FAIL ***", "*** NO CHECKS ***".
-- DO NOT OUTPUT IDENTICAL MESSAGES anywhere else.
--
-- Examples:
-- endsim(pltbutils_sc);
-- endsim(pltbutils_sc, true);
-- endsim(pltbutils_sc, true, true);
-- endsim(pltbv, pltbs);
-- endsim(pltbv, pltbs, true);
-- endsim(pltbv, pltbs, true, true);
----------------------------------------------------------------------------
procedure endsim(
signal pltbutils_sc : out pltbutils_sc_t;
constant show_success_fail : in boolean := false;
constant force : in boolean := false
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant show_success_fail : in boolean := false;
constant force : in boolean := false
) is
variable timestamp : time;
variable name_len : integer;
begin
timestamp := now;
name_len := v_pltbutils_testcase_name_len.value; -- VHDL-2002
--name_len : v_pltbutils_sc_testcase_name_len; -- VHDL-1993
if C_PLTBUTILS_USE_STD_ENDSIM_MSG then
-- VHDL-2002:
endsim_msg(v_pltbutils_testcase_name.value(1 to name_len),
timestamp, v_pltbutils_test_cnt.value, v_pltbutils_chk_cnt.value,
v_pltbutils_err_cnt.value, show_success_fail);
-- VHDL-1993:
--endsim_msg(v_pltbutils_testcase_name(1 to name_len),
-- timestamp, v_pltbutils_test_cnt, v_pltbutils_chk_cnt,
-- v_pltbutils_err_cnt, show_success_fail);
endsim_msg(pltbv.testcase_name(1 to pltbv.testcase_name_len), timestamp,
pltbv.test_cnt, pltbv.chk_cnt, pltbv.err_cnt, show_success_fail);
end if;
if C_PLTBUTILS_USE_CUSTOM_ENDSIM_MSG then
-- VHDL-2002:
custom_endsim_msg(v_pltbutils_testcase_name.value(1 to name_len),
timestamp, v_pltbutils_test_cnt.value, v_pltbutils_chk_cnt.value,
v_pltbutils_err_cnt.value, show_success_fail);
-- VHDL-1993:
--custom_endsim_msg(v_pltbutils_testcase_name(1 to name_len),
-- timestamp, v_pltbutils_test_cnt, v_pltbutils_chk_cnt,
-- v_pltbutils_err_cnt, show_success_fail);
custom_endsim_msg(pltbv.testcase_name(1 to pltbv.testcase_name_len), timestamp,
pltbv.test_cnt, pltbv.chk_cnt, pltbv.err_cnt, show_success_fail);
end if;
printv(v_pltbutils_info, "");
-- VHDL-2002:
v_pltbutils_stop_sim.set('1');
v_pltbutils_test_num.clr;
v_pltbutils_test_name.set("END OF SIMULATION");
v_pltbutils_test_name_len.set(17);
-- VHDL-1993:
--v_pltbutils_stop_sim := '1';
--v_pltbutils_test_num := 0;
--printv(v_pltbutils_test_name, "END OF SIMULATION");
--v_pltbutils_test_name_len := 17;
pltbutils_sc_update(pltbutils_sc);
pltbv.test_num := 0;
printv(pltbv.test_name, "END OF SIMULATION");
pltbv.test_name_len := 17;
pltbv.stop_sim := '1';
pltbs_update(pltbv, pltbs);
wait for C_WAIT_BEFORE_STOP_TIME;
if force then
if C_PLTBUTILS_USE_STD_STOPSIM then
649,175 → 641,132
-- procedure starttest(
-- constant num : in integer := -1;
-- constant name : in string;
-- signal pltbutils_sc : out pltbutils_sc_t
-- )
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- Sets a number (optional) and a name for a test. The number and name will
-- be printed to the screen, and displayed in the simulator's waveform
-- window.
-- window.
-- The test number and name is also included if there errors reported by the
-- check() procedure calls.
--
-- Arguments:
-- Arguments:
-- num Test number. Optional, default is to increment
-- the current test number.
--
-- name Test name.
--
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- If the test number is omitted, a new test number is automatically
-- computed by incrementing the current test number.
-- computed by incrementing the current test number.
-- Manually setting the test number may make it easier to find the test code
-- in the testbench code, though.
--
-- Examples:
-- starttest("Reset test", pltbutils_sc);
-- starttest(1, "Reset test", pltbutils_sc);
-- starttest("Reset test", pltbv, pltbs);
-- starttest(1, "Reset test", pltbv, pltbs);
----------------------------------------------------------------------------
procedure starttest(
constant num : in integer := -1;
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
variable timestamp : time;
begin
timestamp := now;
-- VHDL-2002:
if num = -1 then
v_pltbutils_test_num.inc;
pltbv.test_num := pltbv.test_num + 1;
else
v_pltbutils_test_num.set(num);
pltbv.test_num := num;
end if;
v_pltbutils_test_cnt.inc;
v_pltbutils_test_name.set(name);
v_pltbutils_test_name_len.set(name'length);
v_pltbutils_err_cnt_in_test.clr;
pltbutils_sc_update(pltbutils_sc);
printv(pltbv.test_name, name);
pltbv.test_name_len := name'length;
pltbv.test_cnt := pltbv.test_cnt + 1;
pltbv.chk_cnt_in_test := 0;
pltbv.err_cnt_in_test := 0;
pltbs_update(pltbv, pltbs);
if C_PLTBUTILS_USE_STD_STARTTEST_MSG then
starttest_msg(v_pltbutils_test_num.value, name, timestamp);
starttest_msg(pltbv.test_num, name, timestamp);
end if;
if C_PLTBUTILS_USE_CUSTOM_STARTTEST_MSG then
custom_starttest_msg(v_pltbutils_test_num.value, name, timestamp);
custom_starttest_msg(pltbv.test_num, name, timestamp);
end if;
-- VHDL-1993:
--if num = -1 then
-- b_pltbutils_test_num := v_pltbutils_test_num + 1;
--else
-- v_pltbutils_test_num := num;
--end if;
--v_pltbutils_test_cnt := v_pltbutils_test_cnt + 1;
--printv(v_pltbutils_test_name, name);
--v_pltbutils_test_name_len := name'length;
--v_pltbutils_err_cnt_in_test := 0;
--pltbutils_sc_update(pltbutils_sc);
--if C_PLTBUTILS_USE_STD_STARTTEST_MSG then
-- starttest_msg(v_pltbutils_test_num, name, timestamp);
--end if;
--if C_PLTBUTILS_USE_CUSTOM_STARTTEST_MSG then
-- custom_starttest_msg(v_pltbutils_test_num, name, timestamp);
--end if;
end procedure starttest;
 
procedure starttest(
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
starttest(-1, name, pltbutils_sc);
starttest(-1, name, pltbv, pltbs);
end procedure starttest;
-- Depricated. Will be removed. Use starttest() instead.
procedure testname(
constant num : in integer := -1;
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
) is
begin
starttest(num, name, pltbutils_sc);
end procedure testname;
-- Depricated. Will be removed. Use starttest() instead.
procedure testname(
constant name : in string;
signal pltbutils_sc : out pltbutils_sc_t
) is
begin
testname(-1, name, pltbutils_sc);
end procedure testname;
 
----------------------------------------------------------------------------
-- endtest
--
-- procedure endtest(
-- signal pltbutils_sc : out pltbutils_sc_t
-- )
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- Prints an end-of-test message to the screen.
--
-- Arguments:
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- Arguments:
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- Example:
-- endtest(pltbutils_sc);
-- endtest(pltbv, pltbs);
----------------------------------------------------------------------------
procedure endtest(
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
variable timestamp : time;
variable v_name_len : integer;
begin
timestamp := now;
-- Uncommented for VHDL-2002 Protected types, otherwise commented:
v_name_len := v_pltbutils_test_name_len.value; -- VHDL-2002
if C_PLTBUTILS_USE_STD_ENDTEST_MSG then
endtest_msg(v_pltbutils_test_num.value, v_pltbutils_test_name.value(1 to v_name_len),
timestamp, v_pltbutils_chk_cnt_in_test.value, v_pltbutils_err_cnt_in_test.value);
end if;
endtest_msg(pltbv.test_num, pltbv.test_name(1 to pltbv.test_name_len),
timestamp, pltbv.chk_cnt_in_test, pltbv.err_cnt_in_test);
end if;
if C_PLTBUTILS_USE_CUSTOM_ENDTEST_MSG then
custom_endtest_msg(v_pltbutils_test_num.value, v_pltbutils_test_name.value(1 to v_name_len),
timestamp, v_pltbutils_chk_cnt_in_test.value, v_pltbutils_err_cnt_in_test.value);
end if;
-- Uncommented for not using VHDL-2002 Protected Types, otherwise commented:
--name_len := v_pltbutils_test_name_len; -- VHDL-1993
--if C_PLTBUTILS_USE_STD_ENDTEST_MSG then
-- endtest_msg(v_pltbutils_test_num, v_pltbutils_test_name(1 to v_name_len),
-- timestamp, v_pltbutils_chk_cnt_in_test, v_pltbutils_err_cnt_in_test);
--end if;
--if C_PLTBUTILS_USE_CUSTOM_ENDTEST_MSG then
-- custom_endtest_msg(v_pltbutils_test_num, v_pltbutils_test_name(1 to v_name_len),
-- timestamp, v_pltbutils_chk_cnt_in_test, v_pltbutils_err_cnt_in_test);
--end if;
custom_endtest_msg(pltbv.test_num, pltbv.test_name(1 to pltbv.test_name_len),
timestamp, pltbv.chk_cnt_in_test, pltbv.err_cnt_in_test);
end if;
printv(pltbv.test_name, " ");
pltbv.test_name_len := 1;
pltbs_update(pltbv, pltbs);
end procedure endtest;
 
printv(v_pltbutils_test_name, " ");
pltbutils_sc_update(pltbutils_sc);
end procedure endtest;
----------------------------------------------------------------------------
-- print printv print2
--
-- procedure print(
-- procedure print(
-- signal s : out string;
-- constant txt : in string
-- )
-- )
--
-- procedure print(
-- procedure print(
-- constant active : in boolean;
-- signal s : out string;
-- constant txt : in string
-- )
-- )
--
-- procedure print(
-- signal pltbutils_sc : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant txt : in string
-- )
--
-- procedure print(
-- constant active : in boolean;
-- signal pltbutils_sc : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant txt : in string
-- )
--
832,36 → 781,37
-- constant txt : in string
-- )
--
-- procedure print2(
-- procedure print2(
-- signal s : out string;
-- constant txt : in string
-- )
--
-- procedure print2(
-- procedure print2(
-- constant active : in boolean;
-- signal s : out string;
-- constant txt : in string
-- )
--
-- procedure print2(
-- signal pltbutils : out pltbutils_sc_t;
-- procedure print2(
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant txt : in string
-- )
--
-- procedure print2(
-- procedure print2(
-- constant active : in boolean;
-- signal pltbutils : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant txt : in string
-- )
--
-- print() prints text messages to a signal for viewing in the simulator's
-- waveform window. printv() does the same thing, but to a variable instead.
-- print2() prints both to a signal and to the transcript window.
-- The type of the output can be string or pltbutils_sc_t.
-- If the type is pltbutils_sc_t, the name can be no other than pltbutils_sc.
-- print2() prints both to a signal and to the transcript window.
-- The type of the output can be string or pltbv_t+pltbs_t.
--
-- Arguments:
-- s Signal or variable of type string to be
-- Arguments:
-- s Signal or variable of type string to be
-- printed to.
--
-- txt The text.
869,21 → 819,20
-- active The text is only printed if active is true.
-- Useful for debug switches, etc.
--
-- pltbutils_sc PlTbUtils' global status- and control signal
-- of type pltbutils_sc_t.
-- The name must be no other than pltbutils_sc.
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- If the string txt is longer than the signal s, the text will be truncated.
-- If txt is shorter, s will be padded with spaces.
-- If the string txt is longer than the signal s, the text will be truncated.
-- If txt is shorter, s will be padded with spaces.
--
-- Examples:
-- print(msg, "Hello, world"); -- Prints to signal msg
-- print(G_DEBUG, msg, "Hello, world"); -- Prints to signal msg if
-- print(G_DEBUG, msg, "Hello, world"); -- Prints to signal msg if
-- -- generic G_DEBUG is true
-- printv(v_msg, "Hello, world"); -- Prints to variable msg
-- print(pltbutils_sc, "Hello, world"); -- Prints to "info" in waveform window
-- print2(msg, "Hello, world"); -- Prints to signal and transcript window
-- print(pltbutils_sc, "Hello, world"); -- Prints to "info" in waveform and
-- print(pltbv, pltbs, "Hello, world"); -- Prints to "info" in waveform window
-- print2(msg, "Hello, world"); -- Prints to signal and transcript window
-- print2(pltbv, pltbs, "Hello, world"); -- Prints to "info" in waveform and
-- -- transcript windows
----------------------------------------------------------------------------
procedure print(
904,7 → 853,7
end loop;
end if;
end procedure print;
 
procedure print(
signal s : out string;
constant txt : in string
912,7 → 861,7
begin
print(true, s, txt);
end procedure print;
 
procedure printv(
constant active : in boolean;
variable s : out string;
931,7 → 880,7
end loop;
end if;
end procedure printv;
 
procedure printv(
variable s : out string;
constant txt : in string
938,51 → 887,33
) is
begin
printv(true, s, txt);
end procedure printv;
-- VHDL-2002:
procedure printv(
constant active : in boolean;
variable s : inout pltbutils_p_string_t;
constant txt : in string
) is
variable j : positive := txt 'low;
begin
if active then
s.set(txt);
end if;
end procedure printv;
procedure printv(
variable s : inout pltbutils_p_string_t;
constant txt : in string
) is
begin
printv(true, s, txt);
end procedure printv;
 
-- Print to info element in pltbutils_sc, which shows up in waveform window
-- Print to info element in pltbv/pltbs, which shows up in waveform window
procedure print(
constant active : in boolean;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
) is
variable j : positive := txt 'low;
begin
if active then
printv(v_pltbutils_info, txt );
pltbutils_sc_update(pltbutils_sc);
printv(pltbv.info, txt);
pltbv.info_len := txt'length;
pltbs_update(pltbv, pltbs);
end if;
end procedure print;
 
procedure print(
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
) is
begin
print(true, pltbutils_sc, txt);
end procedure print;
print(true, pltbv, pltbs, txt);
end procedure print;
 
procedure print2(
constant active : in boolean;
signal s : out string;
989,8 → 920,8
constant txt : in string
) is
begin
if active then
print(s, txt );
if active then
print(s, txt);
print(txt);
end if;
end procedure print2;
1001,25 → 932,27
) is
begin
print(true, s, txt);
end procedure print2;
end procedure print2;
 
procedure print2(
constant active : in boolean;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
) is
begin
print(pltbutils_sc, txt );
print(txt);
print(active, pltbv, pltbs, txt);
print(active, txt);
end procedure print2;
 
procedure print2(
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant txt : in string
) is
begin
print(true, pltbutils_sc, txt);
end procedure print2;
print(true, pltbv, pltbs, txt);
end procedure print2;
 
----------------------------------------------------------------------------
-- waitclks
1027,7 → 960,8
-- procedure waitclks(
-- constant n : in natural;
-- signal clk : in std_logic;
-- signal pltbutils_sc : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant falling : in boolean := false;
-- constant timeout : in time := C_PLTBUTILS_TIMEOUT
-- )
1036,29 → 970,30
-- Or, to be more precise, a specified number of specified clock edges of
-- the specified clock.
--
-- Arguments:
-- Arguments:
-- n Number of rising or falling clock edges to wait.
--
-- clk The clock to wait for.
--
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- falling If true, waits for falling edges, otherwise
-- rising edges. Optional, default is false.
--
-- timeout Timeout time, in case the clock is not working.
-- Optional, default is C_PLTBUTILS_TIMEOUT.
-- Optional, default is C_PLTBUTILS_TIMEOUT.
--
-- Examples:
-- waitclks(5, sys_clk, pltbutils_sc);
-- waitclks(5, sys_clk, pltbutils_sc, true);
-- waitclks(5, sys_clk, pltbutils_sc, true, 1 ms);
-- waitclks(5, sys_clk, pltbv, pltbs);
-- waitclks(5, sys_clk, pltbv, pltbs true);
-- waitclks(5, sys_clk, pltbv, pltbs, true, 1 ms);
----------------------------------------------------------------------------
procedure waitclks(
constant n : in natural;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1075,10 → 1010,10
i := i - 1;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitclks() timeout", pltbutils_sc);
pltbutils_error("waitclks() timeout", pltbv, pltbs);
end if;
end procedure waitclks;
 
----------------------------------------------------------------------------
-- waitsig
--
1086,7 → 1021,8
-- signal s : in integer|std_logic|std_logic_vector|unsigned|signed;
-- constant value : in integer|std_logic|std_logic_vector|unsigned|signed;
-- signal clk : in std_logic;
-- signal pltbutils_sc : out pltbutils_sc_t;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t;
-- constant falling : in boolean := false;
-- constant timeout : in time := C_PLTBUTILS_TIMEOUT
-- )
1094,9 → 1030,9
-- Waits until a signal has reached a specified value after specified clock
-- edge.
--
-- Arguments:
-- Arguments:
-- s The signal to test.
-- Supported types: integer, std_logic,
-- Supported types: integer, std_logic,
-- std_logic_vector, unsigned, signed.
--
-- value Value to wait for.
1104,25 → 1040,26
--
-- clk The clock.
--
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to pltbutils_sc.
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- falling If true, waits for falling edges, otherwise
-- rising edges. Optional, default is false.
--
-- timeout Timeout time, in case the clock is not working.
-- Optional, default is C_PLTBUTILS_TIMEOUT.
-- Optional, default is C_PLTBUTILS_TIMEOUT.
--
-- Examples:
-- waitsig(wr_en, '1', sys_clk, pltbutils_sc);
-- waitsig(rd_en, 1, sys_clk, pltbutils_sc, true);
-- waitclks(full, '1', sys_clk, pltbutils_sc, true, 1 ms);
----------------------------------------------------------------------------
-- waitsig(wr_en, '1', sys_clk, pltbv, pltbs);
-- waitsig(rd_en, 1, sys_clk, pltbv, pltbs, true);
-- waitclks(full, '1', sys_clk, pltbv, pltbs, true, 1 ms);
----------------------------------------------------------------------------
procedure waitsig(
signal s : in integer;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1130,11 → 1067,11
begin
v_timeout_time := now + timeout;
l1 : loop
waitclks(1, clk, pltbutils_sc, falling, timeout);
waitclks(1, clk, pltbv, pltbs, falling, timeout);
exit l1 when s = value or now >= v_timeout_time;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
 
1142,7 → 1079,8
signal s : in std_logic;
constant value : in std_logic;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1150,19 → 1088,20
begin
v_timeout_time := now + timeout;
l1 : loop
waitclks(1, clk, pltbutils_sc, falling, timeout);
waitclks(1, clk, pltbv, pltbs, falling, timeout);
exit l1 when s = value or now >= v_timeout_time;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
 
procedure waitsig(
signal s : in std_logic;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1175,18 → 1114,18
when others => v_value := 'X';
end case;
if v_value /= 'X' then
waitsig(s, v_value, clk,
pltbutils_sc, falling, timeout);
waitsig(s, v_value, clk, pltbv, pltbs, falling, timeout);
else
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
end procedure waitsig;
 
procedure waitsig(
signal s : in std_logic_vector;
constant value : in std_logic_vector;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1194,33 → 1133,35
begin
v_timeout_time := now + timeout;
l1 : loop
waitclks(1, clk, pltbutils_sc, falling, timeout);
waitclks(1, clk, pltbv, pltbs, falling, timeout);
exit l1 when s = value or now >= v_timeout_time;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
end procedure waitsig;
 
procedure waitsig(
signal s : in std_logic_vector;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
variable v_timeout_time : time;
begin
waitsig(s, std_logic_vector(to_unsigned(value, s'length)), clk,
pltbutils_sc, falling, timeout);
end procedure waitsig;
waitsig(s, std_logic_vector(to_unsigned(value, s'length)), clk,
pltbv, pltbs, falling, timeout);
end procedure waitsig;
 
procedure waitsig(
signal s : in unsigned;
constant value : in unsigned;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1228,33 → 1169,35
begin
v_timeout_time := now + timeout;
l1 : loop
waitclks(1, clk, pltbutils_sc, falling, timeout);
waitclks(1, clk, pltbv, pltbs, falling, timeout);
exit l1 when s = value or now >= v_timeout_time;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
end procedure waitsig;
 
procedure waitsig(
signal s : in unsigned;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
variable v_timeout_time : time;
begin
waitsig(s, to_unsigned(value, s'length), clk,
pltbutils_sc, falling, timeout);
end procedure waitsig;
waitsig(s, to_unsigned(value, s'length), clk,
pltbv, pltbs, falling, timeout);
end procedure waitsig;
 
procedure waitsig(
signal s : in signed;
constant value : in signed;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
1262,73 → 1205,77
begin
v_timeout_time := now + timeout;
l1 : loop
waitclks(1, clk, pltbutils_sc, falling, timeout);
waitclks(1, clk, pltbv, pltbs, falling, timeout);
exit l1 when s = value or now >= v_timeout_time;
end loop;
if now >= v_timeout_time then
pltbutils_error("waitsig() timeout", pltbutils_sc);
pltbutils_error("waitsig() timeout", pltbv, pltbs);
end if;
end procedure waitsig;
end procedure waitsig;
 
procedure waitsig(
signal s : in signed;
constant value : in integer;
signal clk : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t;
constant falling : in boolean := false;
constant timeout : in time := C_PLTBUTILS_TIMEOUT
) is
variable v_timeout_time : time;
begin
waitsig(s, to_signed(value, s'length), clk,
pltbutils_sc, falling, timeout);
end procedure waitsig;
waitsig(s, to_signed(value, s'length), clk,
pltbv, pltbs, falling, timeout);
end procedure waitsig;
 
----------------------------------------------------------------------------
-- check
--
-- procedure check(
-- constant rpt : in string;
-- constant actual : in integer|std_logic|std_logic_vector|unsigned|signed;
-- constant expected : in integer|std_logic|std_logic_vector|unsigned|signed;
-- signal pltbutils_sc : out pltbutils_sc_t
-- )
-- constant rpt : in string;
-- constant actual : in integer|std_logic|std_logic_vector|unsigned|signed;
-- constant expected : in integer|std_logic|std_logic_vector|unsigned|signed;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- procedure check(
-- constant rpt : in string;
-- constant actual : in std_logic_vector;
-- constant expected : in std_logic_vector;
-- constant mask : in std_logic_vector;
-- signal pltbutils_sc : out pltbutils_sc_t
-- )
-- constant rpt : in string;
-- constant actual : in std_logic_vector;
-- constant expected : in std_logic_vector;
-- constant mask : in std_logic_vector;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- procedure check(
-- constant rpt : in string;
-- constant expr : in boolean;
-- signal pltbutils_sc : out pltbutils_sc_t
-- constant rpt : in string;
-- constant expr : in boolean;
-- variable pltbv : inout pltbv_t;
-- signal pltbs : out pltbs_t
-- )
--
-- Checks that the value of a signal or variable is equal to expected.
-- If not equal, displays an error message and increments the error counter.
--
-- Arguments:
-- rpt Report message to be displayed in case of
-- mismatch.
-- Arguments:
-- rpt Report message to be displayed in case of
-- mismatch.
-- It is recommended that the message is unique
-- and that it contains the name of the signal
-- or variable being checked.
-- The message should NOT contain the expected
-- value, becase check() prints that
-- or variable being checked.
-- The message should NOT contain the expected
-- value, becase check() prints that
-- automatically.
--
-- actual The signal or variable to be checked.
-- Supported types: integer, std_logic,
-- Supported types: integer, std_logic,
-- std_logic_vector, unsigned, signed.
--
-- expected Expected value.
-- expected Expected value.
-- Same type as data or integer.
--
-- mask Bit mask and:ed to data and expected
-- mask Bit mask and:ed to data and expected
-- before comparison.
-- Optional if data is std_logic_vector.
-- Not allowed for other types.
1336,16 → 1283,16
-- expr boolean expression for checking.
-- This makes it possible to check any kind of
-- expresion, not just equality.
--
-- pltbutils_sc PlTbUtils' global status- and control signal.
-- Must be set to the name pltbutils_sc.
--
-- pltbv, pltbs PlTbUtils' status- and control variable and
-- -signal.
--
-- Examples:
-- check("dat_o after reset", dat_o, 0, pltbutils_sc);
-- check("dat_o after reset", dat_o, 0, pltbv, pltbs);
-- -- With mask:
-- check("Status field in reg_o after start", reg_o, x"01", x"03", pltbutils_sc);
-- check("Status field in reg_o after start", reg_o, x"01", x"03", pltbv, pltbs);
-- -- Boolean expression:
-- check("Counter after data burst", cnt_o > 10, pltbutils_sc);
-- check("Counter after data burst", cnt_o > 10, pltbv, pltbs);
----------------------------------------------------------------------------
-- check integer
procedure check(
1352,10 → 1299,11
constant rpt : in string;
constant actual : in integer;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual = expected, str(actual), str(expected), "", pltbutils_sc);
check(rpt, actual = expected, str(actual), str(expected), "", pltbv, pltbs);
end procedure check;
 
-- check std_logic
1363,37 → 1311,38
constant rpt : in string;
constant actual : in std_logic;
constant expected : in std_logic;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual = expected, str(actual), str(expected), "", pltbutils_sc);
check(rpt, actual = expected, str(actual), str(expected), "", pltbv, pltbs);
end procedure check;
 
-- check std_logic against integer
procedure check(
constant rpt : in string;
constant actual : in std_logic;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
-- variable v_expected : std_logic;
--variable equal : boolean;
begin
check(rpt, ((actual = '0' and expected = 0) or (actual = '1' and expected = 1)),
str(actual), str(expected), "", pltbutils_sc);
end procedure check;
str(actual), str(expected), "", pltbv, pltbs);
end procedure check;
 
-- check std_logic_vector
procedure check(
constant rpt : in string;
constant actual : in std_logic_vector;
constant expected : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbutils_sc);
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbv, pltbs);
end procedure check;
 
-- check std_logic_vector with mask
procedure check(
constant rpt : in string;
1400,22 → 1349,24
constant actual : in std_logic_vector;
constant expected : in std_logic_vector;
constant mask : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, (actual and mask) = (expected and mask),
hxstr(actual, "0x"), hxstr(expected, "0x"), hxstr(mask, "0x"), pltbutils_sc);
end procedure check;
hxstr(actual, "0x"), hxstr(expected, "0x"), hxstr(mask, "0x"), pltbv, pltbs);
end procedure check;
 
-- check std_logic_vector against integer
procedure check(
constant rpt : in string;
constant actual : in std_logic_vector;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual, std_logic_vector(to_signed(expected, actual'length)), pltbutils_sc);
check(rpt, actual, std_logic_vector(to_signed(expected, actual'length)), pltbv, pltbs);
end procedure check;
 
-- check std_logic_vector with mask against integer
1424,45 → 1375,49
constant actual : in std_logic_vector;
constant expected : in integer;
constant mask : in std_logic_vector;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual, std_logic_vector(to_signed(expected, actual'length)), mask, pltbutils_sc);
check(rpt, actual, std_logic_vector(to_signed(expected, actual'length)), mask, pltbv, pltbs);
end procedure check;
 
-- check unsigned
procedure check(
constant rpt : in string;
constant actual : in unsigned;
constant expected : in unsigned;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbutils_sc);
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbv, pltbs);
end procedure check;
 
-- check unsigned against integer
procedure check(
constant rpt : in string;
constant actual : in unsigned;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual, to_unsigned(expected, actual'length), pltbutils_sc);
end procedure check;
check(rpt, actual, to_unsigned(expected, actual'length), pltbv, pltbs);
end procedure check;
 
-- check signed
procedure check(
constant rpt : in string;
constant actual : in signed;
constant expected : in signed;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbutils_sc);
check(rpt, actual = expected, hxstr(actual, "0x"), hxstr(expected, "0x"), "", pltbv, pltbs);
end procedure check;
 
-- check signed against integer
-- TODO: find the bug reported by tb_pltbutils when expected is negative (-1):
-- ** Error: (vsim-86) numstd_conv_unsigned_nu: NATURAL arg value is negative (-1)
1470,12 → 1425,13
constant rpt : in string;
constant actual : in signed;
constant expected : in integer;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, actual, to_signed(expected, actual'length), pltbutils_sc);
end procedure check;
check(rpt, actual, to_signed(expected, actual'length), pltbv, pltbs);
end procedure check;
 
-- check with boolean expression
-- Check signal or variable with a boolean expression as argument C_EXPR.
-- This allowes any kind of check.
1482,12 → 1438,13
procedure check(
constant rpt : in string;
constant expr : in boolean;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
check(rpt, expr, "", "", "", pltbutils_sc);
end procedure check;
check(rpt, expr, "", "", "", pltbv, pltbs);
end procedure check;
 
procedure check(
constant rpt : in string;
constant expr : in boolean;
1494,46 → 1451,30
constant actual : in string;
constant expected : in string;
constant mask : in string;
signal pltbutils_sc : out pltbutils_sc_t
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
variable v_test_name_len : integer := 1;
variable actual_str : string(1 to 32) := (others => ' ');
variable actual_str_len : integer := 1;
variable expected_str : string(1 to 32) := (others => ' ');
variable expected_str_len : integer := 1;
variable mask_str : string(1 to 32) := (others => ' ');
variable mask_str_len : integer := 1;
variable timestamp : time;
begin
v_pltbutils_chk_cnt.inc; -- VHDL-2002
--v_pltbutils_chk_cnt := v_pltbutils_chk_cnt + 1; -- VHDL-1993
timestamp := now;
pltbv.chk_cnt := pltbv.chk_cnt + 1;
pltbv.chk_cnt_in_test := pltbv.chk_cnt_in_test + 1;
if not expr then
v_pltbutils_err_cnt.inc; -- VHDL-2002
v_pltbutils_err_cnt_in_test.inc; -- VHDL-2002
--v_pltbutils_err_cnt := v_pltbutils_err_cnt + 1; -- VHDL-1993
--v_pltbutils_err_cnt_in_test := v_pltbutils_err_cnt_in_test + 1; -- VHDL-1993
pltbv.err_cnt := pltbv.err_cnt + 1;
pltbv.err_cnt_in_test := pltbv.err_cnt_in_test + 1;
end if;
v_test_name_len := v_pltbutils_test_name_len.value;
pltbs_update(pltbv, pltbs);
if C_PLTBUTILS_USE_STD_CHECK_MSG then
check_msg(rpt, expr, actual, expected, mask, v_pltbutils_test_num.value,
v_pltbutils_test_name.value(1 to v_test_name_len), v_pltbutils_chk_cnt.value,
v_pltbutils_err_cnt_in_test.value); -- VHDL-2002
--check_msg(rpt, actual, expected, mask, v_pltbutils_test_num,
-- v_pltbutils_test_name(1 to v_test_name_len), v_pltbutils_chk_cnt,
-- v_pltbutils_err_cnt_in_test); -- VHDL-2002
check_msg(rpt, timestamp, expr, actual, expected, mask, pltbv.test_num,
pltbv.test_name(1 to pltbv.test_name_len), pltbv.chk_cnt, pltbv.err_cnt_in_test);
end if;
if C_PLTBUTILS_USE_CUSTOM_CHECK_MSG then
-- VHDL-2002:
custom_check_msg(rpt, expr, actual, expected, mask, v_pltbutils_test_num.value,
v_pltbutils_test_name.value(1 to v_test_name_len), v_pltbutils_chk_cnt.value,
v_pltbutils_err_cnt_in_test.value);
-- VHDL-1993:
--custom_check_msg(rpt, actual, expected, mask, v_pltbutils_test_num,
-- v_pltbutils_test_name(1 to v_test_name_len), v_pltbutils_chk_cnt,
-- v_pltbutils_err_cnt_in_test);
custom_check_msg(rpt, timestamp, expr, actual, expected, mask, pltbv.test_num,
pltbv.test_name(1 to pltbv.test_name_len), pltbv.chk_cnt, pltbv.err_cnt_in_test);
end if;
pltbutils_sc_update(pltbutils_sc);
pltbs_update(pltbv, pltbs);
end procedure check;
 
----------------------------------------------------------------------------
-- to_ascending
--
1613,7 → 1554,7
end loop;
return r;
end function to_descending;
 
function to_descending(
constant s : unsigned
) return unsigned is
1635,7 → 1576,7
end loop;
return r;
end function to_descending;
 
----------------------------------------------------------------------------
-- hxstr
-- function hxstr(
1659,7 → 1600,7
-- Converts a signal to a string in hexadecimal format.
-- An optional prefix can be specified, e.g. "0x".
--
-- The signal can have ascending range ( "to-range" ) or descending range
-- The signal can have ascending range ( "to-range" ) or descending range
-- ("downto-range").
--
-- hxstr is a wrapper function for hstr in txt_util.
1677,7 → 1618,7
begin
return prefix & hstr(to_descending(s)) & postfix;
end function hxstr;
 
function hxstr(
constant s : unsigned;
constant prefix : string := "";
1686,7 → 1627,7
begin
return prefix & hstr(to_descending(std_logic_vector(s))) & postfix;
end function hxstr;
 
function hxstr(
constant s : signed;
constant prefix : string := "";
1695,32 → 1636,54
begin
return prefix & hstr(to_descending(std_logic_vector(s))) & postfix;
end function hxstr;
 
----------------------------------------------------------------------------
-- pltbutils internal procedure(s), called from other pltbutils procedures.
-- Do not to call this/these from user's code.
-- This/these procedures are undocumented in the specification on purpose.
----------------------------------------------------------------------------
procedure pltbutils_sc_update(
signal pltbutils_sc : out pltbutils_sc_t
) is
procedure pltbs_update(
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
-- VHDL-2002:
pltbutils_sc.test_num <= v_pltbutils_test_num.value;
print(pltbutils_sc.test_name, v_pltbutils_test_name.value);
print(pltbutils_sc.info, v_pltbutils_info.value);
pltbutils_sc.chk_cnt <= v_pltbutils_chk_cnt.value;
pltbutils_sc.err_cnt <= v_pltbutils_err_cnt.value;
pltbutils_sc.stop_sim <= v_pltbutils_stop_sim.value;
-- VHDL-1993:
--pltbutils_sc.test_num <= v_pltbutils_test_num;
--print(pltbutils_sc.test_name, v_pltbutils_test_name);
--print(pltbutils_sc.info, v_pltbutils_info);
--pltbutils_sc.chk_cnt <= v_pltbutils_chk_cnt;
--pltbutils_sc.err_cnt <= v_pltbutils_err_cnt;
--pltbutils_sc.stop_sim <= v_pltbutils_stop_sim;
end procedure pltbutils_sc_update;
pltbs.test_num <= pltbv.test_num;
print(pltbs.test_name, pltbv.test_name);
print(pltbs.info, pltbv.info);
pltbs.chk_cnt <= pltbv.chk_cnt;
pltbs.err_cnt <= pltbv.err_cnt;
pltbs.stop_sim <= pltbv.stop_sim;
end procedure pltbs_update;
 
procedure pltbutils_error(
constant rpt : in string;
variable pltbv : inout pltbv_t;
signal pltbs : out pltbs_t
) is
begin
pltbv.err_cnt := pltbv.err_cnt + 1;
pltbv.err_cnt_in_test := pltbv.err_cnt_in_test + 1;
pltbs_update(pltbv, pltbs);
if C_PLTBUTILS_USE_STD_ERROR_MSG then
error_msg(rpt, now, pltbv.test_num,
pltbv.test_name(1 to pltbv.test_name_len), pltbv.err_cnt_in_test);
end if;
if C_PLTBUTILS_USE_CUSTOM_ERROR_MSG then
custom_error_msg(rpt, now, pltbv.test_num,
pltbv.test_name(1 to pltbv.test_name_len), pltbv.err_cnt_in_test);
end if;
end procedure pltbutils_error;
 
procedure stopsim(
constant timestamp : in time
) is
begin
assert false
report "--- FORCE END OF SIMULATION ---" &
" (ignore this false failure message, it's not a real failure)"
severity failure;
end procedure stopsim;
 
procedure startsim_msg(
constant testcase_name : in string;
constant timestamp : in time
1742,7 → 1705,7
variable l : line;
begin
print(lf & "--- END OF SIMULATION ---");
print("Note: the results presented below are based on the PlTbUtil's check() procedure calls.");
print("Note: the results presented below are based on the PlTbUtil's check() procedure calls.");
print(" The design may contain more errors, for which there are no check() calls.");
write(l, timestamp, right, 14);
writeline(output, l);
1763,9 → 1726,9
else
print("*** NO CHECKS ***");
end if;
end if;
end if;
end procedure endsim_msg;
 
procedure starttest_msg(
constant test_num : in integer;
constant test_name : in string;
1772,9 → 1735,9
constant timestamp : in time
) is
begin
print(lf & "Test " & str(test_num) & ": " & test_name & " (" & time'image(timestamp) & ")");
print(lf & "Test " & str(test_num) & ": " & test_name & " (" & time'image(timestamp) & ")");
end procedure starttest_msg;
 
procedure endtest_msg(
constant test_num : in integer;
constant test_name : in string;
1785,14 → 1748,15
begin
print("Done with test " & str(test_num) & ": " & test_name & " (" & time'image(timestamp) & ")");
end procedure endtest_msg;
 
procedure check_msg(
constant rpt : in string;
constant expr : in boolean;
constant timestamp : in time;
constant expr : in boolean;
constant actual : in string;
constant expected : in string;
constant mask : in string;
constant test_num : in integer;
constant test_num : in integer;
constant test_name : in string;
constant check_num : in integer;
constant err_cnt_in_test : in integer
1810,65 → 1774,29
if actual /= "" then
actual_str_len := 8 + actual'length;
actual_str(1 to actual_str_len) := " Actual=" & actual;
end if;
end if;
if expected /= "" then
expected_str_len := 10 + expected'length;
expected_str(1 to expected_str_len) := " Expected=" & expected;
end if;
end if;
if mask /= "" then
mask_str_len := 6 + mask'length;
mask_str(1 to mask_str_len) := " Mask=" & mask;
end if;
end if;
assert false
report "Check " & str(check_num) & "; " & rpt & "; " &
actual_str(1 to actual_str_len) &
actual_str(1 to actual_str_len) &
expected_str(1 to expected_str_len) &
mask_str(1 to mask_str_len) &
" in test " & str(test_num) & " " & test_name
severity error;
end if;
end procedure check_msg;
procedure pltbutils_error(
constant rpt : in string;
signal pltbutils_sc : out pltbutils_sc_t
) is
begin
-- VHDL-2002:
v_pltbutils_err_cnt.inc;
if C_PLTBUTILS_USE_STD_ERROR_MSG then
error_msg(rpt, now,
v_pltbutils_test_num.value,
v_pltbutils_test_name.value(1 to v_pltbutils_test_name_len.value),
v_pltbutils_err_cnt_in_test.value);
end if;
if C_PLTBUTILS_USE_CUSTOM_ERROR_MSG then
custom_error_msg(rpt, now,
v_pltbutils_test_num.value,
v_pltbutils_test_name.value(1 to v_pltbutils_test_name_len.value),
v_pltbutils_err_cnt_in_test.value);
end if;
-- VHDL-1993:
--v_pltbutils_err_cnt := v_pltbutils_err_cnt + 1;
--if C_PLTBUTILS_USE_STD_ERROR_MSG then
-- error_msg(rpt, now,
-- v_pltbutils_test_num,
-- v_pltbutils_test_name(1 to v_pltbutils_test_name_len),
-- v_pltbutils_err_cnt_in_test);
--end if;
--if C_PLTBUTILS_USE_CUSTOM_ERROR_MSG then
-- custom_error_msg(rpt, now,
-- v_pltbutils_test_num,
-- v_pltbutils_test_name(1 to v_pltbutils_test_name_len),
-- v_pltbutils_err_cnt_in_test);
--end if;
pltbutils_sc_update(pltbutils_sc);
end procedure pltbutils_error;
end procedure check_msg;
 
procedure error_msg(
constant rpt : in string;
constant timestamp : in time;
constant test_num : in integer;
constant test_num : in integer;
constant test_name : in string;
constant err_cnt_in_test : in integer
) is
1877,15 → 1805,5
report rpt & " in test " & str(test_num) & ": " & test_name
severity error;
end procedure error_msg;
procedure stopsim(
constant timestamp : in time
) is
begin
assert false
report "--- FORCE END OF SIMULATION ---" &
" (ignore this false failure message, it's not a real failure)"
severity failure;
end procedure stopsim;
 
end package body pltbutils_func_pkg;

powered by: WebSVN 2.1.0

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