News and Views 2014 Winter / Vol. 8: 上流設計&組込み

ソフトウェアデバッグが大幅に改善された仮想開発プラットフォーム

コンシューマエレクトロニクス製品や組込みデバイス、車載ECUなどでは、複数のシステムを統合することでコストを削減したり、より計算能力の高いアルゴリズムやアプリケーションに対応するためにマルチコアプロセッサを搭載したりすることも珍しくなくなりました。ネットワーク接続する機器には、性能向上と同時にセキュリティ対応も求められ、ハードウェアやソフトウェア単体のテストだけでなく、ハードウェアと一体となって動く時のソフトウェア動作も検証する必要があります。

組込みソフトウェア市場はEDAや半導体市場とはビジネスモデルが異なり、開発環境に対する考え方も異なります。メンター・グラフィックスは、コンパイラやデバッグ技術に定評のあるマイクロテックリサーチの買収を皮切りに、1996年から組込みソフトウェアのビジネスに参入しました。以来、ハードウェアとソフトウェアを一体で開発できる環境や手法について研究を重ねています。

その結果を踏まえ、メンター・グラフィックスでは、SystemC TLM2.0を用いてSoCハードウェア設計、デバッグ、性能解析を可能にするVistaに、組込みソフトウェア開発者の間では馴染みの深い統合開発環境(IDE)であるSourcery CodeBenchを統合し、Sourcery CodeBench Virtual Editionとして提供しています。この環境を使うことの数多くのメリットの中から、いくつかピックアップしてご紹介していきましょう。

仮想化されたプラットフォーム

FPGAプロトタイプなどの評価ボードを実機としてJTAGプローブを用いてソフトウェア開発するエンジニアにとって、SystemC TLM2.0で仮想化された開発プラットフォームを使うことのメリットには以下のようなものが挙げられます。

  • エンジニアに1人ずつ配布可能で、セットアップ用のスクリプトなども支援グループが一括して配布できる
  • 海外事業者や海外子会社でのオフショア開発の場合も、物理的な実機を輸出することなく、仮想ターゲットをオブジェクトとしてメールやFTPなどで配布できる
  • 新規コアの合成可能なモデルを待たず、または評価ボードに対応する開発環境が整うのに先駆けて、ソフトウェア開発を先行着手できる
  • 実機のように動作が不安定になることなく、絶対的な再現性のある環境でデバッグできる
  • ハードウェアと一体となって動くソフトウェアの実行をブレイクポイントで止めたり、ステップ実行したりできる
  • 最も時間を必要とするデバッグ作業を効率よく進められる

特にデバッグの効率化について、VistaおよびSourcery CodeBench Virtual EditionではNon-Intrusive Trace(NIT)と呼ばれる新たな技術を用いた革新的なデバッグが可能になっています。「Non-Intrusive」とは「非侵入型」という意味を表す英語です。

図1. ハードウェアの状態とネスティングされた関数呼出しを同時にトレース図1. ハードウェアの状態とネスティングされた関数呼出しを同時にトレース

NIT: Non-Intrusive Trace

従来型のソフトウェアのテストやデバッグでは、ソースコードの場所(ファイルやファイルに格納されたソースコードの行)、関数の開始/終了、状態変化点、ペリフェラルへのアクセス/制御、割込み、プロセッサの例外などの箇所や動作をジョイントポイントとして監視、制御を行っていました。この方法では、本来あるべき動作と異なる振舞いをしたり、タイミング的に間に合うはずの動作が間に合わなくなったりして、結果的に本来のコードが意図したのとは異なる振舞いになってしまうという問題点がありました。デバッグや性能解析を進めるたびにコードを追加しては、そのコードがタイミングバジェットを消費してしまうため、特に性能のチューニングには不向きな方法です。またマルチコアプロセッサのアーキテクチャをデバッグするのにもオリジナルのコア間通信からタイミングがずれることにより、本来のデバッグができなくなる危険性も懸念されます。

Non-Intrusive Traceテクノロジはこのような問題を解決するもので、検証論理や監視論理を挿入しても、ターゲットの振る舞い、タイミング、消費電力のいずれに対しても影響を及ぼしません。マルチスレッドであってもマルチコア環境で実行したとしても、ターゲットコードの実行順序が変わることはありません。このテクノロジにより、オリジナルのソフトウェアコードを変更することなく、プロファイリングやトレースが可能になります。例えば、処理時間や指定箇所や指定関数の処理時間、ソフトウェア実行中の指定したレジスタの内容の取得や変更、メモリ領域の読出しや書換えなどが好例です。この時、ハードウェア機能側のシミュレーション時刻にも一切影響を及ぼすことはなく、さらにハードウェアモデル、ソフトウェアモデル共に再ビルドすることなくテストを継続できます。

