SystemVerilogで回路記述をしていて、引っかかったところのメモ:
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