From c1cfca8f54ba75c455580467223b609b72f0f58c Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 27 Jul 2017 14:05:09 +0200 Subject: [PATCH] Improve Verific SVA importer --- frontends/verific/verific.cc | 34 ++++++++++++++++++++++++++++++++++ tests/sva/counter.sv | 15 ++++++++------- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/frontends/verific/verific.cc b/frontends/verific/verific.cc index 5f7d973a9..e56d4531e 100644 --- a/frontends/verific/verific.cc +++ b/frontends/verific/verific.cc @@ -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()); diff --git a/tests/sva/counter.sv b/tests/sva/counter.sv index 5e4b77e69..4f949115e 100644 --- a/tests/sva/counter.sv +++ b/tests/sva/counter.sv @@ -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 -- 2.30.2