2019.12.14

Vivado 2018.3でMIGを使うデザインがクラッシュする原因

Vivado 2018.3でMIGを使うデザインがクラッシュするという問題の原因がわかりました。

先行する報告としては、AR# 71898 に「MIG 7 Series - パッチ - 2018.3 での既知の問題」というのがありますが、ここに書いてあるパッチを適用しても改善されません。また、フォーラムの記事でもAR71898を試したが改善しなかったという例が出ています。結局2019.1にアップデートして回避したようなのですが、Vivado 2018.3のMIGにはまだ知られていないバグがあるようです。

 

現象としては、プロジェクトの読み込み時や、Synthesisを開始したときに、何のログも残さず、突然Vivadoごと落ちるというものです。

その原因がついにわかりましたので紹介します。

まずは確実にクラッシュするプロジェクトの作り方です。

① Vivadoで新規プロジェクトを作ります。

デバイスはSpartan-7の50にします。

Migcrash1

② BlockDesignを作成し、MIGを配置します。

Migcrash2

③ 配置した直後は、クロックとリセットしかないMIGなので、ダブルクリックして設定画面を開き、Nextを押し押し最後まで設定します。

Migcrash3

④ 最後までカスタマイズすると、いろいろなポートが出てきます。

⑤ Vivadoで一度セーブします。

Migcrash4

何も特別なことをしていないMIG使用デザインですが、実は、この時点で諸悪の根源であるバグが埋め込まれています。ポートを付けたりして論理合成を開始するとクラッシュするでしょう。運が良ければ動くかもしれませんが。

 

では、原因を究明します。

MIGはユーザが設定した内容をprjというファイルに保存します。

prjは<プロジェクトフォルダ>\<プロジェクト名>
.srcs\sources_1\bd\design_1\ip\design_1_mig_7series_0_0 にありますが、中身はXMLファイルのようで、

Migcrash6

これだけ見るとそんなに悪くはなさそうに見えます。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project NoOfControllers="1">
<ModuleName>design_1_mig_7series_0_0</ModuleName>
<dci_inouts_inputs>1</dci_inouts_inputs>
<dci_inputs>1</dci_inputs>
<Debug_En>OFF</Debug_En>
・・・

ところが、バイナリエディタで開いてみると

Migcrash7

<?xml の前に、EF BB BFという3バイトのゴミがくっついていました。

どうやらこのゴミが悪さをしているようで、Synthesizeの開始時やプロジェクトのオープンの際にクラッシュしてしまうようです。バイナリエディタを使って綺麗に取り除くと、クラッシュしなくなります。

この3バイトのゴミは、

  • Vivado 2018.3でのみ発生する (2018.1、2018.2では発生しない。2019.1は未確認)
  • デバイスのファミリによらない。Spartan-7だけでなくKintex-7、ZYNQ、Artix-7でも発生する。MIG 4.2でのみ発生すると考えられる。
  • AR71898のパッチを当てても改善しない
  • この3バイトのゴミの内容は変わることがある
  • パソコンの問題ではない(少なくとも3台のPCで検証した)

という特徴があります。

 

どうやって気が付いたかというと、Vivado 2018.2で作ったプロジェクトをVivado 2018.3にアップグレード際にはこの問題が発生しなかったので、そのBlockDesignをTcl化してDIFFしてみました。TCL化BlockDesignの中ではmig_a.prjを生成する関数があるのですが、要するにprjファイルをベタに埋め込んでputsでファイルに書き込んでいるのですが、そこにゴミが映っていたのです。↓

Migcrash8

このDIFFで見つけることができました。

今は2019.2が流行しているので2018.3を使う機会は少ないかもしれませんが、困っている人がいたら是非prjファイルの先頭をバイナリエディタで見るということを伝えてあげてください。

 

| | コメント (0)

2019.12.13

Spartan-7のMIGの配線を検証する

Spartan-7ボードのDDR3メモリの配線が正しいかどうかを検証するために、MIGを使ったデザインで回路図のとおりに配置を指定して、論理合成できるかどうかを確かめるというプロセスを行います。

こんな感じのデザインを作りました。

Mig4

回路図を見ながら、MIGの設定画面で一つずつピン番号を入力していきます。

Mig3 Mig2

Mig5

そして保存して、いざ論理合成!とすると、突然、Vivadoが落ちるのです。

酷い時にはMIGのIPをクリックするだけで落ちます。

Mig1

いろいろ回避策を試しました。

