特殊電子回路株式会社

 

 

特電について

ニュースイベント情報製品・技術サポート会社紹介

ホーム>製品・技術>ソフトロジック

特許出願済

C言語で書いたとおりにFPGAが動く!
論理合成をせずにFPGAを動かす「SoftLogic」技術!

Advanced JTAG Function Generator

 FGPAのプロトタイピングや基板検査を変える次世代ソリューション

アドバンスド・JTAG・ファンクションジェネレータ (ソフトロジック製品群)

 

 アドバンスド・JTAG・ファンクションジェネレータは、特殊電子回路が提供する「ソフトロジック※」という製品のひとつです。
※ソフトロジックとはFPGAを論理合成せずに動作させる技術です。

 

 アドバンスド・JTAG・ファンクションジェネレータを使うと、C言語で記述したとおりにFPGAの端子を操作することができます。

 FPGAの端子の操作にはJTAGバウンダリスキャンを用いているため、論理合成せずに、あらゆるベンダーのあらゆるFPGAを操作することができます。

アドバンスド・JTAG・ファンクションジェネレータのメイン画面

クリックで拡大します

 

 

アドバンスド・JTAG・ファンクションジェネレータの概要

 

 アドバンスド・JTAG・ファンクションジェネレータはソフトウェア製品です。この製品はCD-ROMで提供されます。本製品をご利用いただくには、操作対象のターゲットボードと、JTAGケーブルとパソコンが必要です。

 

 アドバンスド・JTAG・ファンクションジェネレータを使用する際の構成を次の図に示します。

 

AJFGの使用イメージ

 

 

デモに使用したFPGA評価ボード 次に、市販のFPGA評価ボード(Virtex4評価ボード:右の写真)を使って、このツールを動作させた例を示します。

 

 右のFPGA評価ボードには、「電源を入れるとサンプルのアプリケーションが起動して液晶の画面に"Memec V4FX12"と表示し、その後FPGA内のCPUがLEDを点滅させるデモ」 が工場出荷時に書き込まれています。

 常識的に考えれば、FPGAやROMを書き換えない限り、この動作は変わることはありません。

 

 ところが、この評価ボードとパソコンをJTAGケーブルで接続し、アドバンスド・JTAG・ファンクションジェネレータを動作させると、FPGAの動作がをパソコンからコントロールできるようになります。そして、C言語で記述したとおりの動作を強制的に行わせることができます。もともとのサンプルデザインには、そのような「外からの指令で動作を買える」という機能は備わっていないのですが、アドバンスド・JTAG・ファンクションジェネレータを使うとどのような状態にあるFPGAであっても、外から自由に操作できてしまうのです。

クリックで動画再生

 その結果、上のムービーのように、「液晶に"Hello!! スイッチ ヲ オシテクダサイ"と表示し、押しボタンスイッチを押すとその近くのLEDが点滅する」、というように動作を行うようになりましす。

 

  上の動画をみている限りでは、FPGAにそのような動作をするデザインが書き込まれたように見えますが、実際にはFPGAには何も書き込まれていません。FPGAの中はデフォルトのサンプルのままです。

 すなわち、FPGAのデフォルトの動作をすべて停止させ、ユーザが記述したC言語のソースのとおりに、FPGAの動作を強制的に変更してしまったのです。

 

 このとき、論理合成は行っておりませんので、C言語で書いたソースがFPGAの動作に反映されるまでには5秒とかかりません。

 論理合成による動作方法がコンパイラ的な処理によってFPGAを動作させていたのに対して、この技術ではFPGAをインタプリタ的に動作をさせています。インタプリタであるが故に、ソースの変更から実機の動作までの時間を非常に短くすることができるのです。

 

 