プロファイルのレポート生成、解析ツールへの入力ファイルの生成、ログファイルの生成、シミュレーション時のメッセージ出力などは、TCLスクリプトからコールされるAPIをソフトウェア実行に注入することで実行でき、オリジナルのソフトウェアコードの行数が変わってしまうということもありません。JIT(ジャスト・イン・タイム)コンパイルによって、異なるCコードへの置換えも可能です。

JITによるコードインジェクション

JITコンパイルは、プログラムを実行する前にターゲット機器が実行できる形式に変換するものです。よく知られているものとしては、JAVAの仮想マシンをサーバやPCで実行するために、そのサーバやPCのネイティブな形式に変換して実行する例でしょう。最近では携帯端末でもこの技術が使われています。

SoCの仮想プラットフォームであるVistaでは、例えば、ARMプロセッサコアのモデル上でソフトウェアを実行させ、ペリフェラルを含めてシミュレーションを実行します。しかし実際にはVistaが稼働するホストであるサーバやPCのアーキテクチャであるx86形式に実行コードを変換して実行します。この変換の過程で異なるCコードの注入ができます。インタープリタ形式ではないため、実行速度に影響を及ぼすこともありません。

この手法を用いると、故障注入なども容易に実行できます。オリジナルのソフトウェアコードに手を加えることなく、さまざまな故障状態を注入してシミュレーションできるため、特に安全性が求められるアプリケーションにおけるシミュレーション手法として有効です。

図2. NITを応用したソフトウェアのコードカバレッジ図2. NITを応用したソフトウェアのコードカバレッジ

ソフトウェアのコードカバレッジ

ソフトウェアのコードカバレッジ自体は目新しいものではありません。ソフトウェアのコードカバレッジは、テストベンチ、フローテスト、単体テスト、そして被テストコードそのものの品質を確認するために使われます。さらに、セキュリティ面を検証する際に求められるデッドコードのハイライトの目的でも用いられます。単に構造的なカバレッジを評価するだけではなく、MC/DC(変更条件/分岐網羅)もカバレッジの対象とする必要があります。

NITテクノロジを利用すると、ネイティブにコードカバレッジを取得できます。通常のコードカバレッジでは、カバレッジのためのソフトウェア実装が必要になります。ソフトウェアは変更のたびに再コンパイルが必要になり、その都度ソフトウェア性能が下がってしまいます。NITによるダイナミックなソフトウェアコードカバレッジでは、オリジナルのソフトウェアを変更することなく、本来のソフトウェアイメージに対して、複数指標のコードカバレッジを取得できます。

ソフトウェアのカバレッジ情報をすべて集めてハードウェアのカバレッジ情報と合わせることで、ソフトウェア/ハードウェアシステム全体のカバレッジ情報が得られます。

まとめ

今日の検証やデバッグの環境を見てみると、ソフトウェア開発環境は依然としてハードウェア開発環境の後塵を拝しています。ハードウェアの検証には、実証され広く普及しているUVMという手法があり、UVMをベースとした最新の検証やデバッグ手法が展開されている状況です。

一方、ソフトウェア検証やデバッグは、内製ツールとベンダ提供ツールの寄せ集めになっており、肝となる部分はソフトウェア検証エンジニアの知恵と工夫に頼っています。しかし、複雑なSoCやシステムにとって、ソフトウェア検証が急速な勢いで最重要課題の1つになってきました。SoCとシステムのプラットフォームは、医療用機器のように人命にかかわるもの、自動車や輸送機器のように日々の暮らしにかかわるもの、あるいはネットワーク通信のようなデータを処理するものなどで広く使われています。これらのすべてにおいて、ソフトウェアは、いつの間にか、デザインと信頼性を左右する重要な要素となってきています。

SystemC開発環境であるVistaと、Sourcery CodeBench Virtual Editionでは、ソフトウェアの検証やデバッグに求められる詳細な情報を正確に生成します。また新たなトレース技術であるNITは、今後ますます重要度が増すソフトウェア開発の効率化を支援します。

ARM® Cortex®を使ったシステム性能解析について知りたいなら..

今すぐダウンロード