2013年2月16日土曜日

開発環境等

今週はジオメトリ演算関係を書籍やインターネットから入手した資料から勉強しながら、PC環境の整備や、Android OSのお勉強も始めようと思ってAndroid OSのビルドに挑戦したりを片手間でやったものだから、色々とハマってしまった。

・開発環境
私は自宅では専らLinux OS (現在は Linux Mint 64bit版)を使っている。当然、FPGAの開発環境やシミュレーション環境もLinux OS上だ。 FPGA開発ツールは、 一応、XilinxのISE(含むplanAhead, Vivado)、ALTERAのQuartus、LatticeのDiamondはインストールしてある。私はどちらかと言えばXilinxのFPGAの愛用派(といっても仕事ではFPGAは触っていないので、あくまで趣味上の話)だが、宗教みたいに特定メーカに拘るのはあまり意味がないと考えていて、ALTERAのデバイスもLatticeのデバイスも使いたいと考えている。それに、実際各社の開発ツールやデバイスを使ってみても、それほど大きな差異を感じた事はない、強いて例えればSpartan3とSpartan6程度の違いじゃないだろうか。もっとも、私の場合、ツールの機能として使用しているのは合成からビットストリーム生成までの必要最小限の機能だけなので、差異を感じにくいのかもしれない。  FPGA Editor等のバックエンド的なツールのお世話になることも滅多にないし(決して使えないわけではない。)、ChipscopeやSignalTap等に頼るようになったら負けだと思っている。。。(なんのこっちゃ) 必要最小限の合成制約とDefaultのツールオプションで最高性能を出せる回路記述を出きるようになることが自分自身のテーマだ。キリッ、(再び、なんのこっちゃ) 

ツール類は、/usr/local/edaというディレクトリ下に配置するようにしており、各ツールとも1~2世代前迄のバージョンは残すようにしている。

これらのツール全てを同時に使うことは無いので、環境変数やパスの設定も必要に応じてそれぞれのツール用に行うようにしている。 具体的には各ツール用の設定スクリプトをscriptディレクトリに配置しておいて、必要な時に必要なスクリプトをsourceするようにしている。


Xilinxの場合はインストールディレクトリ・ISE_DS下に標準のスクリプト settings[32|64].[sh|csh]があるが、以下のように若干の変更を加えて使用している。

具体的な変更点は、オリジナルのスクリプトはスクリプトがインストールディレクトリにあることが前提で作成されていて、XIL_SCRIPT_LOCの決定に面倒くさい処理をしているが、これをコメントアウトして、ベタ書きで値(/usr/local/eda/Xilinx/14.4/ISE_DS)を入れるようにしているのと、最下行にsetenv DISPLAY  :0を追加している点だ。 DISPLAY変数の設定はスタンドアローン環境でFPGA Editorを使用する場合に必要で、これを設定しておかないと起動してくれない。ネットワーク越しで使用する場合は逆に悪さする可能性もあるが、自分の環境ではそんな使い方はしないのでこのようにベタ書きしている。

Latticeの場合もインストールディレクトリ・diamond/x.y/bin/lin64/下に標準のスクリプト setupenvがあるが、これも以下のように若干の変更を加えて使用している。

具体的には、set bindir=`pwd`をコメントアウトして、ベタ書きでパス名を設定している。

ALTERA用のスクリプトは以下のようになっている。


Icarus verilog, gtkwave, gpl-cver用のスクリプトはそれぞれ以下のようになっている。

これらのツールには非常に愛着があり、ツールが公開され出した頃からだから、もう10年以上も使い続けている。  gtkwave等は出始めの頃はnull pointer参照に対するケアがされていなくて頻繁に落ちたりしていたのだが今では非常に安定している。開発は今でも継続しているようで最近バージョンが3.3.43に上がった。 圧縮形式の波形ダンプフォーマットであるFST形式をサポートしてくれているのも非常に有難い。 FST形式はIcarus verilogもサポートしているし、gpl-cverについてはPragmatic C社(現 Tachyon Design Automation社)は開発を終了してしまったが、gtkwaveの作者がFST対応させた版を公開している。
http://gtkwave.sourceforge.net/gplcver-2.12a_fst.src.tar.gz
modelsim等の商用シミュレータには独自の圧縮フォーマットがあり、FST形式には対応していないようだ。 gtkwaveのソースツリーを見るとFST dumperのvpiタスクのソースも含まれているのだが、まだ完成形ではないようだ。自分でも色々試行錯誤してコンパイルに成功して、modelsimに組み込んで見たのだが、まともに機能しなかった。(深追いはしていない。)
このvpiタスクが使えるようになると、私としては有難いので、完成版のリリースを楽しみにしている。

