Improve Verific SVA importer
authorClifford Wolf <clifford@clifford.at>
Thu, 27 Jul 2017 12:05:09 +0000 (14:05 +0200)
committerClifford Wolf <clifford@clifford.at>
Thu, 27 Jul 2017 12:05:09 +0000 (14:05 +0200)
frontends/verific/verific.cc
tests/sva/counter.sv

index 5f7d973a987409b4833422e1944f4d4748945bf9..e56d4531e12d7e183f6256ba1fc8f16b3c672a30 100644 (file)
@@ -1275,6 +1275,40 @@ struct VerificSvaImporter
                        return;
                }
 
+               if (inst->Type() == PRIM_SVA_SEQ_CONCAT)
+               {
+                       int sva_low = atoi(inst->GetAttValue("sva:low"));
+                       int sva_high = atoi(inst->GetAttValue("sva:low"));
+
+                       if (sva_low != sva_high)
+                               log_error("Ranges on SVA sequence concatenation operator are not supported at the moment.\n");
+
+                       parse_sequence(seq, inst->GetInput1());
+
+                       for (int i = 0; i < sva_low; i++)
+                               sequence_ff(seq);
+
+                       parse_sequence(seq, inst->GetInput2());
+                       return;
+               }
+
+               if (inst->Type() == PRIM_SVA_CONSECUTIVE_REPEAT)
+               {
+                       int sva_low = atoi(inst->GetAttValue("sva:low"));
+                       int sva_high = atoi(inst->GetAttValue("sva:low"));
+
+                       if (sva_low != sva_high)
+                               log_error("Ranges on SVA consecutive repeat operator are not supported at the moment.\n");
+
+                       parse_sequence(seq, inst->GetInput());
+
+                       for (int i = 1; i < sva_low; i++) {
+                               sequence_ff(seq);
+                               parse_sequence(seq, inst->GetInput());
+                       }
+                       return;
+               }
+
                if (!importer->mode_keep)
                        log_error("Unsupported Verific SVA primitive %s of type %s.\n", inst->Name(), inst->View()->Owner()->Name());
                log_warning("Unsupported Verific SVA primitive %s of type %s.\n", inst->Name(), inst->View()->Owner()->Name());
index 5e4b77e69a601c3d3c67d99da6e0b3b9bb268160..4f949115ef53d6f3c38114e359ab4a30fda30454 100644 (file)
@@ -11,19 +11,20 @@ module top (input clk, reset, up, down, output reg [7:0] cnt);
        default clocking @(posedge clk); endclocking
        default disable iff (reset);
 
-       assert property (up |=> cnt == $past(cnt) + 8'd1);
-       // assert property (up [*2] |=> cnt == $past(cnt, 2) + 8'd2);
-       // assert property (up ##1 up |=> cnt == $past(cnt, 2) + 8'd2);
+       assert property (up |=> cnt == $past(cnt) + 8'd 1);
+       assert property (up [*2] |=> cnt == $past(cnt, 2) + 8'd 2);
+       assert property (up ##1 up |=> cnt == $past(cnt, 2) + 8'd 2);
 
 `ifndef FAIL
        assume property (down |-> !up);
 `endif
-       assert property (down |=> cnt == $past(cnt) - 8'd1);
+       assert property (up ##1 down |=> cnt == $past(cnt, 2));
+       assert property (down |=> cnt == $past(cnt) - 8'd 1);
 
        property down_n(n);
-               down [*n] |=> cnt == $past(cnt, n) + n;
+               down [*n] |=> cnt == $past(cnt, n) - n;
        endproperty
 
-       // assert property (down_n(3));
-       // assert property (down_n(5));
+       assert property (down_n(8'd 3));
+       assert property (down_n(8'd 5));
 endmodule