Empty statements in Verilog’s if-else are OK
A reminder to self: As the title implies, it’s OK to have an empty statement in Verilog. This is useful in order to make all the following clauses active only if the first condition isn’t met. This is commonly seen in C, but I wasn’t sure if it’s OK to do this in Verilog too. So it is.
So this is fine, for example:
always @(posedge clk)
if (relax)
; // Do nothing.
else if (this_condition)
do_this <= do_this + 1;
else if (that_condition)
do_that <= do_that + 1;
This is backed up by the IEEE standard 1364-2001 (standard Verilog), which says in Syntax 9-4:
conditional_statement ::= if ( expression ) statement_or_null [ else statement_or_null ] | if_else_if_statement
And then defines in section A.6.4:
statement ::= { attribute_instance } blocking_assignment ; | { attribute_instance } case_statement | { attribute_instance } conditional_statement | { attribute_instance } disable_statement | { attribute_instance } event_trigger | { attribute_instance } loop_statement | { attribute_instance } nonblocking_assignment ; | { attribute_instance } par_block | { attribute_instance } procedural_continuous_assignments ; | { attribute_instance } procedural_timing_control_statement | { attribute_instance } seq_block | { attribute_instance } system_task_enable | { attribute_instance } task_enable | { attribute_instance } wait_statement statement_or_null ::= statement | { attribute_instance } ;
Those attribute_instance are irrelevant, in particular as they are optional.