I feel like something is fundamentally broken with my simulation setup and I have no clue what it is.
Look at stage3_en here. There are no negedge clocked blocks in my RTL.
This is a simple always_ff @(posedge clk) stage3_en <= stage2_en;
How is this even possible???