まず、AR71898という「MIG 7 Series - パッチ - 2018.3 での既知の問題」というアンサーが出ているのですが、プロジェクト名/ディレクトリにスペースはないので、これも違います。一応、パッチのAR71898_vivado_2018_3_preliminary_rev4.zipもあててみました。

関係ないですが、このパッチは面白いですよ。

ZIPファイルを解凍すると、AR71898_vivado_2018_3_preliminary_rev4というフォルダが出来るので、D:\Xilinx\Vivado\2018.3\の下に自分でpatchesというフォルダを作り、このAR71898_vivado_2018_3_preliminary_rev4フォルダをコピーするのです。どのファイルをどうするとかではなく、フォルダごとpatchフォルダの下にコピーするのです。 Mig8

すると、次からVivadoを起動したときにタイトルにパッチ名が付いて、更新済みVivadoであることが示されるわけです。

Mig9

残念ながらこの方法でもうまくいかなかったので、Vivado 2019.2を試すことにしました。

せっかくだからVitisを入れようとしたのが失敗。

24GBをダウンロードして100GBのアプリをインストールするわけなので、午前中から昼過ぎまで何もできませんでした。

Mig6

Vivado 2019.2ならクラッシュせずに論理合成ができたのですが、何か腑に落ちないですね。

Mig7

ここで終わらせてはいけないので、徹底的に原因を探りたくなります。

 

| | コメント (0)

2019.12.11

Spartan-7とDDR3Lの配線

Spartan-7とDDR3Lの配線が引けました。

Mig_1

過去に作成したSpartan-7基板のメモリの部分から配線のデータをコピーしてきて、Spartan-7のBank35につなげます。

XILINX FPGAのDDRメモリインタフェースは一つのバンクのT0~T3で表されたブロックの中にデータ線とDQSとDMを入れておけば配置は自由にできるので、Bank35のT3にデータバスを押し込み、T0~T2にアドレス線や制御信号を詰め込みました。

つまり、メモリからFPGAに引きやすいように配線を引いて、後からFPGAの端子を割り当てる作戦です。

DDR3の配線をしなければならないというのは気が重くなりますが、やってみるとそんなに難しくはなかったです。やはりメモリが一個だからでしょう。

 

基板全体に占めるFPGAとメモリの面積は下の図のような感じです。

Mig_2

Spartan-6基板(2009年の設計)の頃と比べると随分と縮んだように感じます。

デバイスの面積が小さくなったせいでしょうか?

| | コメント (0)

2019.12.10

Spartan-7ボードの設計を再開します

1年くらい前から設計途中で中断していたSpartan-7評価ボードをやはり仕上げることにしました。

Sp7_board

Spartan-7を中心として、DDR3L SDRAM、USB2.0(USB-JTAG付き)、2.54mmピッチの40pinピンヘッダ2個にI/O 64本、7cm×5cmという仕様です。

10年くらい前ならこういう評価ボードは日本の各社から結構出ていてたのですが、現在ではアジア製の安い評価ボードが簡単に買えて、

 - 具体的に言うと、Zyboとか、Artyとか、PYNQとか。

しかもリファレンスデザインも充実しています。

今、誰もが最初に購入しようとするFPGAボードはZyboかArtyかPYNQじゃないですか?

学校とかでFPGAで何かを作る課題があったとして、実際に使うボードは上の3つのどれかじゃないですか?

こういう安くてコモディティ化したボードが巷にあふれている状況で、シンプルなボードを、名もない日本企業が、そんなに安くもない価格で出す意味があるのか、と悩んでいました。

 

海外ボード勢の価格は、日本で作ろうとしたらどう頑張っても原価さえ回収できず赤字となってしまいます。しかもgithubで手の込んだリファレンスデザインも出しているとなっては、もう手も足もでません。おそらくFPGAやメモリ、電源ICなどのを、一般価格よりも相当低い価格で仕入れることができているのでしょう。

 

そういう理由で、もうFPGA評価ボードは作るのをやめようと思っていた次第です。

 

しかし、FPGAを工業用の組み込みモジュールとして使うなら、スイッチやLEDやLAN、PMODなどが出ていないほうが使いやすいのではと思うところもあります。はがき大のサイズのボードだと機器に組み込むにはちょっと大きいし、背の高いLANコネクタは邪魔になります。

それに、原価低減のためなのか実装面積を削減するためなのか、こういった海外ボードはユーザガイドに示された推奨数のパスコンが乗っていないこともあります。(Kintex以上だとパスコン内蔵ですが)

小型高密度で、ちゃんとパスコンを載せたボードがあってもいいかもしれない。

されど高密度で極小サイズで作ってしまうと、コネクタがメザニンになってしまい、万能機版が使えなくなり、評価用や1台~2台の工業製品に組み込むボードとしては使いにくいものになってしまいます。

