フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2006-8-31 1:29 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3088 |
VHDL->Verilog変換でいけた 菅原システムさんとこのVerlogシミュレータVeritakのVHDL->Verlog変換機能を使って万年カレンダーのVHDLソースをVerilog HDLに変換してみた。
ものの見事に瞬時に綺麗な意図した通りのソースコードができあがった。最初からそうすればよかった。でも最初に書いたのはVerlog HDL版だったような気がする。それをVHDLにハンドコンバージョンしたはず... できたVerilog HDLソースをコンパイルしてみるとVHDL版と同じようにXC95216-10-PQ160に入った。しかもVHDL版より高速! VHDL版が23.810MHzなのに対してVeritakで変換したVerilog版だと32.258MHz。 泣けてくる。 拙作オリジナルのVerilog版とVeritakでVHDL版からコンバートしたものを見比べると著しい違いは以下のようなものしかない。 ・出力信号と同じ名前でwireが宣言されている ・function isleapyearの戻り値の長さが明示的に1bitに宣言されている ・function定義が参照より後に置かれている(後方参照) ・function定義内ではreg変数を介して戻り値をセットしている。 ・出力信号の継続的代入で代入先が{}でくくられている ・関数戻り値の評価を明示的に同じ長さの定数と比較して行っている ・論理和(||)や論理積(&&)の代わりにbitwiseOR(|)やbitwiseAND(&)演算子を使っている もしかして最初と最後が秘密のKnowhowなのかも。 そこでまたオリジナルVerilog版ソースに戻してます出力信号に関するwire宣言を追加してみたが宣言してもしなくても結果は同じでこれはあまり意味がない模様。 次にfunction戻り値の長さを明示的に宣言してみた。これも影響無し。 後方参照も変わらず。 最後function内でのreg変数を使った間接的な戻り値の代入をやってみた。これによって論理合成に差異があらわれた、今まで閏年判定用のROMが8x2だったのがVHDL版と同じに8x1に圧縮された。 しかし結果は変わらず。 残り論理演算をbitwiseに書き換えても変わらず。 なんなんだ、と思ってVeritakで変換してソースを見てみるとselbcd functionのところのdefaultが空行になっている。 同じようにしてみたらやっとXC95216-10-PQ160に収まってくれた。 ということはキーポイントはcase文のdefault行で0〜13以外のdispselカウンター値の際の表示bcd値を固定値にしていたのをやめるだけでだいぶ論理が減ったということになる。むやみやたらdefault行を付けるのは考え物なのだろうか。 最高動作周波数はVHDL版と同じデフォルトの最適化指定でもやはり速くなる。 それで元々のVerilog版のソースでselbcdのdefault行を空行にすると新しい警告が出るが同じ大きさのデバイスに収まった。たったこれだけのことだったのか。 ただ警告が出ている通り最大動作周波数は遅くなっている。 何度も繰り返しコンパイルしているとどうやらISEがおかしくなってソースコードがエディタ上で変更できなくなってしまう。おろらくバグだろう。 ISEを立ち上げ直して今度はselbcdを内部でreg変数を使った間接的な戻り値代入に変えたところ驚くべき結果となった。 なんと一回り小さいXC95144-7-PQ100に収まってしまった上に更に39.216MHzと高速に動作するようになった。 この時点でまだ気になる警告が依然として残っている。 WARNING:Xst:737 - Found 1-bit latch for signal <$old_selbcd_/1/selbcd_3>. WARNING:Cpld:310 - Cannot apply TIMESPEC TS1000 = PERIOD:PERIOD_Mrom_bcddecode_1_bcddecode__cmp_eq0015$BUF2.CLKF:0.000 nS because of one of the following: (a) a signal name was not found; (b) a signal was removed or renamed due to optimization; (c) there is no path between the FROM node and TO node in the TIMESPEC. 結局他のfunctionもreg変数間接で戻り値を代入しても警告は出てXC95216-10-PQ160に収まる程度。これはもしかしたらあの盲腸みたいなゲート配列のことを指すのかな。 |
フラット表示 | 前のトピック | 次のトピック |
投稿するにはまず登録を | |