- module counter_t (
- input Reset_n_i,
- input Clk_i,
- output [31:0] Data_o
- );
-
-
- `define INITVAL 8
- `define ENDVAL 64
-
-
- counter #(
- .InitVal(`INITVAL),
- .EndVal(`ENDVAL)
- ) counter_i (
- .Reset_n_i(Reset_n_i),
- .Clk_i(Clk_i),
- .Data_o(Data_o)
- );
-
-
- reg init_state = 1;
- (* gclk *) wire gbl_clk;
-
- // Initial reset
- always @(*) begin
- if (init_state) assume (!Reset_n_i);
- if (!init_state) assume (Reset_n_i);
- end
-
- always @(posedge Clk_i)
- init_state = 0;
-
- // Generate global clock
- global clocking
- @(posedge gbl_clk);
- endclocking
-
- // Use global clock to constrain the DUT clock
- always @($global_clock) begin
- assume(Clk_i != $past(Clk_i));
- end
-
- // Immediate assertions
- always @(*)
- if (!Reset_n_i) assert (Data_o == `INITVAL);
-
- // Fails with unbounded prove using SMTBMC, maybe
- // the assumptions/assertions have to be more strict.
- // With abc pdr this can be successfully proved.
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Data_o < `ENDVAL |=> Data_o == $past(Data_o) + 1);
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Data_o == `ENDVAL |=> $stable(Data_o));
- assert property (@(posedge Clk_i) Data_o >= `INITVAL && Data_o <= `ENDVAL);
-
-
- endmodule
-
|