D. assert property (@(posedge clk) valid ##3 valid);
Solution
Step 1: Understand the requirement
The signal 'valid' must stay high for exactly 3 clock cycles after it goes high, then go low.
Step 2: Analyze each assertion
assert property (@(posedge clk) valid |-> valid ##1 valid ##1 !valid); uses '|->' implication and timing control to check 'valid' at current cycle, then stays high for 2 more cycles, then low at the 4th cycle, matching exactly 3 cycles high.
Step 3: Eliminate incorrect options
assert property (@(posedge clk) valid |-> ##1 valid ##1 valid ##1 !valid); checks 4 cycles high (3 ##1 delays plus !valid at 4th). assert property (@(posedge clk) valid |-> ##3 valid); checks only after 3 cycles, not duration. assert property (@(posedge clk) valid ##3 valid); lacks implication operator and timing control.