第1章 C++言語をベースにしたシステムレベル設計言語
SystemCの基礎
 ハードウェアのみ,ソフトウェアのみではなく,「システム全体」を設計するという考え方が注目されている.システム全体を俯瞰することにより,ハードウェアで実現すべき部分とソフトウェアで実現すべき部分を適切に切り分け,パフォーマンスの高いシステムを設計することが可能になるだけでなく,消費電力などの面でも有利になる.そのためには,ハードもソフトも記述できる言語が必要になる.

 SystemCは,数あるシステムレベル設計言語の中でもC++をベースとしているため,とくにソフトウェア技術者には親和性が高い.そのため,すでにC++を習得している技術者であれば,わずかな学習のみでシステムレベル設計が可能になる.

 本章では,システムレベル設計言語SystemCの基礎を解説する.

(編集部)

はじめに

 ハードウェア開発者だけでなく,ソフトウェア開発者でもSystemCという言語を耳にしたことがあると思います.このSystemCとは,どんな言語なのでしょうか?

 SystemCは,大規模なシステムを効率良く設計するために開発された,C++言語をベースにしたシステムレベル設計言語です.大ざっぱには,ハードウェアも記述できるC++言語ということになります.SystemCはシステムレベル設計言語なので,システム上のハードウェアとソフトウェアを記述でき,さらには,システム全体の動作から,システム上の小さなディジタル回路の動作まで記述することができます.

 このSystemCの登場により,多くのソフトウェア開発者がハードウェアの設計に携わるようになることは想像に難くありません.しかし,いままでソフトウェアの開発しか行ったことがない人にとっては,ハードウェアの設計は勝手が違い,とまどいを感じることと思われます.

 そこで本特集の第1章〜第4章では,「ハードウェアの設計をほとんど行ったことがない」,また「C言語は知っているけれどC++言語はあまり知らない」という方を対象に,SystemCによる基本的なハードウェア設計の手法について解説していきます.

 まず,この章では,SystemCの基礎について説明します.

1 SystemCとは?

 SystemCは,OSCI(Open SystemC Initiative)によって開発されているシステムレベル設計言語です.2000年4月に,最初のバージョンであるSystemC 1.0がリリースされ,2001年10月にSystemC 2.0がリリースされました.SystemCは現在もOSCIによって開発が進められており,2003年6月の時点でのバージョンは2.0.1となっています.また,OSCIからはSystemCのフリーのシミュレータもリリースされています.

システムとは?

 SystemCが設計の対象としている「システム」とは,一体どういうものなのでしょうか?

 航空券予約システム,航空管制システム,銀行の預金管理システムなど,「システム」という言葉はよく耳にします.このようなシステムは,スーパーコンピュータ,端末コンピュータ,大容量の記録装置,バックアップ装置などの数々のハードウェアから構成されています.そして,これらのハードウェア上でOSや種々のプログラムが稼働することによって,目的の処理が行われることになります.したがって,ハードウェアとソフトウェア全体でシステムの機能を実現していることになります.すなわちシステムとは,ある機能(処理)を実現するハードウェアとソフトウェアの集合ということになります.システム設計では,目的の機能を実現するハードウェアとその上で稼働するソフトウェアを設計・開発することになります.

 それではなぜ,システム設計が重要視されるようになったのでしょうか?

 近年,身のまわりにはカメラ付き携帯電話やPDA,ノートPCなどの小型で高性能なコンピュータがあふれています.そして,これら小型のコンピュータは,数年前の(比較的大きな)コンピュータと同等かそれ以上の性能をもっています.その一方で,サイズ,消費電力,価格は大幅に小さくなっています.これを実現できた大きな理由の一つは,コンピュータを構成する多くの部品が一つのチップに集積できるようになったことが挙げられます.

 その結果,いままでは個別に設計していた,プロセッサ,メモリ,アナログ回路,専用回路(application specific circuits:ASIC)などの部品を一つのチップとして設計するようになってきました.また,設計期間を短縮するために,設計するチップ上で実行されるソフトウェアも同時に開発されるようになってきました.つまり,このことは,「システム全体」を設計することを意味しています.現状では,性能とコスト,消費電力,サイズなどの制約条件をすべて満たすためには,システム全体を1チップ化することが不可欠となっています.このようにシステム全体を1チップに実装することをSoC(System on Chip)と呼びます.

 システムの設計は,プロセッサやASICなどの設計に比べて,はるかに規模が大きくなります.また,システムの機能のうち,どの機能をハードウェアで実現するか,どの機能をソフトウェアで実現するかを決める問題もあります.そのため,これまでの設計に比べて,システム設計は複雑で,設計期間も長くなってしまいます.そこで,システムを効率良く設計する手法の開発が求められるようになってきました.この要求に対する一つの答が,SystemCなのです.

SystemCとプログラミング言語の違い

 上記でも述べましたが,SystemCは,C++言語をベースにしたシステムレベル設計言語です.このSystemCとプログラミング言語であるC++言語との違いはどこにあるのでしょうか? また,ハードウェアの設計に用いられているVerilog-HDLやVHDLといったハードウェア記述言語(Hardware Discription Language:HDL)とはどこが違うのでしょうか? そこで,まずSystemCとプログラミング言語との違いについてみていきましょう.

