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);