library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; library std; use std.env.all; entity psl_test_endpoint is end entity psl_test_endpoint; architecture test of psl_test_endpoint is signal s_rst_n : std_logic := '0'; signal s_clk : std_logic := '0'; signal s_write : std_logic; signal s_read : std_logic; begin s_rst_n <= '1' after 100 ns; s_clk <= not s_clk after 10 ns; TestP : process is begin report "RUNNING psl_test_endpoint test case"; report "=========================================="; s_write <= '0'; -- named assertion should hit s_read <= '0'; wait until s_rst_n = '1' and rising_edge(s_clk); s_write <= '1'; wait until rising_edge(s_clk); s_read <= '1'; -- assertion should hit wait until rising_edge(s_clk); s_write <= '0'; s_read <= '0'; wait until rising_edge(s_clk); --stop(0); wait; end process TestP; -- psl default clock is rising_edge(s_clk); -- psl endpoint E_TEST0 is {not(s_write); s_write}; -- psl endpoint E_TEST1 is {s_write; s_write and not(s_read)}; -- psl sequence abc_seq is {not(s_write); s_write}; -- ASSERT0 should be passed, but not failed -- ASSERT1 should be failed -- ASSERT2 should not be passed -- psl ASSERT0 : assert always {E_TEST0} |=> {s_read} report "ASSERT0"; -- psl ASSERT1 : assert always {E_TEST0} |-> {s_read} report "ASSERT1"; -- psl ASSERT2 : assert always {E_TEST1} |-> {s_read} report "ASSERT2"; -- COVERAGE0..COVERAGE2 should all hit @ same time -- COVERAGE3 should never hit -- psl COVERAGE0 : cover {not(s_write); s_write} report "COVERED0"; -- psl COVERAGE1 : cover {abc_seq} report "COVERED1"; -- psl COVERAGE2 : cover {E_TEST0} report "COVERED2"; -- psl COVERAGE3 : cover {E_TEST1} report "COVERED3"; end architecture test;