応用分野

 

 本製品は以下の分野のアプリケーションに威力を発揮します。

    @ ASICや大規模FPGAのプロトタイピングのプロトタイピング

     FPGAの論理合成は昔から時間のかかる作業でしたが、最近の大規模なFPGAでは特にその時間が長くなっています。単純なケアレスミスでわずかなソースコードを変更した場合であっても、FPGAの論理合成では原則としてすべてのコードを再合成しなければならないため、貴重な時間を無駄にしてしまいます。

     

     大規模なFPGAを多用した回路では、FPGA間や、FPGAとメモリ間、FPGAとインタフェースコネクタ間が接続されているかということを調べるだけでも、途方もない時間を要していまいます。

     規模が大きなFPGAほど論理合成時間も長くなるため、「ASICのプロトタイピング用ボード」などでは、ソースを変更してから動作させるまでに途方もない時間を要してしまいます。

     

    大規模なプロトタイピング

     

     ところが、アドバンスド・JTAG・ファンクションジェネレータは「論理合成」をしないため、使用するFPGAデバイスの規模が大きくなっても、動作開始までの時間は短いままです。

     わずか数秒でコンパイルが完了し、ソースファイルの変更が即座にFPGAの動作に反映されます。

     

    A 各種ICとの接続シーケンスの確立

     基板上で、FPGAが単体で使われることはほとんどありません。

     FPGAのI/Oには、メモリICや、各種インタフェースICなどの周辺ICや、コネクタが接続されているのが普通です。FPGAを設計するエンジニアは、FPGAの内部の信号処理ロジックを設計するとともに、これらの周辺IC接続インタフェースも設計しなければなりませんでした。

     

    FPGAの回路は、内部の演算回路と,外部とのインタフェース回路でできている

     

     FPGA内部のロジック(演算回路など)は、従来の論理シミュレータでも十分にシミュレーションできますが、周辺ICとのインタフェース回路は論理シミュレータでは検証できません。実機を用いて動作確認を行う必要がありました。

     

    各種ICとの接続の確立

     

     どんなに入念にデータシートを読んで設計したインタフェース回路でも、最初に記述したコードには多少の間違いは生じるものです。間違いを修正しながら正しいインタフェース回路に落ち着くまでには、何度かの論理合成を行うことになるでしょう。

     

     正しいインタフェース方法を確立するため論理合成を繰り返すということは、FPGAの規模が大きくなれば論理合成に要するトータルの時間は非常に大きなものになります。あまりに論理合成時間が長いとエンジニアはどのような意図で回路を作っていたかを忘れてしまうことさえあります。

     

     アドバンスド・JTAG・ファンクションジェネレータは論理合成せずにFPGAの端子を操作できるため、記述したコードのとおり即座にFPGAが動作します。論理合成を経ることはないので、「正しいインタフェース方法」をみつけるまでのトータルの時間を低減することができます。

     

     エンジニアが思考する迅速さFPGAの動作を変更できるということのメリットは計り知れません。

     

    B アルゴリズム再利用可能な基板検査

     従来からよくあるJTAGを用いた基板検査ソフトウェアでは、表形式でデータを入力し表形式でデータを結果を確認するということがよく行われていました。

     

    従来からよくあるJTAG基板検査ソフトウェア例

     

     ところが、このような従来型の基板検査ソフトウェアは、データの入力は面倒であるうえ、作成したデータを別のプロジェクトで使うことが難しいという欠点がありました。 また、同じ処理を何度も繰り返すような場合(例えばメモリの1MBytesのデータを書き込むような場合)、表のサイズは巨大になってしまうのは明らかです。表形式では条件判断も苦手なので同じような処理を何度も書かなければなりません。ユーザー入力を促したり通信したりという処理を独自に追加するのはほぼ不可能でしょう。

     つまり、従来型の基板検査ソフトウェアでは、アルゴリズムの再利用は難しく、ユーザが言語仕様を拡張することはほぼ絶望的でした。

     

     アドバンスド・JTAG・ファンクションジェネレータは違います。まず、やりたい動作を普通のC++言語で書きます。例えば、2つのICのデータバス同士が正しく接続されているかどうかを調べるには、以下のようにすればよいのです。変数や条件判断、ループが自由自在に使えるため、従来のJTAG検査ソフトウェアような表記述に比べると再利用が容易であり、保守性も高まります。

     

     基板検査スクリプトからWindowsAPIや他のプログラムをコールしたり、他のプログラムやコンピュータとの通信、ユーザ入力待ちなども自由にできます。まさにWindowsのプログラムと基板検査スクリプトが融合しています。

     

