Создать оператор внутри всегда блока, это возможно? - PullRequest
0 голосов
/ 10 мая 2019

Мне бы хотелось узнать больше информации о операторах Generate. Я знаю, что вы можете реплицировать модули и всегда блокировать (как в другом посте), но возможно ли создать параметризованный случай, подобный этому?

always @ (negedge clk) 
 begin
if (state==1)
  begin
     case(CS_sel)
    begin
        generate
           genvar i;
           for (i=0; i<N_DACS; i=i+1)
         begin: for1
            i:begin
               num <= mod_in[(i+1)*BITS-1:i*BITS];
               div <= mod_out[(i+1)*BITS-1:i*BITS];
            end // i:
             end    // for1
        endgenerate
        default: begin
           num <= mod_in[BITS-1:0];
           div <= mod_out[BITS-1:0];
        end // default
    end  // case (CS_sel)
     endcase // case (CS_sel)
  end // if (state==1)
  end // always

Прежде всего, я хотел бы знать, возможно ли это и как я могу это сделать,

После этого, если вам известен другой вариант создания синхронного мультиплексора в verilog, было бы здорово!

Спасибо!

1 Ответ

1 голос
/ 13 мая 2019

Генерирующий блок нельзя использовать внутри всегда блока, но его нужно размещать снаружи. Таким образом, на самом деле есть возможность построить несколько различных всегда блоков и выбирать между ними с помощью конструкций 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 пока не поддерживает, насколько мне известно.

...