always_combは便利なSystemVerilogのブロックですが、ちょっと意外な落とし穴があった。
自分用メモ。
always_comb begin
a = b;
b = c;
end
だと、bはセンシティビティリストに入らない。要注意。
a,bが出力ポートでlogicだと、書けてしまったりする。
上記のような記述は、そもそも怪しい記述ではあるけれど。
always_combは同じブロックでwriteした変数を中間変数とみなすらしい。
always_comb は常に入力から出力まで一直線の関数形式を意識すること、と、いつものDaveさんが言っていた。
https://verificationacademy.com/forums/systemverilog/sensitivity-list-alwayscomb-block
https://electronics.stackexchange.com/questions/343041/systemverilog-sensitivity-list-of-always-comb
問題はinterfaceで、
always_comb begin
a = INT.x;
INT.y = b;
end
のように書くと、これはINT全体がひとつの変数と認識されるらしく、INTがセンシティビティリストに入らないよ、という警告が等価性検証で警告される。
xが入力ポートで、yが出力ポートで意味的に全く問題がないにも関わらず、だ。
実際は、シミュレーターも分かっていて問題は出ない場合があるけど、厳密にはかなり危ない記述となる。
回避するには always @* を使うしかない。
結論:SystemVerilog のinterfaceは使わない。