・並列動作の記述

 C++言語やC言語に限らずほとんどのプログラミング言語では,記述した処理が逐次的に処理されていきます.一方ハードウェアでは,逐次的に動作する部分もありますが,ほとんどの処理は並列的に動作します.

 図1に示すような並列に動作する回路がシステム内にあるとします.これをプログラミング言語で記述した場合,図1に示すように回路Aと回路Bの動作は,それぞれ機能Aと機能Bとして記述することができます.しかし,プログラミング言語では記述した順番に処理されていくため,機能Aと機能Bは記述した順番で処理されることになります.したがって,回路Aと回路Bの動作を正確に記述することができません.SystemCではHDLと同様に,並列動作を記述するための構文が用意されていて,簡単に並列動作を記述することができます.

〔図1〕並列動作の記述
 

 並列に動作する回路Aと回路Bに対して,プログラミング言語では回路Aと回路Bの機能(動作)を記述することはできるが,記述した機能Aと機能Bの処理は記述した順番に処理されてしまう.そのため,プログラミング言語では並列動作する回路の処理を正確に記述することができない.

・データ型

 ソフトウェアでは,基本的に整数型や実数型のデータ型を中心に扱いますが,ハードウェアでの処理はビット型が中心になります.SystemCでは,ビット型とビットベクタ型をもっており,これらに対してビット連結,特定ビットの指定などさまざまな処理を行うことができます.また,ビット型やビットベクタ型を用いることによって,回路の入出力,回路内の信号線のビット幅を細かく指定することができます.

・信号への同期

 (システム内の)ハードウェアの多くは,クロック信号や制御信号に同期しています.ここでの同期とは,信号の値が変化したときに,動作を開始することを意味しています.プログラミング言語では,このような信号(変数)に同期した動作を記述しようとするとプログラムが複雑になってしまいます.一方,SystemCでは,信号(変数)の変化に反応する構文が用意されていますから,クロック信号や制御信号への同期を簡潔に記述することができます.

SystemCとハードウェア記述言語(HDL)の違い

 続いて,SystemCとHDLとの違いを見ていきます.

・記述の制限

 HDLは基本的に,ハードウェアを設計することを目的とした言語です.ですから,その記述は実際のハードウェアを表現していることになります.そのため,HDLの記述には多くの制限があります.

 たとえば,図2に示すように無限ループを記述した場合,無限ループ内に記述したハードウェアが無数に存在することを意味します.したがって,文法上の問題はなくても,無限ループを記述することはできません.これと同じ理由で,何回ループするかわからないwhile文なども記述することはできません.SystemCでは,ソフトウェアの記述に関しては制限はありません.ただし,ハードウェアを記述する際には,上記の点について注意する必要があります.

〔図2〕無限ループは記述できない(してはいけない)

・シミュレーション時間

 HDLで記述したハードウェアをシミュレーションする際には,記述したハードウェアの動作を正確にシミュレーションします.そのため,回路の入力から出力に至るまでに通過する信号線やゲート回路 注1 の遅延時間を計算することになります.その結果,シミュレーションに非常に時間がかかってしまうことになります.とりあえず回路が正しく動作するかどうかだけを確認したい場合には,回路の動作時間などの情報は必要ありません.SystemCでは,そのような場合,プログラミング言語(C++言語)に近い記述で回路の動作を記述します.この場合,単純に信号の変化だけがシミュレートされるので,高速なシミュレーションを行うことができます.

SystemCの特徴

 またSystemCには,システムの設計を効率良く行うための機能が盛り込まれています.続いて,SystemCの特徴的な機能について見ていきましょう.

・通信と動作の分離

 システムの内部は,いくつかの機能ブロックに分けることができます.システムを設計する際には,分割した機能ブロックを個別に設計することになります.そして,機能ブロック間は何らかの方法でデータをやりとりする必要があります.このデータの送受信の方法を,各機能ブロック内で実装した場合には,データの通信方法が変更されるたびに,それぞれの機能ブロックの設計をやり直す必要があります.

 これを防ぐためSystemCでは,チャネル,インターフェース,ポートという概念を導入して,機能ブロックの動作と機能ブロック間の通信部分を完全に切り離して記述します.これによって,機能ブロックの動作と機能ブロック間の通信部分のそれぞれを独立に修正することができます.

・高精度,高速のシミュレーション

 先ほども解説しましたが,一般に,実際のハードウェアに近い記述をすると,回路内部の細かい部品の動作まで正確にシミュレーションできるため,精度の高いシミュレーション結果を得ることができます.しかし,その反面シミュレーションに非常に時間がかかってしまいます.一方,動作のみのソフトウェアに近い記述をすると,信号(変数)の変化だけをシミュレーションするため,高速にシミュレーションを行うことができます.しかしこの場合には,精度の高いシミュレーション結果を得ることができません.

 SystemCでは,ソフトウェアとハードウェアの両方を記述することができます.この特徴を生かして,システム全体をシミュレーションする際に,精度の高いシミュレーションを行いたい機能ブロックだけをハードウェアに近い記述にし,それ以外の機能ブロックをソフトウェアに近い記述にします.これによって,高精度かつ高速なシミュレーションを実現することができます.

 以上の説明から,SystemCは図3に示すように,プログラミング言語とHDLの両方の特徴を併せもっていることがわかります.

〔図9〕ROMモニタを使用した開発環境

注1:ゲート回路については,第2章を参照のこと.

以降の内容は本誌を参照ください

インデックス
序章 C/C++言語ベースのシステム設計の重要性
◆第1章 組み込みシステム開発の基礎知識

今月号特集トップページへ戻る


Copyright 2003 島尻寛之/吉田たけお