module counter_t (
|
|
input Reset_n_i,
|
|
input Clk_i,
|
|
output [31:0] Data_o
|
|
);
|
|
|
|
|
|
`define INIT_VALUE 8
|
|
|
|
|
|
counter #(.Init(`INIT_VALUE)) counter_i (
|
|
.Reset_n_i(Reset_n_i),
|
|
.Clk_i(Clk_i),
|
|
.Data_o(Data_o)
|
|
);
|
|
|
|
|
|
reg init_state = 1;
|
|
|
|
// 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;
|
|
|
|
|
|
/*
|
|
// Don't works with Verific at the moment
|
|
initial begin
|
|
assume (!Reset_n_i);
|
|
end
|
|
*/
|
|
|
|
|
|
// Intermediate assertions
|
|
always @(*)
|
|
if (!Reset_n_i) assert (Data_o == `INIT_VALUE);
|
|
|
|
|
|
// Fail with unbounded prove using SMTBMC, maybe the assertions have to be more strict
|
|
// there have to be more restrictions.
|
|
// With abc pdr is can be successfully proved
|
|
assert property (@(posedge Clk_i) Data_o >= `INIT_VALUE && Data_o <= 64);
|
|
assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Data_o < 64 |=> Data_o == $past(Data_o) + 1);
|
|
assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Data_o == 64 |=> $stable(Data_o));
|
|
|
|
|
|
|
|
endmodule
|
|
|