よって、2.54mmピッチのコネクタにたくさんのI/OがついたFPGAボードというのは、まだ少しでも需要があるかもしれない

・・

などと、ぐずぐず考えて判断した次第です。

ただ、こういう汎用の「何にでもなれるけど何者でもないFPGAボード」を設計するのは最後にしたいと思い、このボードの名前を以下のように決めました。

LAST BOARD(ラスト☆ボード)

 

| | コメント (0)

2019.12.09

GOWINの書き込みケーブルと、TEC0117というボードを仕入

ドイツTrenzElectronic社が開発したTEC0117というボード、それからGOWINのケーブルを入荷しました。

Gowin

この"TEC0117-01"というボードは、GW1NR-9という8MByteのSDRAMを内蔵したFPGAを搭載しています。

Gowin_top

1NR9って型番おかしいんじゃないかと思ったのですが、エンベデッドメモリ搭載ファミリで正しい型番でした。

LUT数は8640個で、TangNanoで使われているGW1N-1の7.5倍もあります。

https://www.gowinsemi.com/ja/product/detail/2/

のGW1NRファミリ(エンベデッドメモリ搭載)というところを見てください。

8MByteですよ。結構なサイズです。

何ができるでしょうね。RISC-Vのメインメモリとかでしょうか。

この基板の裏には何も部品が乗っておらず、つるつるでした。

Gowin_bot

0603サイズ(ミリメートル)の部品はふんだんに使っているようで、相当な高密度でした。

USB-JTAGはFT2232を使って実現するようなのですが、USB-JTAGの機能を使うためのファイルがまだ提供されていません。

また、マニュアルの整備が追い付いていないようで、存在するドキュメントは回路図のみという状況です。

 

GOWINのデバッグケーブルもついでに購入しました。

Gowin_cable2

このケーブルは世界中を旅してきたようで、新品のはずなのですが砂っぽかったです。

TEC0117とUSBケーブルは近いうちに発売します。

 

| | コメント (0)

2019.12.02

Cosmo-Zのディスクリを正負両対応にしたのと、Vivadoにおけるスマートなパラメタライズ

Cosmo-Zは放射線を計測する際に、無信号時の信号レベルよりどれだけ下がったらトリガをかける、というトリガが使えます。これをディスクリと呼んでいます。

お客様からの要望で、(無信号時の信号レベル-設定値)ではなく、(無信号時の信号レベル+設定値)でもトリガを掛けられるようにしてほしいというのがあったので、対応しました。

Pos_discri

書くのは簡単なのですが、ここに至るまでに、いままでのぐちゃぐちゃになっていたソースを全面的に見直したり、ISEで書いたコードをVivadoに移植したりといろいろ大変でした。

このお客様はCosmo-Zに拡張ボードを2枚挿して24chにしているので、通常のお客様用の8chとは別にソースをつくらなければなりません。

お客様ごとにソースを作り分けていてはバージョン管理ができなくなるので、VivadoのTclのライブラリを作り、Block Designのコメントを利用してパラメタライズを行えるようなTclの関数を作りました。

 

デフォルトでは下の図のように「ADCのCH数は8、分解能は12」と書いておきます。

コメントにはFPGAのバージョンなんかも書けます。

Discri1

各IPのパラメータは↓のようにパラメタライズできるようになっていて、最初は12bitで8chになっています。

Discri2

ここでMAX_ADCCH=24に書き換えて論理合成を開始すると、

Discri3

TCLのコメントが、子IPの中にあるMAX_ADCCHというパラメータを書き換えてくれます。

Discri4

Discri5

そして、24ch、12bitのデザインが出来上がります。

これで、ユーザはソースを書き換えることなく、また、IPのパラメタライズダイアログを出すこともなく、コメント欄を書き換えることで自分用の設定に変更することができるようになりました。

 

 

| | コメント (0)

2019.12.01

Tang nanoのJTAGを調査

秋葉原のShige ZoneでTang nanoを手に入れたので、JTAGを調査することにしました。

Tn1

Tang nanoは、中国GOWIN社のGW1N-1-LVというFPGAを搭載した小型FPGAボードです。

この基板にはTCK、TDI、TMS、TDOと書かれた端子があるので、ここにピンヘッダをはんだ付けし、フライリードケーブルを接続します。

Tn2

JTAGの電源は何Vかわかりませんが、5Vではないと思われるので、Vbank0/3と書かれたところから電源を取ります。