Icarus verilogには一つ残念なバグがある。それは、wireネットに対するforceが機能しないというバグだ。 Verilog-HDLにはforce文というのがあって、モジュールを統合した状態で特定のモジュール部のみを検証したい場合や、モジュール間の信号の状態を細かく振りたい場合などに便利な機能だ。例えで言うと、プリント基板に実装された部品の足を浮かせてそこに別の信号をジャンパーで接続する、見たいなことができる。Verilogの規約上はwireに対しても適用可能な筈なのだが、Icarus Verilogはreg属性の信号にしか適用されないようだ。

例えば、上記のコードをmodelsimやgpl-cverでシミュレーションすると以下のような結果になる。

w1をzにforceし、これがw2にまで伝搬しており期待通りの動作だ。
ところが、Icarus verilogの場合は以下のような結果になる。

この問題について、バグレポートを出したところ、暫くして対策版のverilog-20120501が公開されたのだが、その後の公式リリース版であるverilog-0.9.6版では元に戻ってしまった。故に、私は今だに20120501版を使い続けている。バグレポートの提出が最近なのは、それまでforce文は使わないようにしていたのだが最近横着を覚えてしまって、テストベンチのタスク等でforce文を使うようになってしまったからだ。(本業ではFPGAの開発もHDL記述も行っていないのであくまでも趣味上の話だ。) gpl-cverにはそのようなバグは無く、インタプリタなので手軽にシミュレーションできる点が良いのだが、プログラム自体が古く、verilog-2001等の最近(・・・でもないが)の言語規約への対応が不完全だ。 generate文等に対応していないが、これを使わなくても回路記述はできるので、私はHDLを記述する時はなるべくこれらの構文は使わず、どのシミュレータでもシミュレーション出来るようなレベルで記述するように心がけている。

で、環境整備の何にハマったかと言うと、ALTERAのjtagdをudevを使った自動起動に変えようとしてハマってしまった。これまでは、root権限でjtagdを起動してからユーザ権限に戻り、quartus IIやプログラマを起動していた。  udevによる方法はALTERAのドキュメントにも記載されている方法なのだが、何故か私のPC環境では上手く行かず、OSを起動するとUSBキーボードやマウスが使えなくなってしまう。結局、このサイト(https://help.ubuntu.com/community/QuartusII)を参考にして、OS起動時にjtagdを起動して常駐させておくようにした。

・Android
Androidのビルドでもハマった。 最近AvnetのZynq搭載ボード(ZedBoard)に関心が芽生え始めている。このボードでAndroidを動かして見ようかしら、それが可能ならボードを購入しようかどうしようかと思案している。その前にAndroidのビルドがどんなものか体験しようと思って、Linux上でのビルドに挑戦してみたのだがなかなか成功しない。私はシェルはtcshを使っているのだが、Androidをビルドする場合はbashにする必要がある。が、それだけでは不十分で、環境変数であるSHELLにもbashのパスを設定しておく必要があった。私の場合は、この変数がtcshのままになっていたために、ビルドの途中で32bit版コンパイラでコンパイルしたオブジェクトを64bit版アーカイバ(ar)でアーカイブしようとして失敗するという訳の判らない状態になってしまっていた。 SHELLの設定を修正したら無事ビルドできるようになった。で、Zynqボードだが、高いんだよねー。4万円強だもんなー。どこかがもっと安い奴を出してくれないかな。

だらだらと書いてきたら長くなってしまった。ジオメトリ演算関係は別記事に書くことにしよう。


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...