'How to change a register value without adding it to the sensitivity list?

module main(input A, B, C,button,clk100mhz,output [7:0]seg,[7:0]an);
    reg [3:0] D0;
    reg [3:0] D1;
    reg [3:0] D2;
    reg [7:0] Y;
    DISP7SEG m1 (clk100mhz, D0, D1, D2, 4'b0000,4'b0000,4'b0000,4'b0000,4'b0000, 1'b0, 1'b0, 1'b0,1'b0,1'b0, 1'b0, seg, an);
    always@(button)
    begin
        if (button)
        if (A+B+C == 1'b1)//only one switch 
        if (Y < 7'd75)
        begin
            Y = Y + {A,B,C} * 5'd25;
            D0 = Y      % 10;
            D1 = (Y/10)  %10;
            D2 = (Y/100) %10;
        end
    end
endmodule

this is supposed be a basic adder up to 75 with a multiplication by 25 at every step

for example if ABC is 001 I should get 25 -> 50 -> 75 in reg Y after every button press, the problem is that xilinx ISE gives this error

WARNING:HDLCompiler:91 - "main.v" Line 33: Signal Y missing in the sensitivity list is added for synthesis purposes. HDL and post-synthesis simulations may differ as a result.

so it becomes an infinite loop every time Y is changed it triggers the always block and changes it again and so on How am I supposed to do this without triggering this error or to somehow stop the tool from adding it to the sensitivity list



Solution 1:[1]

As @toolic and @Serge said, you need to use a clocked always block. Take a look at this article: https://www.chipverify.com/verilog/verilog-always-sequential-logic

The always block should be sensitive to (posedge clk100mhz). Every rising edge of the clock, it will run and increment Y if all your "if" conditions are met.

Then Y will increment for every clock that button is held down. This probably isn't the desired behavior so consider adding some logic that only triggers once for each button press.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1