0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

always_combのセンシティビティリストの罠

Posted at

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は使わない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?