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

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния

a=0x0 b=0x0 sum=0x0 cout=0x0
a=0x2 b=0x3 sum=0x1 cout=0x2
a=0x2 b=0x0 sum=0x2 cout=0x0
a=0x1 b=0x0 sum=0x1 cout=0x0

generate-if

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

module mux_assign(input a, b, sel, output out);
  assign out = sel ? a : b;
  initial $display ("mux_assign is instantiated");
endmodule

module mux_case(input a, b, sel, output reg out);
  always @ (a or b or sel) begin
    case (sel)
      0 : out = a;
      1 : out = b;
    endcase
  end
  initial $display ("mux_case is instantiated");
endmodule

module my_design(input a, b, sel, output out);
  parameter USE_CASE = 0;
  generate
    if (USE_CASE)
      mux_case mc (.a(a), .b(b), .sel(sel), .out(out));
    else
      mux_assign ma (.a(a), .b(b), .sel(sel), .out(out));
  endgenerate
endmodule

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния USE_CASE = 0

mux_assign is instantiated

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния USE_CASE = 2

mux_case is instantiated

generate-case

module mux_assign(input a, b, sel, output out);
  assign out = sel ? a : b;
  initial $display ("mux_assign is instantiated");
endmodule

module mux_case(input a, b, sel, output reg out);
  always @ (a or b or sel) begin
    case (sel)
      0 : out = a;
      1 : out = b;
    endcase
  end
  initial $display ("mux_case is instantiated");
endmodule

`define ASSIGN 0
`define CASE 1

module my_design(input a, b, sel, output out);
  parameter USE_CASE = 0;
  generate
    case (USE_CASE)
      `ASSIGN: begin
        mux_assign ma (.a(a), .b(b), .sel(sel), .out(out));
      end
      `CASE: begin
        mux_case mc (.a(a), .b(b), .sel(sel), .out(out));
      end
      default: begin
        mux_case mc (.a(a), .b(b), .sel(sel), .out(out));
      end
    endcase
  endgenerate
endmodule

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния USE_CASE = 0

mux_assign is instantiated

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния USE_CASE = 1

mux_case is instantiated

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния USE_CASE = 2

mux_case is instantiated

Last updated