|
|
- library ieee;
- use ieee.std_logic_1164.all;
-
- use work.pkg.all;
-
-
- entity psl_fell is
- port (
- clk : in std_logic
- );
- end entity psl_fell;
-
-
- architecture psl of psl_fell is
-
- signal a, b, c : std_logic;
-
- begin
-
-
- -- 01234567890
- SEQ_A : sequencer generic map ("--__-_---__") port map (clk, a);
- SEQ_B : sequencer generic map ("_-__-_---__") port map (clk, b);
- SEQ_C : sequencer generic map ("__-__-___-_") port map (clk, c);
-
-
- -- All is sensitive to rising edge of clk
- default clock is rising_edge(clk);
-
- -- This assertion holds
- FELL_0_a : assert always (fell(a) -> c);
-
- -- This assertion holds
- FELL_1_a : assert always {a; not a} |-> fell(a);
-
- -- This assertion holds
- FELL_2_a : assert always (fell(a) -> (prev(a) and not a));
-
- -- Workaround needed before fell() is implemented
- -- With VHDL glue logic generating the
- -- previous value of a and simple comparing the two values
- d_reg : block is
- signal a_prev : std_logic := '0';
- begin
- process (clk) is
- begin
- if rising_edge(clk) then
- a_prev <= a;
- end if;
- end process;
- FELL_3_a : assert always (not a and a_prev -> c);
- end block d_reg;
-
- -- Another workaround by using simple SERE concatenation on LHS
- FELL_4_a : assert always {a; not a} |-> c;
-
- -- This assertion doesn't in formal tests
- -- in the 1st cycle. Problem is the value of
- -- a in the 0th cycle. So fell() can be safely
- -- used from the 2nd cycle on only
- FELL_5_a : assert always (fell(b) -> c);
-
- -- Stop simulation after longest running sequencer is finished
- -- Simulation only code by using pragmas
- -- synthesis translate_off
- stop_sim(clk, 11);
- -- synthesis translate_on
-
-
- end architecture psl;
|