Vivado SimulatorのGSR

久しぶりにVivado Simulatorを使ってハマった。


FPGAのFFには明示的に配線するSet/Reset端子のほかに、GSR(global set/reset control)という配線が全てのFFに張ってあり、これをアサートすることでコンフィギュレーション時に設定した値にセット/リセットすることができる。
シミュレータでもこの挙動は再現されていて、最初の100nsはGSRがアサートされている状態かつ、ユーザーリセットより優先されるので、ユーザーリセットを解除しても動き出さない。
シミュレーションだから良いかとクロックを1ns(1GHz)で10サイクル後にリセット解除とかやっていたので、動かずに悩んだ。


GSRは解除が非同期的(すべてのセルが同時に解除されるとは限らない)以外は良い方法で、配線リソースも消費しないので、Xilinxはユーザーロジックリセットよりもこちらを推奨していたりする。
コンフィギュレーション時の初期値はreg変数の初期値として与えれば認識されるっぽい。
リセットが要らないregなんかにもリセットを書いてしまうのであまり使う用はないけど…