Lo primero que hay que recordar es que un "reg" de Verilog no siempre representa un registro, que represente o no un registro depende de cómo se utilice.
El autor de este código ha implementado la máquina de estado utilizando dos bloques always separados. La lógica de la máquina de estado está representada por un bloque siempre combinatorio mientras que un bloque siempre secuencial representa los registros. Esta estructura significa que necesita registros Verilog para representar tanto las entradas "_d" como las salidas "_q" de sus registros.
La ventaja de esta estructura es que permite que la máquina de estados tenga salidas combinatorias. Si pones la lógica de la máquina de estado en un bloque siempre secuencial entonces todas las salidas de esa lógica deben ser registradas.
Ahora, en este caso particular, parece que todas las salidas son registrado, por lo que podría haber puesto la lógica en un bloque siempre secuencial, pero sospecho que a algunas personas les resulta más fácil ceñirse a un estilo consistente aunque dicho estilo sea más verboso de lo necesario en la mayoría de los casos. Traducir una máquina de estado de un solo bloque siempre a un estilo de dos bloques siempre porque descubriste que de hecho necesitabas una salida combinatoria no es divertido.
Tiene dos registros de estado para que pueda tener un único estado de "espera" que puede llevar a múltiples estados siguientes diferentes después de que la espera haya terminado.
Dos registros de estado, cada uno con un "reg" Verilog separado para su entrada y salida hacen cuatro "reg" Verilog.