研究で回路を作ってて、これをシミュレーションで確認して、うまく動作しそうだとFPGAに転送したらうまく動かない。
細かく確認して所々修正したが、それでも上手く動かない。
一体どういうことだ。
実はHDLのシミュレーションにはいくつかある。
これまでやってきたシミュレーションはビヘイビアレベルのシミュレーション。
Verilogで書いた回路の振る舞いについて検証していたわけだ。
ところがここでは回路の遅延などは考慮されていない。
A+Bという計算をする組み合わせ論理回路を作って、AとBに適当な信号を与えたらA+Bの結果が一瞬で出てくるが、
一瞬とはいえいくらか遅延することに違いはない。
遅延などの実際の回路も踏まえてシミュレーションするゲートレベルのシミュレーションがある。
じゃあなんでゲートレベルでシミュレーションしてこなかったのかという話だが、
これ時間がかなりかかるのよ。今日も動かしてたけど、恐ろしく時間がかかった。
一方でビヘイビアレベルのシミュレーションはそれなりの時間で済む。
これでいろいろな信号の状況が画面で一目でわかるのなら十分割に合う。
というわけでやってきたのだが、思わぬ盲点だったな。
ただ、ビヘイビアレベルでちゃんと動いてるのにゲートレベルでちゃんと動かないというのはけっこう厄介な話だよね。
論理合成の時にがんばってもらうしかないが、さてどうすればいいんだか。
とついさっき調べてたのだが、UCF制約に
NET "CLK_50MHZ" TNM_NET = "CLK_50MHZ"; TIMESPEC "TS_CLK_50MHZ" = PERIOD "CLK_50MHZ" 20 ns HIGH 50 %;
とか書けばがんばってくれるのだろうか。どうなのだろう。
あと一息なんですけどね。実際にやってみるとうまくいかんもんですわ。うーん、難しい。
プログラム書いてるのと事情は違うって事だ。まぁビヘイビアレベルではプログラムとさして変わらんが。