今回,試行錯誤して遊んだメモなので,ワークフローではありません.いじくっているうちに慣れたり覚えたりしますよねぇ?.基礎知識が不足しているからこうして下積みを・・・(^^;
Post Route Simulationにて,配置配線で問題が生じたかを確認する.
Timing Constraintsの設定はClockしかしていない.設定不足か?
また,behavior simulationで得られた期待どおりの波形が見えない(出力信号).
ざっとまわして,いくつか出てきた.どれもこれもsetup time/hold time違反の模様.コレを見て,配置配線前にエラーが出ていなかったので,おかしいなぁと思いつつ,Warningのとり方を調べていた.
WARNING:Simulator:29 - at 6.000350773 ms: Warning: Timing violation in
/TST_BSC/uut/\TPU_1/TADD_buf_14 / $setuphold<setup>( I:6.000350768 ms,
CLK:6.000350773 ms,132.000 ps,48.000 ps)
WARNING:Simulator:29 - at 6.000350773 ms: Warning: Timing violation in
/TST_BSC/uut/\TPU_1/TADD_buf_15 / $setuphold<setup>( I:6.000350736 ms,
CLK:6.000350773 ms,132.000 ps,48.000 ps)
WARNING:Simulator:29 - at 6.000380773 ms: Warning: Timing violation in
/TST_BSC/uut/\RAM1K_1/RAMB16_S18_inst / $setuphold<setup>( ADDR:6.000380571
ms, CLK:6.000380773 ms,377.000 ps,131.000 ps)
WARNING:Simulator:29 - at 6.000380839 ms: Warning: Timing violation in
/TST_BSC/uut/\RAM1K_1/RAMB16_S18_inst / $setuphold<hold>( CLK:6.000380773
ms, ADDR:6.000380839 ms,377.000 ps,131.000 ps)
半日以上うろうろしていたけれども,最終的には問題ないという見解に落ち着く.おそらくskewにより,使用しない信号を拾うタイミングで発生していると思われる.ポートから受けたデータをDFFでラッチし,その次のサイクルで内部の所望のレジスタへと転送するように実装してある.ところが,今回の箇所は,ポートからラッチするタイミングでviolation警告が出る.DFFにラッチするタイミングがわずかに早くなり,その後段にあるDFFへと信号が先行してしまって,posedge CLKが入ったのではないだろうか.
裏づけを取るにはシミュレーション時に該当信号をモニタする必要があるわけだが,その手段についてもわからなかった(現在進行形).
とりあえず,検証モジュール(タスク)で,インスタンス名をドットでつないで内部信号をassignして観測しようとしています.が,なんだか調子悪いような・・・.DCMを使っているせいもあり,5mSec強の待ち時間を作りこんでしまった.当該回路を取り去ると挙動が変わる恐れもあり,実行していない.
合成/シミュレーションデザイン ガイド
WARNING:Simulator:29 - at 6.000350773 ms: Warning: Timing violation in
/TST_BSC/uut/\TPU_1/TADD_buf_15 / $setuphold<setup>( I:6.000350736 ms,
CLK:6.000350773 ms,132.000 ps,48.000 ps)
clock skewによるwarningと判断する.SHからのWRアサート→ネゲートを検出して,データをラッチして,次のCLKでTPU moduleに書き込み要求を出す.(module向けのWRはネゲートされたまま.DFFの貫通が起きればその限りではない?が,次のCLKで書きにいくのでおk.bufferにしてあるから1clk間化けても大丈夫)
シミュレーションに時間を要していた件,DCM出力が出てこないのは時間のせいと思い込んでいましたが,リセットがかかっていなかった模様.
リセット信号がnegedgeなのにt=0から0で100nSecおいて1にしてました.そりゃ非同期リセットかからない罠('A`.
次に,timing violation.下位モジュールで別クロックを作ってしまっていました.同じクロックと期待して表示させたのに0.7nSecもずれている.10nSec周期なので,7%誤差ですね.コレを削ればviolationも消えるかもしれませんし,そもそも非同期になっていては設計想定が崩れます.
DCMにするか,クロックバッファを通してやるのが無難でしょうかねぇ.DCMもったいないかな・・・?分周して同窓にあわせようとすれば,これしかないか.出力にDFFかましても位相ずれるには変わりないしねぇ.