From 21b73eb187b41fabe52dffe1f7bb5a16cb407584 Mon Sep 17 00:00:00 2001 From: mole99 Date: Wed, 5 Jul 2023 16:23:15 +0200 Subject: [PATCH] Add test for parsing timing checks --- ivtest/ivltests/timing_check_syntax.v | 118 ++++++++++++++++++++++ ivtest/vvp_tests/timing_check_syntax.json | 4 + 2 files changed, 122 insertions(+) create mode 100644 ivtest/ivltests/timing_check_syntax.v create mode 100644 ivtest/vvp_tests/timing_check_syntax.json diff --git a/ivtest/ivltests/timing_check_syntax.v b/ivtest/ivltests/timing_check_syntax.v new file mode 100644 index 000000000..da2cc4f7a --- /dev/null +++ b/ivtest/ivltests/timing_check_syntax.v @@ -0,0 +1,118 @@ +// Check that various timing checks can be parsed + +module test; + + initial begin + $display("PASSED"); + end + + wire sig1, sig2, del_sig1, del_sig2, notifier, cond1, cond2; + + specify + $setup(posedge sig1 , negedge sig2 , 0:0:0); + $setup(negedge sig1 , posedge sig2 , 0:0:0); + $setup(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $setup(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $setup(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $setup(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $setup(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + + $hold(posedge sig1 , negedge sig2 , 0:0:0); + $hold(negedge sig1 , posedge sig2 , 0:0:0); + $hold(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $hold(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $hold(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $hold(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $hold(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + + $setuphold(posedge sig1 , negedge sig2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(negedge sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier, cond1 , cond2) ; + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier, cond1 , cond2 , del_sig1 , del_sig2 ) ; + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 , del_sig2 ) ; + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 , del_sig2 ) ; + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,,, del_sig2 ) ; + $setuphold(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 ,) ; + $setuphold(edge [10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier); + $setuphold(posedge sig1 , edge [10, x0, 1x] sig2 , 0:0:0 , 0:0:0 , notifier); + + $removal(posedge sig1 , negedge sig2 , 0:0:0); + $removal(negedge sig1 , posedge sig2 , 0:0:0); + $removal(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $removal(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $removal(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $removal(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $removal(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + + $recovery(posedge sig1 , negedge sig2 , 0:0:0); + $recovery(negedge sig1 , posedge sig2 , 0:0:0); + $recovery(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $recovery(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $recovery(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $recovery(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $recovery(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + + $recrem(posedge sig1 , negedge sig2 , 0:0:0 , 0:0:0); + $recrem(negedge sig1 , posedge sig2 , 0:0:0 , 0:0:0); + $recrem(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $recrem(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier, cond1 , cond2); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier, cond1 , cond2 , del_sig1 , del_sig2 ); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 , del_sig2 ); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 , del_sig2 ); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,,, del_sig2 ); + $recrem(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier,,, del_sig1 ,); + $recrem(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier); + $recrem(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , 0:0:0 , notifier); + + $skew(posedge sig1 , negedge sig2 , 0:0:0); + $skew(negedge sig1 , posedge sig2 , 0:0:0); + $skew(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $skew(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $skew(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $skew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $skew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + + $timeskew(posedge sig1 , negedge sig2 , 0:0:0); + $timeskew(negedge sig1 , posedge sig2 , 0:0:0); + $timeskew(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $timeskew(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , notifier); + $timeskew(posedge sig1, negedge sig2 , 0:0:0 , notifier); + $timeskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , notifier); + $timeskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , notifier); + // TODO $timeskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0); + // TODO $timeskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0); + // TODO $timeskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1); + + $fullskew(posedge sig1 , negedge sig2 , 0:0:0 , 0:0:0); + $fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 0:0:0); + $fullskew(posedge sig1 &&& cond1 == cond2 , posedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $fullskew(negedge sig1 &&& cond1 == cond2 , negedge sig2 &&& cond1 == cond2 , 0:0:0 , 0:0:0 , notifier); + $fullskew(posedge sig1, negedge sig2 , 0:0:0 , 0:0:0 , notifier); + $fullskew(edge[10, x0, 1x] sig1 , posedge sig2 , 0:0:0 , 0:0:0 , notifier); + $fullskew(posedge sig1 , edge[10, x0, 1x] sig2 , 0:0:0 , 0:0:0 , notifier); + // TODO $fullskew(posedge sig1 , negedge sig2 , 0:0:0, notifier , 1'b0); + // TODO $fullskew(negedge sig1 , posedge sig2 , 0:0:0 , 1'b1 , 1'b0); + // TODO $fullskew(negedge sig1 , posedge sig2 , 0:0:0 , , 1'b1); + + $width(posedge sig1 , 0:0:0 ); + $width(posedge sig1 &&& cond1 , 0:0:0 , 0 ); + $width(posedge sig1 &&& cond1 , 0:0:0 , 0 , notifier ); + $width(edge[10, x0, 1x] sig1 &&& cond1 , 0:0:0 ); + + $period(posedge sig1 , 0:0:0 ); + $period(negedge sig1 &&& cond1 , 0:0:0 , notifier ); + $period(edge[10, x0, 1x] sig1 &&& cond1 , 0:0:0 ); + + $nochange(posedge sig1 , posedge sig2 , 10 , 20 ); + $nochange(negedge sig1 &&& cond1 , posedge sig2 , 10 , 20 ); + $nochange(negedge sig1 , posedge sig2 &&& cond1 , 10 , 20 , notifier ); + $nochange(edge[10, x0, 1x] sig1 &&& cond1 , posedge sig2 , 10 , 20 ); + $nochange(posedge sig1 &&& cond1 , edge[10, x0, 1x] sig2 , 10 , 20 ); + + endspecify +endmodule diff --git a/ivtest/vvp_tests/timing_check_syntax.json b/ivtest/vvp_tests/timing_check_syntax.json new file mode 100644 index 000000000..8b6df22fa --- /dev/null +++ b/ivtest/vvp_tests/timing_check_syntax.json @@ -0,0 +1,4 @@ +{ + "type" : "normal", + "source" : "timing_check_syntax.v" +}