フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2006-5-28 4:38 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3094 |
Verilog HDLではまる ふと思い立って万年時計のデザインをAHDLから今風にVerilog HDLに書き直してみることに。
しかしはまった。 Verilog HDLはC言語ぽいかと思ってよく文法とか調べずに機械的に書き直してみたところ、最後に余分にendをつけないと怒られてしまう。 使ったツールはMAX+PLUS II Advanced Syhnthesisという無償でダウンロードできるMAX+PLUS II用のVerilog/VHDLコンパイラーである。 原因はVerilogとAHDLのIF構文の決定的な違いにあった。AHDLはIF ELSIF ELSE ENDIFと少し複雑な条件が記述できるが、VerilogはIF ELSEしかない。従ってC言語のようにIF ELSE IF ELSE IF...ELSEとかいう感じで複数の条件分岐を書こうとするととんでもない間違いを犯してしまう。 IF (式) 文; ELSE IF (式) 文; ELSE IF (式) 文; ELSE 文; と書くとVerilogでは以下のように解釈されることがやっと理解できた。 IF (式) 文; ELSE begin IF (式) 文; ELSE begin IF (式) 文; ELSE 文; end end これでは意図したのとまるで違う。Verilogでは複雑にIF構文をネストするのは鬼門らしい。しかたなくbegin endブロックで明示的に文の評価順序が決まるようにしてようやく意図した通りの論理を合成することができるようになった。 この副産物として実は万年時計にバグがあったことが判明。確認してはいないが、30日しかない月で日の下1桁が9以外の日の日替わりで日付が変わらないようだ。その条件の論理がすっぽり抜けていた。 Verilogで合成したデザインをダウンロードして動くのを確認したが、そのVerilogソースをQuartus IIでコンパイルするとなんとコンパイラが途中で異常終了してしまう。その前に簡単にテストしたjyankenunitでは試してなかったのでやってみると、簡単な組み合わせ倫理だけのファイルだが同じように最後の最後でこけてしまう。 なにか設定がまずいのか、それともQuartus IIのバグなのか。そういえば内藤さんのautosigはVHDLで書かれていてそれはQuartus IIでコンパイルされているのでVHDLならよかったのか。 Verilogから手をつけたのがまずかったか。 |
フラット表示 | 前のトピック | 次のトピック |
投稿するにはまず登録を | |