bool check_connect()
{
    unsigned long val;
    DEV2_DATA <= "Z"; // 2つ目のデバイスを入力状態に
    for(int i=0 ; i < 32 ; i++ )
    {
        val = ( 1 << i ) ; // データバスに1ビットづつ'1'を出力
        DEV1_DATA <= val;  // 1つ目のデバイスから出力
        if(DEV2_DATA != val)
{
// ダイアログを表示(Win32API)
MessageBoxA(NULL,"エラーがあります","",
MB_OK);
fprintf(fp,"error at %d\n",i); // ファイルに記録
return false ;// 2つ目のデバイスから入力し、比較
} } return true; }

     

     アドバンスド・JTAG・ファンクションジェネレータでは表(ベクタ)形式での入出力も可能です。

     

    アドバンスドJTAGファンクションジェネレータの表形式
    クリックで拡大

     

    ベクタはC言語のプログラム中から容易に呼び出すことができます。

     

     アドバンスド・JTAG・ファンクションジェネレータでは表(ベクタ)形式も扱える

     

     検査したい項目ごとに小さな表を作成すれば、検査アルゴリズムの再利用は容易になります。

     

      さらに、アドバンスド・JTAG・ファンクションジェネレータは基板検査の量産にもご活用いただけるよう「量産モード」と「ラボモード」を備えています。量産モードではプロジェクトやソースファイルの変更が行えず、「OK」「NG」ボタンを押すという操作のみ行うことができます。

     

    クリックで拡大

     

    C 不揮発性メモリの初期値設定

     近年の組み込み機器では、CPU用のプログラムにはフラッシュメモリが、IDコード保持用にシリアルメモリなどがよく用いられています。これらのメモリは工場出荷時に一度だけ書けばよいうというものも多く、実稼動時には全く書き換える必要のないものもあります。

     

     従来のシステムではこのような不揮発性メモリがFPGAからアクセスされるようになっている場合、その書き込み回路まで一緒にFPGA内に作りこむ必要がありました。一般にはフラッシュメモリの書き込みは、読み出しにくらべて非常に複雑なシーケンスを要求します。このため、書き込み用回路の設計という、ある意味無駄な作業に多くの時間を割く必要があったのです。

    従来は一度だけしか書き込まないメモリの書き込み回路もFPGA内につくる必要があった

     

     アドバンスド・JTAG・ファンクションジェネレータはこの種の問題に対するスマートな解決策を提供します。

     アドバンスド・JTAG・ファンクションジェネレータが提供する「メモリ操作ライブラリ」を活用すれば、FPGAの端子を操作して、メモリ書き込みシーケンスを発行することができます。もはやFPGA内には一度しか使われない回路を作る必要はありません。

     

    D 実デバイスの動作を元にしたテストベクタの作成

     アドバンスド・JTAG・ファンクションジェネレータは、C言語で記述した「JTAGスクリプト」に従ってFPGAを操作します。その結果得られた各種の信号は、FPGAのI/O端子でサンプリングされてパソコンに送られます。こうして、得られたデータは保存しておくことができます。

     

     正常に動作する基板で得られたデータをマスタとして保存しておけば、量産検査時にその結果と比較することで、基板の異常を速やかに発見することができます。

     

     また、得られたデータをVerilogやVHDL形式のテストベクタとして出力すれば、それを外部の論理シミュレータのテストベクタとして与えることで、周辺ICの挙動も含めた正しい論理シミュレーションを実行することもできます。

 

 

 

