Генерирующий блок нельзя использовать внутри всегда блока, но его нужно размещать снаружи. Таким образом, на самом деле есть возможность построить несколько различных всегда блоков и выбирать между ними с помощью конструкций Gene if.
Но, просто взглянув на данный код, я предлагаю использовать другой подход с использованием правильного среза с фиксированной шириной и гибким смещением:
if(CS_sel < N_DACS) begin
num <= mod_in[BITS*CS_sel +:BITS];
div <= mod_out[BITS*CS_sel +:BITS];
end else begin
//default stuff
num <= mod_in[BITS-1:0];
div <= mod_out[BITS-1:0];
end
Это работает, потому что оно эффективно похоже на
wire [BITS-1:0] subset0;
assign subset0 = mod_in >> (BITS*CS_sel);
[...]
num <= subset0[BITS-1:0];
Прямое использование чего-то вроде mod_in[(i+1)*BITS-1:i*BITS]
невозможно, поскольку теоретически это позволило бы использовать гибкую ширину, которую (стандартный) verilog пока не поддерживает, насколько мне известно.