shtaxxx日記

コンピュータアーキテクチャについて研究している研究者の日記や技術紹介

Verilog HDLのgenerate文のスコープについて

Verilog HDLではgenerate文を使うことで変数やfunction文のスコープを定義することができる.

本当にfunction文にスコープが有効なのか気になったので,試してみる.

次のテスト用コードGENには3つのfunction testが定義されている.

  • GEN内で共通のfunction test
  • SCOPE_A内で定義されたfunction test
  • SCOPE_B内で定義されたfunction test
`default_nettype none

module GEN(OUT_A, OUT_B);
    output [3:0] OUT_A;
    output [3:0] OUT_B;
    assign OUT_A = SCOPE_A.w0;
    assign OUT_B = SCOPE_B.w0;
    
    function [3:0] test;
        input [3:0] in;
        test = in + 1;
    endfunction
    
    genvar i;
    generate begin : SCOPE_A
        function [3:0] test;
            input [3:0] in;
            test = in;
        endfunction
        wire [3:0] w0;
        assign w0 = test(4'b0001);
    end endgenerate
    
    generate begin : SCOPE_B
        function [3:0] test;
            input [3:0] in;
            test = ~in;
        endfunction
        wire [3:0] w0;
        assign w0 = test(4'b0001);
    end endgenerate
endmodule

module test_gen;
    parameter DUMPFILE = "uut.vcd";
    wire [3:0] OUT_A;
    wire [3:0] OUT_B;
    GEN uut (OUT_A, OUT_B);
    initial begin
        $dumpfile(DUMPFILE);
        $dumpvars(0, uut);
    end
    initial begin
        #1000;
        $finish;
    end
endmodule

スコープが有効ならば,

  • OUT_Aは4'b0001
  • OUT_Bは4'b1110

になるはず.

で,iverilogによるシミュレーションすると,ちゃんとスコープが有効であることが確認できる.