ちょっとVerilogのSpecify記述をいろいろチェックする機会があったので、ここでまとめておく。
VerilogのSpecifyブロック内では、主にセットアップ時間、ホールド時間などを記述するが、それ以外にもさまざまな制約条件などを指定することが出来る。
specify // タイミング制約事項など記述する。 $setup (posedge clk, ...); endspecify
specifyブロックには、以下のような制約チェックタスクを記述することが出来る。
以下の記事を参考にした。
- $setup (data_event, reference_event, limit[, notifier]) ;
- $skew (reference_event, data_event, limit[,notifier]) ;
- $hold (reference_event, data_event, limit[,notifier]) ;
- $recovery (reference_event, data_event, limit, [notifier]) ;
- $setuphold (reference_event, data_event, setup_limit, hold_limit, [notifier]) ;
- $width (reference_event, limit, threshold [,notifier]) ;
- $period (reference_event, limit[,notifier]) ;
- $nochange (reference_event, data_event, start_edge_offset, end_edge_offset [,notifier]) ;
setup
セットアップタイムの制約を記述する。データのFFへの到着がリファレンスイベントのある一定時間よりも前に完了しておく必要があるというもの。 以下の図において、赤の期間にデータを変化させることは禁止となる。
以下の条件を満たした場合、違反となる。
(time of reference event) - (time of data event) < limit
skew (reference_event, data_event, limit[,notifier]) ;
以下の条件を満たした場合、違反となる。
(time of data event) - (time of reference event) > limit
クロック間のタイミング調整についての制約となる。あるデータのエッジに対して、それを受け取るクロックのエッジがずれている場合に違反となる。
hold (reference_event, data_event, limit[,notifier]) ;
以下の条件を満たした場合、違反となる。
(time of data event) - (time of reference event) < limit
リファレンスのクロックに対して、データの到着が早すぎる場合、hold違反となる。通常これはFFの付きぬけを防止するためのもので、hold違反となった場合はバッファなどを挿入して遅延を挿入する。
以下の図において、赤の期間にデータを変化させることは禁止となる。
recovery (reference_event, data_event, limit, [notifier]) ;
以下の条件を満たす場合に違反となる。等式としてはholdと同一だが、使い分けがあるのだろうか?また、reference eventはエッジトリガでなければならない。
(time of data event) - (time of reference event) < limit
setuphold (reference_event, data_event, setup_limit, hold_limit, [notifier]) ;
setupタイムとholdタイムを同時にチェックする。
width (reference_event, limit, threshold [,notifier]) ;
リファレンスイベントの間隔をチェックする。以下を条件を満たした場合、違反となる。data eventは明示されていないが、デフォルトでは、reference eventの逆エッジとなる。 つまり、あるエッジから逆エッジまでの期間が、threasholdよりも大きく、limitよりも小さい場合に、違反となる。
threshold < (time of data event) - (time of reference event) < limit
period (reference_event, limit[,notifier]) ;
等式としてはrecovery, holdと同一である。ある信号が十分に長いかどうかをチェックしている。
(time of data event) - (time of reference event) < limit
nochange (reference_event, data_event, start_edge_offset, end_edge_offset [,notifier]) ;
data_eventが、start_edge_offsetから、end_edge_offsetの間に変化した場合に、違反がレポートされる。