Можно ли повторить ворота в структурном verilog? - PullRequest
0 голосов
/ 16 мая 2019

Я собираюсь каскадировать несколько буферов в Verilog. Ниже приведен мой пример, в котором я определил 16 буферов, которые каскадируются в структурном определении:

BUFX12 BUF01(dummy_wire[1],N62878);
BUFX12 BUF02(dummy_wire[2],dummy_wire[1]);
BUFX12 BUF03(dummy_wire[3],dummy_wire[2]);
BUFX12 BUF04(dummy_wire[4],dummy_wire[3]);
BUFX12 BUF05(dummy_wire[5],dummy_wire[4]);
BUFX12 BUF06(dummy_wire[6],dummy_wire[5]);
BUFX12 BUF07(dummy_wire[7],dummy_wire[6]);
BUFX12 BUF08(dummy_wire[8],dummy_wire[7]);
BUFX12 BUF09(dummy_wire[9],dummy_wire[8]);
BUFX12 BUF10(dummy_wire[10],dummy_wire[9]);
BUFX12 BUF11(dummy_wire[11],dummy_wire[10]);
BUFX12 BUF12(dummy_wire[12],dummy_wire[11]);
BUFX12 BUF13(dummy_wire[13],dummy_wire[12]);
BUFX12 BUF14(dummy_wire[14],dummy_wire[13]);
BUFX12 BUF15(dummy_wire[15],dummy_wire[14]);

Поскольку я собираюсь изменить количество буферов в своем проекте теста, я ищу синтаксис, такой как цикл for, для реализации структуры ниже в автоматическом формате, но я не знаю правильную структуру для этого. Я хочу знать, возможно ли это и каков правильный синтаксис. Кроме того, было бы лучше, чтобы у реализации были имена для экземпляров.

Ответы [ 2 ]

4 голосов
/ 16 мая 2019

Использовать массив экземпляров:

wire [15:1] other = {dummy_wire[14:1], N62878};
BUFX12 BUF [15:1] (dummy_wire, other);
3 голосов
/ 16 мая 2019

Вы можете использовать цикл генерации, если хотите, но массив решений для экземпляров, предлагаемый @toolic, более компактен:

  assign dummy_wire[0] = N62878;

  generate
    genvar g;
    for (g=1; g<16; g=g+1)
      begin : in_Verilog_2001_you_need_this_and_it_needs_a_name
        BUFX12 BUF(dummy_wire[g],dummy_wire[g-1]);
      end
  endgenerate

Verilog-2005 ослабил правила, касающиеся generate.Это допустимо в Verilog-2005:

  assign dummy_wire[0] = N62878;

  genvar g;
  for (g=1; g<16; g=g+1)
    BUFX12 BUF(dummy_wire[g],dummy_wire[g-1]);

А в SystemVerilog вы можете привести в порядок немного больше:

  assign dummy_wire[0] = N62878;

  for (genvar g=1; g<16; g++)
    BUFX12 BUF(dummy_wire[g],dummy_wire[g-1]);

Но лично мне нравится версия Verilog-2001: это более явно.

MCVE :

module M;

  wire [15:0] dummy_wire;
  wire N62878;

  assign dummy_wire[0] = N62878;

  generate
    genvar g;
    for (g=1; g<16; g=g+1)
      begin : in_Verilog_2001_you_need_this_and_it_needs_a_name
        BUFX12 BUF(dummy_wire[g],dummy_wire[g-1]);
      end
  endgenerate

endmodule

https://www.edaplayground.com/x/YWw

...