FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

SystemVerilogにおけるInterface内の関数を使うときのセンシティビティ・リストの考慮事項

SystemVerilogで回路記述をしていて、引っかかったところのメモ:

www.edaplayground.com

SystemVerilogのInterface内でFunctionを定義した場合、これを使う場合には注意が必要だ。

interface interface_counter;
logic valid;
logic [ 3: 0] counter;

function automatic logic is_full();
  return valid & (&counter);
endfunction // is_full

modport master (output valid, counter, import is_full);
modport slave  (input  valid,          import is_full);

endinterface // interface_counter

上記のlogic_is_full()を、インタフェースを通じてassignで接続した場合、Verilogの記述的に正しく信号が伝搬できないようだ(論理合成して正しい回路が出てくるかはわからない)。

// これではcounter_is_fullの値は正しく更新されない
assign counter_is_full = counter_if.is_full();

これは、functionが動作するセンシティビティ・リストが正しくリストアップできないのが問題で、インタフェース内の信号が切り替わったとしても、それに応じて関数の出力がアップデートされるとは限らないからだ。 この場合は、always_combを使用する必要がある。

always_comb begin
  counter_is_full = counter_if.is_full();
end