generate

generate позволяет дублировать экземпляры модуля или выполнять условное создание любого модуля. Используется, когда одну и ту же операцию или экземпляр модуля необходимо повторить несколько раз или если определенный код должен быть включен условно на основе заданных параметров Verilog.

Генерирующий блок не может содержать объявления порта, параметра, specparam или блоков specify. Однако другие элементы модуля и другие генерирующие блоки разрешены. Все генерирующие экземпляры кодируются внутри модуля и между ключевыми словами generate и endgenerate.

Сгенерированные экземпляры могут содержать модули, непрерывные назначения, всегда или начальные блоки и пользовательские примитивы. Существует два типа генерируемых конструкций: циклы и условные выражения.

generate-for

Переменная цикла должна быть объявлена с использованием ключевого слова genvar, которое означает, что эта переменная должна быть специально использована при разработке блока generate.

Пример

module ha(input   a, b, output  sum, cout);
  assign sum  = a ^ b;
  assign cout = a & b;
endmodule

module my_design #(parameter N=4) (input [N-1:0] a, b, output [N-1:0] sum, cout);
  genvar i;
  generate
    for (i = 0; i < N; i = i + 1) begin
      ha u0 (a[i], b[i], sum[i], cout[i]);
    end
  endgenerate
endmodule

module tb;
    parameter N = 2;
  reg  [N-1:0] a, b;
  wire [N-1:0] sum, cout;
  my_design #(.N(N)) md( .a(a), .b(b), .sum(sum), .cout(cout));

  initial begin
    a <= 0;
    b <= 0;

    $monitor ("a=0x%0h b=0x%0h sum=0x%0h cout=0x%0h", a, b, sum, cout);

    #10 a <= 'h2;
        b <= 'h3;
    #20 b <= 'h4;
    #10 a <= 'h5;
  end
endmodule

Результат исполнения

generate-if

Пример

Результат исполнения USE_CASE = 0

Результат исполнения USE_CASE = 2

generate-case

Результат исполнения USE_CASE = 0

Результат исполнения USE_CASE = 1

Результат исполнения USE_CASE = 2

Last updated