« Gitがファイルの日付を管理しない問題を何とかしたい(1) | トップページ | MAX10のJTAG書き込みシーケンス »

2018.11.20

XILINXのUSER_ACCESSをJTAGで見る

XILINXの比較的新しい(Virtex-5,6やArtix-7、Kintex-7など以降)にはUSER_ACCESSというプリミティブがあります。

User_access

USER_ACCESSとは、XILINX FPGAに元から備わっているプリミティブで、32bitの値を格納しておくものです。

32bitの値は、

  • コンフィギュレーションの時にBitStreamに含まれるコマンドで書き込まれる
  • この値はユーザが任意の値に指定することもできるし、タイムスタンプにすることもできる
  • この値はJTAGを通じて読み出すことができると同時に、FPGAのロジックからも読み出せる

という特徴があります。

sun

応用としては、

  • 設定値をタイムスタンプにしていつごろ作られたデザインかを知ったり、固有の値を書き込んで、バージョン管理に役立てる
  • ユーザ一人ひとりに異なる値を設定し、IPコアのライセンスの鍵にする

でしょうか。

JTAGのUSERCODEと似たようなものなのですが、FPGAのロジックとJTAGで同じ値が読み出せるというところがポイントです。USERCODEはFPGAのロジックからは読み出せません。

VivadoでUSER_ACCESSの値を埋め込むにはBitGenのオプションで指定する(つまり論理合成や配置配線を使わない)のですが、普通は、BitStreamを作るところのXDCファイルで、以下のように記述します。

① まずは、固定の値にする方法

set_property BITSTREAM.CONFIG.USR_ACCESS 0x12345678 [current_design]

② 次はタイムスタンプにして自動設定する方法です。

set_property BITSTREAM.CONFIG.USR_ACCESS TIMESTAMP [current_design]

いずれもXDCファイルに書いてGenerate BitStreamを行うというのがポイントです。

sun

では、早速実験してみました。

実験に用いたのは、特殊電子回路株式会社製のArtix-7ボード

Artixboardt

USBからJTAGでコンフィギュレーションできるので便利です。

 

USER_ACCESSの値をロジックから読み出すには、USER_ACCESS2というコンポーネントをインスタンシエートします。

使い方はとても簡単です。

   USR_ACCESSE2_inst : USR_ACCESSE2
   port map (
      CFGCLK => CFG_CLK,       -- 1-bit output: Configuration Clock output
      DATA => CFG_DATA,           -- 32-bit output: Configuration Data output
      DATAVALID => DATA_VALID  -- 1-bit output: Active high data valid output
   );

このようにすると、CFG_DATAに32bitの値が出てくるので、これをユーザロジックで使えばよいのです。

sun

さて、JTAGで読むにはどうすればよいでしょうか。

XILINXのドキュメントをさんざん探しましたが、JTAGではUSER_ACCESSを読むための命令はありませんでした。プライベート命令にあるのかと思い、ドキュメントに書かれていない命令も探しましたが、USER_ACCESSを読むための見つかりませんでした。

しかし、VivadoのHardware ManagerでFPGAを選択してProperties→REGISTERを開くと、確かにUSER_ACCESSが読み出されています。

User_accesse2_3

そこで、VivadoからMITOUJTAGを通じてJTAGにアクセスするようにして、その通過するJTAGのシーケンスを解析してみました。

その結果の核心部分がこちらです。

STATE RESET;
SIR 6 TDI (05) TDO (35);
SDR 160 TDI (0000000400000004800580140000000466AA9955) TDO (00000004800580140000000466AA995500000000);
SIR 6 TDI (04) TDO (35);
SDR 32 TDI (00000000) TDO (1E6A2C48);

SIR 6 TDI (05)はCFG_IN命令、(04)はCFG_OUT命令です。

解析してSVFに落とし込んだシーケンスをMITOUJTAGで再生してみると、

User_accesse2

ばっちり見えました。

つまり、JTAGの命令で読み書きするのではなく、BitStreamのコマンドをJTAGポートから与えて、読み書きするのです。なお、BitStreamコマンドの 0000000400000004800580140000000466AA9955 というのは、

  • SYNC
  • NOP
  • READ (0x0d)
  • NOP
  • NOP

で、コンフィギュレーションレジスタの0x0d、つまりAXSSレジスタを読むものです。

このように、JTAGのコマンドにない機能は、JTAGからBitStreamコマンドを送り込むことで間接的にアクセスし、知ることができるようです。

JTAGの応用が広がりますね!

|

« Gitがファイルの日付を管理しない問題を何とかしたい(1) | トップページ | MAX10のJTAG書き込みシーケンス »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Gitがファイルの日付を管理しない問題を何とかしたい(1) | トップページ | MAX10のJTAG書き込みシーケンス »