MITOUJTAGで普通に自動認識させてみても見つからないので、MITOUJTAGのSVFプレイヤーを使ってTDOから何か出てくるかを調査しました。

TRST OFF;
ENDIR IDLE;
ENDDR IDLE;
STATE RESET IDLE;
TIR 0 ;
HIR 0 ;
TDR 0 ;
HDR 0 ;
SIR 32 TDI (55555555) TDO (F5FFFFFF) ;

これは、TDIから0x55555555という値を入れて、F5FFFFFFというものが出てくるのを期待した構文ですが、期待値が適当なのでエラーとなります。しかし、そのときに実際にTDOから取得された値が表示されるので、動作がわかるというわけです。

結果は、

2019/12/01 22:28:18  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='FFFFFFFF'

となりました。

つまり、TDIから入った信号がTDOから出て来ていないわけです。FPGAはJTAGの信号を通していないことが分かります。

 

おそらくオンボードのUSB-JTAGとぶつかっているのだろうと思い、回路図を見ながらオンボードのUSB-JTAGと、JTAGコネクタの境界にあるRY1を外すことにしました。

Tn3

実際に外した写真が下のものです。

Tn_ry1

これで再びSVFプレイヤーを実行してみると、

2019/12/01 22:30:36  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='55555519'

となって、0x5555519という何かの値が出てくるのが確認できました。

SVFでIRに送るコードを適当に変えて、

SIR 32 TDI (ffff0fff) TDO (F5FFFFFF) ;

にしてみると、結果は

2019/12/01 22:47:53  Error:Line 9 Operation error.TDO(expected) ='F5FFFFFF' TDO(mask)='FFFFFFFF' TDO(captured)='FF0FFF19'

になりました。19という値はStatus Registerの規格に合致しているので、IRの長さは8bitと推測されます。

 

再びMITOUJTAGに戻って、GUIから自動認識させてみると、genericデバイスとして認識されました。

IDCODEは0900281Bであるようです。

Gowin_idcode

ただ、BSDLファイルがないためピンの可視化ができていません。

GW1N-1-LVのBSDLファイルが得られるかどうかは、GOWIN社のサポートに問い合わせました。

 

| | コメント (0)

2019.11.23

Vivado IPインテグレータのアイコンを自由自在に変える方法

Vivadoでは自分で作ったIPコアが薄い水色の四角になってしまって面白みがありません↓

Vivado_icon

ここに好きな絵を出せたらどんなに素敵でしょう。

その方法がわかりましたので紹介します。

 

まず、Edit in IP Packagerで子IPを開きます。

Vivado_icon2

ここでは、以下のおでんの画像を貼り付けることにします。サイズは1024×768です。

Oden

IPコアのソースがあるディレクトリ(component.xmlのあるディレクトリ)に、表示させたい画像ファイルを置きます。JPGでもPNGでも構いません。

Vivado_icon3_20191123135401

Vivadoの子IP画面で、Package IPタブを開き、File Groups→Advancedで右クリックし、Add File Groupを行います。

Vivado_icon4

ダイアログが開くので、一番下にあるUtility XIT/TTCLを選びます。

Vivado_icon5

Advancedの下にUtility XIT/TTCLというグループができるので、右クリックしてAdd Filesをします。

Vivado_icon6

用意しておいた画像ファイルを追加します。

Vivado_icon7_20191123142001

次のダイアログではそのままOKを押します。

Vivado_icon8_20191123141901

追加したファイルのタイプがimageになっているので、

Vivado_icon18

ここをLOGOに変更します。

Vivado_icon17

Review and Packageを開き、Re-package IPを行い、閉じます。

Vivado_icon9

Vivadoは更新されたことを認識するので、Show IP Status→ReRun→Upgradeの手順を行います。

Vivado_icon13

すると、コアのアイコンに絵が貼りつきました。絵の大きさを基準にIPのサイズが決まるのですが、1024×768だとちょっとサイズが大きかったようです。

Vivado_icon14

そんなときは、ブロックの角をつまんで引っ張れば、大きさを調整できるようです。

Vivado_icon15

いろいろ試してみたところ、PNGとJPGファイルはOKでしたが、アニメーションGIFはだめでした。

また、いらすと屋さんあるような透過PNGのファイルは、透明色の部分が透けて薄水色の部分が透けてイイ感じになりました。

こんな、他社には真似できない特殊な電子回路になりました。

Vivado_icon16

皆さん、ぜひ任意アイコンを貼り付けて、楽しくって特殊なBlock Designにしちゃいましょう!!

 

» 続きを読む

| | コメント (0)

«Digikeyからの運送はUPSがいいか?Fedexか?