アドバンスド・JTAG・ファンクションジェネレータの特徴

 アドバンスド・JTAG・ファンクションジェネレータによって動作するICは、次のような特徴があります。

 

    @ 対応FPGAの品種は問わない

     アドバンスド・JTAG・ファンクションジェネレータは、あらゆるメーカーのあらゆるFPGAに対応します。FPGAだけではなく、CPLDや、CPUなど、JTAGバウンダリスキャンに対応したICであればいかなるデバイスにも対応します。

     

    A FPGAへの書き込みは不要

     アドバンスド・JTAG・ファンクションジェネレータは、FPGAの本来の動作をオーバーライドして動作します。そのため、FPGAにどのようなデータが書き込まれているかを考慮する必要はありません。

     FPGAが未書き込みの状態でも使用することができます。

     

    B FPGAの端子だけを操作している

     アドバンスド・JTAG・ファンクションジェネレータは、FPGAの端子だけを操作します。

     FPGA内部の回路(ユーザロジック)を操作しているわけではありません。

     

    C FPGA内部のユーザリソースは一切使用しない

     アドバンスド・JTAG・ファンクションジェネレータは、FPGA内に何かのIPコアを埋め込むようなデバッグツールとは根本的に異なります。FPGA内部のユーザリソースは一切使用しません。そのためあらゆるFPGAやCPLDに同じように対応できるのです。

     

    D 動作速度はFPGAの速度ではない

     アドバンスド・JTAG・ファンクションジェネレータは、FPGAが入出力する信号をパソコン上で計算して操作しています。FPGAの本来の速度ではなく、シミュレーションの速度で動作します。

     動作は決して速くはありませんが、裏を返せばFPGAの動作の一つ一つをパソコンでコントロール(広義のエミュレート)しているといえます。

     したがって、タイミング(時間)が厳密に決められた通信プロトコル(イーサネットやPCI Expressなど)の操作には不向きですが、PCIやISAのようにマスタが送出するクロックで動くような場合には威力を発揮します。

 

アドバンスド・JTAG・ファンクションジェネレータの動作

 

 アドバンスド・JTAG・ファンクションジェネレータを使用する際の動作の流れを次の図に示します。

JTAGファンクションジェネレータの動作の流れ

 

 ユーザは「ピン定義ファイル」と「スクリプトファイル」を作成します。

 ピン定義ファイルというのは、何番のピンに何という信号が接続されているか、ということを記述したファイルです。このファイルはターゲットボードの回路にあわせて作成します。

 

LED_O 2:D11 C11 D12 D13
PSW_IN 2:C14 C13 B14 C15

ピン定義ファイルの例

 スクリプトファイルは、動作させたい内容をC言語で記述したものです。

 

int sub(int param1) {
for(int i=0;i<10000;i++) {
LED <= i; // LEDにバイナリ値を表示
if(PUSHSW_IN != 0) break; 
 // 押されたらbreak
}
return DIPSW; // DIP SWの値を返す
}
 ※ LEDという変数とPUSHSW_INという変数がJSSignal型である

アドバンスド・JTAG・ファンクションジェネレータ スクリプトの例

 アドバンスド・JTAG・ファンクションジェネレータの「コンパイラエンジン」は、これらのファイルをコンパイルして、中間ファイル(*.jsm)を作成します。このjsmファイルを、「JTAG実行エンジン」が読み取って解釈し、ハードウェアを操作します。

 

 

 ハードウェアを操作した結果として、FPGAの端子に入力された各種信号の値は、ログファイルやベクタ出力に記述することもできますし、スクリプトの中で変数のように扱うこともできます。

 

 

JTAGスクリプトの文法

 

 アドバンスド・JTAG・ファンクションジェネレータを使用するために、新たな言語を習得する必要はありません。

C言語が使用できるエンジニアであれば誰でもすぐに使用することができます。

 

 なぜならば、アドバンスド・JTAG・ファンクションジェネレータを操作する「JTAGスクリプト」という言語は、普通のC++言語だからです。C/C++で記述されたソース中に現れた「JSSignal型」の変数を操作すると、実際のデバイスが動作するという、非常に単純明快なしくみで動作しています。

 

 JSSignal型というのは、実際にはC++言語でいうところのクラスです。JSSignal型の変数(オブジェクト)は物理的な1本の信号にマッピングされていることもあり、複数の信号を束ねたバスにマッピングされていることもあります。

 

 JTAGスクリプトでは、JSSignal型の変数に対する「演算子のオーバーロード」機能を利用して、ハードウェアを操作するJTAGライブラリを、ユーザから見えないところで呼び出しています。

 ユーザは実際のハードウェアの操作のためのしくみを意識する必要はありません。C言語の文法にしたがって、どの信号をどのように操作したいか、というアルゴリズムを記述する作業に注力できます。

 

 JTAGスクリプトではVHDLと同じように「 <=演算子」や、「(x downto y)」といった一部拡張された記述を用いることによって、C言語から簡単にハードウェアの動作を記述できます。

 

 JSSignal型の変数(オブジェクト)に対する操作の例としては、以下のようなものが用意されています。

