|
|
@ -13,21 +13,28 @@ end entity psl_fell; |
|
|
|
|
|
|
|
architecture psl of psl_fell is |
|
|
|
|
|
|
|
signal a, b : std_logic; |
|
|
|
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_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) -> b); |
|
|
|
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 |
|
|
@ -41,11 +48,17 @@ begin |
|
|
|
a_prev <= a; |
|
|
|
end if; |
|
|
|
end process; |
|
|
|
FELL_1_a : assert always (not a and a_prev -> b); |
|
|
|
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_2_a : assert always {a; not a} |-> b; |
|
|
|
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 |
|
|
|