開発日記

Erlangをダラダラ書きます。

Verilog function文 注意点

function文の入力信号

function文は入力信号を省略した記述が可能だが,そこには落とし穴がある.

下記の2項目に注意

  • function文で入力信号として定義していない信号を使用すると,モジュール内にある同じ名前の信号を参照する.

  • function文内の評価はfunction文で入力信号として定義した信号のいずれかに変化があった場合に限られる.

→ もし入力信号として定義しなかった信号に変化があってもfunction文の評価は行われない...

例えば,マルチプレクサを定義した時,「選択信号しかfunction文に渡さない」という定義の仕方をすると,入力信号の変化は無視されてしまう. 入力信号の変化も見てほしい!

悪い例

input [1:0] sel;
input [3:0] input0, input1, input2, input3;
output [3:0] out;

function [3:0] mux;
    input [1:0] s;
    begin
        case(s)
            0                    :  mux  =  input0;
            1                    :  mux  =  input1;
            2                    :  mux  =  input2;
            3                    :  mux  =  input3;
            default              :  mux  =  4'd0;
        endcase
    end
endfunction

assign out = mux(sel);

良い例

input [1:0] sel;
input [3:0] input0, input1, input2, input3;
output [3:0] out;

function [3:0] mux;
    input [1:0] s;
 input [3:0] in0, in1, in2, in3;
    begin
        case(s)
            0                    :  mux  =  in0;
            1                    :  mux  =  in1;
            2                    :  mux  =  in2;
            3                    :  mux  =  in3;
            default              :  mux  =  4'd0;
        endcase
    end
endfunction

assign out = mux(sel, input0, input1, input2, input3);

今回の教訓: 出力に関係する信号は全て定義しよう!