記述方法

機能

記述例

<=演算子

ハードウェアを操作する

LED <= '0';
nOE <= 'Z';

(int)へのキャスト

JSSignal型の変数をint型に変換する

printf("SW=%d\n",(int)SW1_IN);

[]演算子

バスの中の特定のビット参照

ADDR[12] = '0';

( downto )記述

バスの中の特定のビット範囲参照

int a = ADDR(15 downto 8)

 

 

JTAGスクリプトは、JTAGに特化した独自仕様のローカル言語ではない

 

 JTAGスクリプトは、通常のC++コンパイラを用いてコンパイルすることができます。現在では「GNU C Compiler (MinGW)」、「MicroSoft Cコンパイラ」、「Borland Cコンパイラ」での動作を確認しています。

 このことからもわかるように、JTAGスクリプトは通常のC++コンパイラでコンパイルできるほど従来のC言語との親和性が高くなっています。

 

ライブラリの活用

 アドバンスド・JTAG・ファンクションジェネレータには、汎用的で再利用可能なアルゴリズムを記述したライブラリが付属しています。(随時提供予定)

 このライブラリには、SDRAMの操作や、DDR SDRAMの操作、I2Cメモリの操作、フラッシュメモリの操作などが含まれています。これらのライブラリを活用することによって、迅速にスクリプトファイルを記述し、ユーザはユーザのボードに特化したアルゴリズムの開発に注力することができます。

 

従来のFPGA開発方法に潜む非効率さ

 

FPGAを動かすには、ソースコードをVHDLやVerilogで書いて論理合成にかけ特定のアーキテクチャにフィットさせる、というのがこれまでの常識でした。

 誰もがごくあたりまえのように行っているこのプロセスには大きな問題があります。

     

    @VHDLやVerilogは、C言語などのソフトウェア言語に比べて難しい。

    AFPGAを動かすには、個々のFPGAのアーキテクチャに対する知識が必要。

    Bデバイスに合った論理合成ツールを使わなければならない。

    C論理合成には膨大な時間がかかる。

 

 これらはごくあたりまえのようなことなのですが、開発効率という面からみると、ソフトウェアの開発に比べて桁違いに効率の悪いものです。

 

 たとえば、「FPGAに液晶ディスプレイをつなぎ、I2Cのメモリから読み出した文字列を表示させる」というアプリケーションを作ろうとしたとき、どのくらいかかるでしょうか?

 どんなにFPGAに慣れた人でも、液晶ディスプレイやI2Cのメモリとの正しいインタフェース方法をみつけるために、何度も何度も論理合成を繰り返すのではないでしょうか?

 ソフトウェアでも同じようにコンパイルして正しいコードに近づいていきますが、ハードウェアの論理合成との決定的な違いは論理合成時間の遅さにあります。

 

 そのうえ最近のFPGAでは、論理合成に掛かる時間はますます長くなる傾向にあります。わずか1行のソースの修正であっても、FPGAの合成ツールはデザイン全体を再合成します。大規模なFPGAの開発では論理合成を行うたびに何時間もかかってしまい、更なる効率の低下を招いています。

 

 従来の論理合成による動作方法がコンパイラ的な処理によってFPGAを動作させていたのに対して、アドバンスド・JTAG・ファンクションジェネレータはFPGAをインタプリタ的に動作をさせます。インタプリタであるが故に、ソースの変更から実機の動作までの時間を非常に短くすることができるのです。これからはFPGAにも迅速さが必要になってくるでしょう。

 

 お見積もり依頼・ご相談

 

 本製品に関するお見積もり依頼・お問い合わせは、下記のあて先までお願いします。

 

  特殊電子回路株式会社

  担当:内藤 info@tokudenkairo.co.jp  電話 03-3253-0525

Copyright(C) 2006 TokushuDenshiKairo Inc. All rights reserved.
info@tokudenkairo.co.jp