JP2001160080A - オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体 - Google Patents

オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体

Info

Publication number
JP2001160080A
JP2001160080A JP34395999A JP34395999A JP2001160080A JP 2001160080 A JP2001160080 A JP 2001160080A JP 34395999 A JP34395999 A JP 34395999A JP 34395999 A JP34395999 A JP 34395999A JP 2001160080 A JP2001160080 A JP 2001160080A
Authority
JP
Japan
Prior art keywords
class
bus
function
circuit
bus master
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP34395999A
Other languages
English (en)
Inventor
Hiroshi Ryu
浩史 笠
Yusuke Kato
雄祐 加藤
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NEC Corp filed Critical NEC Corp
Priority to JP34395999A priority Critical patent/JP2001160080A/ja
Priority to US09/726,618 priority patent/US6882966B2/en
Publication of JP2001160080A publication Critical patent/JP2001160080A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F30/00Computer-aided design [CAD]
    • G06F30/30Circuit design
    • G06F30/32Circuit design at the digital level
    • G06F30/33Design verification, e.g. functional simulation or model checking

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Evolutionary Computation (AREA)
  • Geometry (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Design And Manufacture Of Integrated Circuits (AREA)

Abstract

(57)【要約】 【課題】システムおよび回路モジュールの記述ならびに
各モジュール間の接続に関する記述や、システム、回路
モジュールの拡張、変更等を、より容易にかつ確実に行
うことができるようにする。 【解決手段】複数の回路モジュールからなるシステムを
ソフトウェアによってシミュレーションするシミュレー
ション方法において、オブジェクト指向言語を用い、基
本となるCPU、バスマスタI/F等の回路モジュール
をクラスとして記述した複数の回路基底クラス301〜304
をあらかじめクラスライブラリ300として用意してお
き、これらの回路基底クラス301〜304を継承すること
で、シミュレーションする回路モジュールをクラス101
〜103として記述し、クラス101〜103として記述した複
数の回路モジュールを組み合わせることで、シミュレー
ションするシステム記述104を作成する。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、例えばSOC(Sy
stem On a Chip)等の複数の回路モジュールから構成さ
れている大規模なシステムをソフトウェアによってシミ
ュレーションする際に用いて好適なオブジェクト指向言
語を用いたシステムのシミュレーション方法並びにシミ
ュレーション装置及びシミュレーションプログラムを記
録した記録媒体に関する。
【0002】
【従来の技術】システムを設計するときなどに用いられ
る従来のソフトウェア・シミュレータの一つにHDL
(Hardware Description Language;ハードウェア記述
言語)を用いたものがある。図37は、従来のHDLに
おける回路モジュール間の接続例を示す説明図であり、
(a)はHDLによる回路モデルの記述例を、そして
(b)は(a)の記述例に対応する模式図を示してい
る。HDLで記述された回路モジュールの入出力は、各
端子によって行われる。回路モジュールの間の通信は、
信号線を端子に接続することによって行われる。例え
ば、図37(b)に示すように、回路モジュールCの中
に回路モジュールAと回路モジュールBが存在する場合
に、回路モジュールAの端子a1と回路モジュールBの
端子b1を接続するには、回路モジュールCの中に信号
線c1を作り(図37(a)の)、回路モジュールA
の端子a1を回路モジュールCの信号線c1に接続し
()、そして、回路モジュールBの端子b1を回路モ
ジュールCの信号線c1に接続することで行われる
()。信号線が接続されると、一方のシミュレーショ
ンモデルがその信号線をドライブし、他方のシミュレー
ションモデルがその信号値を観測することで、信号伝播
を行うことができる。回路モジュール間を正しく通信さ
せるには、一方の回路モジュールの端子を他方の回路モ
ジュールの端子に正しく接続する必要がある。
【0003】ここで、複数の回路モジュールからなるシ
ステムを設計する場合に、HDL等によるソフトウェア
シミュレータを用いるときの一般的な設計手順について
説明する。まず、システムを複数の回路モジュールに分
割する。このとき、後で結合することを考え、各回路モ
ジュールのインターフェースの規約を定める。インター
フェースの規約とは、ある回路モジュールのどの端子が
どのような信号線幅を持ち、どのような役割をするかを
記したものである。この規約は、複数の設計者の間で共
有できるようにするため、自然言語で文書に記述される
か、口頭で伝えられ、各回路モジュールはこの規約に従
って作成される。
【0004】すべての回路モジュールが作成されたら、
各回路モジュールが互いに通信を行うように組み合わせ
て、HDLによってシステムを作成(記述)する。各回
路モジュールが規約に従っているかどうかは、目視か、
実際にシステムのシミュレーションを行って結果を観測
することで行われる。シミュレーション結果が正しいこ
とが確認されたら、このHDL記述を元に実際の回路を
作成する。
【0005】
【発明が解決しようとする課題】ところで、上記のよう
な従来のHDL等によるソフトウェアシミュレーション
は、もともと小規模な回路モジュールあるいは回路シス
テムを検証するために開発されてきたものである。した
がって、高い集積度を有するLSI(Large Scale Inte
gration)等のSOCに適用するのには、いくつかの課
題が生じてきている。
【0006】例えば、2つの回路モジュールを接続する
場合には、回路モジュール双方の端子の役割を確認する
必要がある。しかしながら、従来のHDL等によるシミ
ュレータでは、この役割を確認するための作業が自動的
に行われるようにはなっていなかった。例えば、HDL
では端子の名前を自由に設定できるため、クロック、リ
セットなどの、ある決まった意味を持つ端子について、
その名前が回路モジュール毎にばらばらになる可能性が
ある。その場合、端子間を信号線で接続する際には、回
路モジュール毎にどの端子がどの意味を持つかを、HD
L記述と、他の文書などを、人間が目視により照合して
確認する必要がある。このため、複数の回路モジュール
を接続してシステムを組み上げるときに、モジュール間
の接続確認のために設計者に面倒な手作業を強いること
となっていた。
【0007】また、回路モジュールを接続する場合に
は、各回路モジュールごとに接続先の回路モジュールの
すべての端子について記述する必要があるため、一旦記
述した接続を変更する場合等に多数箇所の記述を変更す
る必要があるという課題があった。例えばHDLでは、
仮にある回路モジュールのクロック端子だけに入力を与
えれば良い場合でも、その回路モジュールのすべての端
子について、それらを接続するかしないかを記述する必
要がある。つまり、接続先を変更する度に、接続先の回
路の詳細な情報を記述しなくてはならない。このため、
システムを構成する回路モジュールを入れ換える場合等
に、面倒な作業が必要となっていた。
【0008】一方、上述したような従来のHDL等によ
るソフトウェアシミュレーションと異なる技術であっ
て、複数のモジュールによるシステムの開発により適し
たシミュレーション方法を提供するための技術が、文献
『OO-VHDL Object-Oriented Extensions to VHDL』(IE
EE Computer,Oct. 1995,pp. 18-26)に提案されてい
る。この文献に記載されているシミュレーション方法
は、従来のHDLにオブジェクト指向言語の特徴を組み
入れた新たな言語を用い、各モジュールおよび各モジュ
ール間の接続を記述するものである。例えば、“クラ
ス”や“継承”といったオブジェクト指向言語の特徴を
利用することで、各モジュールの記述や再利用をより容
易にしようとする技術が記載されている。しかしなが
ら、この文献には、それに記載されているシミュレーシ
ョン方法あるいはモジュールの記述方法を種々の回路モ
ジュールを複数接続した大規模なシステムに適用する場
合の具体的な手法が示されていなかった。
【0009】また、大規模なシステムのシミュレーショ
ンに、オブジェクト指向言語の1つであるC++言語を
使用する方法が、文献『SOCの事前検証を実現するC
++シミュレータ「ClassMate」』(電子情報通信学
会、信学技報VLD98-46,1998-09)に提案されている。
しかしながら、この文献に記載されているシミュレーシ
ョン方法あるいはモジュールの記述方法は、オブジェク
ト指向言語の利点を十分に利用していなかった。そのた
め、各モジュールの再利用や各モジュール間の接続に関
しては、HDLと同様の問題が生じていた。
【0010】本発明は、具体的に、従来の技術にくら
べ、複数モジュールによって構成されるシステムをソフ
トウェアによってシミュレーションする際に、システム
および回路モジュールの記述ならびに各モジュール間の
接続に関する記述や、システム、回路モジュールの拡
張、変更等を、より容易にかつ確実に行うことができる
ようにするためのオブジェクト指向言語によるシステム
のシミュレーション方法並びにシミュレーション装置及
びシミュレーションプログラムを記録した記録媒体を提
供することを目的とする。
【0011】
【課題を解決するための手段】上記課題を解決するた
め、請求項1記載の発明は、複数の回路モジュールから
なるシステムをソフトウェアによってシミュレーション
するシミュレーション方法において、オブジェクト指向
言語を用い、基本となる回路モジュールをクラスとして
記述した複数の回路基底クラスをあらかじめライブラリ
として用意しておき、ライブラリとして用意されている
回路基底クラスを継承することで、シミュレーションす
る回路モジュールをクラスとして記述し、クラスとして
記述した複数の回路モジュールを組み合わせることで、
シミュレーションするシステムの記述を行うことを特徴
としている。
【0012】また、請求項2記載の発明は、ライブラリ
に用意されている回路基底クラスを継承することで、シ
ステムをクラスとして記述することを特徴としている。
また、請求項3記載の発明は、少なくとも、クロック信
号に非同期で動作する回路を含む回路の性質を有するコ
ンポーネントクラスと、コンポーネントクラスを基本ク
ラスとする派生クラスであって、クロックに同期して動
作する回路の性質を有する同期モジュールクラスとを、
回路基底クラスとして、あらかじめライブラリに用意し
ておくことを特徴としている。
【0013】また、請求項4記載の発明は、さらに、バ
スの性質を有するバスクラスと、バスマスタの性質を有
するバスマスタクラスと、バススレーブの性質を有する
バススレーブクラスとを、同期モジュールクラスの派生
クラスとして記述された回路基底クラスとして、あらか
じめライブラリに用意しておくことを特徴としている。
また、請求項5記載の発明は、さらに、同期モジュール
クラスを基本クラスとするものであって、バスマスタイ
ンターフェースの性質を有するバスマスタインターフェ
ースクラスと、バススレーブインターフェースの性質を
有するバススレーブインターフェースクラスとを、回路
基底クラスとして、あらかじめライブラリに用意してお
くことを特徴としている。
【0014】また、請求項6記載の発明は、さらに、同
期モジュールクラスを基本クラスとするものであってバ
スマスタの性質を有するバスマスタクラスと、バスマス
タクラスを基本クラスとするものであって中央処理装置
の性質を有する中央処理装置クラスとを、回路基底クラ
スとして、あらかじめライブラリに用意しておくことを
特徴としている。また、請求項7記載の発明は、さら
に、同期モジュールクラスを基本クラスとするものであ
って、バスを含む回路の1階層の性質を有する階層クラ
スを、回路基底クラスとして、あらかじめライブラリに
用意しておくことを特徴としている。また、請求項8記
載の発明は、さらに、バススレーブクラスを基本クラス
とするものであってメモリの性質を有するメモリクラス
を、回路基底クラスとして、あらかじめライブラリに用
意しておくことを特徴としている。
【0015】また、請求項9記載の発明は、コンピュー
タを用い、請求項1〜8のいずれか1項に記載のシミュ
レーション方法を実行するシミュレーション装置であ
る。また、請求項10記載の発明は、請求項1〜8のい
ずれか1項に記載のシミュレーション方法をコンピュー
タを用いて実行する際に用いられるプログラムを記録し
た電子計算機読み取り可能な記録媒体である。
【0016】上述したように、本発明は、システムのシ
ミュレーションモデルを記述する方法に主要な特徴を有
している。本発明では、オブジェクト指向言語を用いて
システムを記述することを特徴としている。これによ
り、回路モジュールが持つべき性質を、クラス・ライブ
ラリとして用意することが可能となる。また、ユーザ
(設計者)が回路モジュールを記述する際は、この性質
を継承して記述することを可能としている。これらによ
り、(1)回路モジュールの差し替えが容易になる、回
路モジュール間の接続の正しさが自動で検査される、
(2)情報表示の仕組みを共通に使用することができ
る、(3)シミュレーション制御の仕組みを共通に使用
することができる、(4)回路のインターフェース部の
記述が十分であるかどうかを自動で検査できる等の利点
を得ることが可能となる。
【0017】
【発明の実施の形態】以下、図面を参照して本発明によ
るシミュレーション方法の実施の形態について説明す
る。なお、本実施の形態においては、シミュレーション
モデルをC++言語を用いて記述するものとする。ここ
で、C++言語およびこの説明において用いる用語の定
義について説明する。
【0018】[C++言語]
【0019】C++は、プログラミング言語の1つで、
オブジェクト指向言語に分類される。C++で用いられ
る用語に、クラス、メンバ関数(メソッド)、オブジェ
クト、継承、基本クラス、派生クラス、オーバーライド
(オーバーロード)、純粋仮想関数等がある。クラスと
は、ある性質を表すものである。この性質はメンバ関数
などによって記述される。メンバ関数とは、クラスに対
する操作を規定したものである。メンバ関数はメソッド
と呼ばれることがある。一般に、クラスClassXにメンバ
関数Function1という操作が許されているとき、クラスC
lassXはメンバ関数Function1を持つという。オブジェク
トとは、クラスを具現化した実体である。例えば、上記
クラスClassXを具現化してオブジェクトObjectXを得た
とき、オブジェクトObjectXをクラスClassXのオブジェ
クトという。オブジェクトはクラスに規定された性質を
持つ。例えば、図1に示すC++言語の記述例では、ク
ラスClassAはメンバ関数Function1とFunction2を持つの
で()、ObjectAもFunction1とFunction2を持つ
()。
【0020】継承とは、あるクラスの性質を別のクラス
に引き継ぐことを言う。具体的には、あるクラスに定義
されたメンバ関数がそのまま継承されたクラスにも定義
される。例えば、上記クラスClassAを継承して別のクラ
スClassBを作成した場合()、クラスClassAはメンバ
関数Function1を持つと規定されているので、ClassBはF
unction1について特に規定しなくても、暗黙的にFuncti
on1を持つことになる()。
【0021】基本クラスとは、継承される側のクラスの
ことである。上記例では、クラスClassAはクラスClassB
の基本クラスであるという()。派生クラスとは、継
承する側のクラスのことである。上記例では、クラスCl
assBはクラスClassAの派生クラスであるという。派生ク
ラスの定義は、で示す文のように、定義する派生クラ
ス名(クラスClassB)を予約語“class”にあとに記述
し、それに続いて“:(コロン)public 基本クラス名
(ClassA)”と記述することで行う。ここで“public”
は派生方法(基本クラスのメンバーへのアクセス方法
(公開派生))を指定する予約語である。派生クラスの
オブジェクトは、基本クラスのオブジェクトとして扱う
ことができる。例えば上記の例において、クラスClassB
のオブジェクトObjectBは、クラスClassAのオブジェク
トとしても扱うことができる()。
【0022】オーバーライドとは、すでに基本クラスで
定義されているメンバ関数の動作を、派生クラスで再定
義することをいう。例えば図1において、クラスClassA
ではメンバ関数Function2がどのような動作するかが定
義されているが(の“…”の部分(ただし詳細な記述
は省略))、派生クラスClassBではこの動作が好ましく
ないとする。このような場合、クラスClassBでメンバ関
数Function2を再定義することで、メンバ関数Function2
の動作を変更できる()。これを、クラスClassBでメ
ンバ関数Function2をオーバーライドするという。クラ
スClassBでメンバ関数Function2をオーバーライドすれ
ば、クラスClassBのメンバ関数Function2はクラスClass
Aのメンバ関数Function2と異なる動作をする。
【0023】あるクラスが持つメンバ関数のうち、その
クラスでは関数の処理の内容が定義されていないもの
を、純粋仮想関数と呼ぶ(;“関数=0”の形式で記
述)。純粋仮想関数を持つクラスのオブジェクトを生成
しようとするとコンパイル時にエラーとなる(;図1
の“//”はC++言語においてコメントを示す記号であ
る。)。純粋仮想関数を持つクラスは継承とともに用い
られる、派生クラス側で純粋仮想関数がオーバーライド
されることを前提としている((10))。
【0024】[前提事項]
【0025】次に、本実施の形態を実施する際、すなわ
ちシミュレーションを行う際に前提となる事項について
説明する。通常、システムを構築する場合には、役割毎
にシステムをいくつかのブロックに分ける。これらのブ
ロックを回路モジュールと呼ぶ。ここで、各回路モジュ
ールが他の回路モジュールとどのような通信を行うかを
決める。そして、これらの回路モジュールをそれぞれ個
別に設計する。すべての回路モジュールの設計が終了し
た後、これらの回路モジュールを組み上げ、1つのシス
テムにする。システムはこれらの複数の回路モジュール
が通信し合うことにより動作する。このようなシステム
のシミュレーションを行う手順は、以下の通りである
(図2)。
【0026】1.シミュレーション対象となるシステム
をC++言語により記述する。
【0027】(A)各回路モジュールのクラスを宣言す
る(図2の)。図2の例では、ユーザ作成クラスとし
て、CPUクラス101、バスマスタインターフェース
クラス102、バスクラス103を作成している。
【0028】(B)システム全体のシミュレーションモ
デル(システム記述104)を作成する()。まず、
システムに含まれる各回路クラスのオブジェクトを作成
する()。次に、各回路オブジェクト間を接続し、回
路オブジェクト間の通信を記述することで、システム全
体のシミュレーションモデルを記述する()。回路オ
ブジェクト間の接続は、一方の回路オブジェクトAのポ
インタを他方の回路オブジェクトBに渡すことにより行
う。また、回路オブジェクト間の通信は、例えば、一方
の回路オブジェクトAの関数を他方の回路オブジェクト
Bから実行することにより行う(図3参照)。図3は、
オブジェクトObjectBがオブジェクトObjectAから引数i
で示されるデータを取り込む(GetData)場合のC++
言語による記述例(a)とその模式図(b)を示してい
る。
【0029】(C)次に、回路の情報表示部を組み込
む。シミュレーションによる事前検証の段階では、例え
ばCPUやバスがどのような動作をしているかを知る必
要がある。例えば、現在CPUはソフトウェアのどの部
分を実行しているか、CPU上で動いているソフトウェ
アの各変数はどのような値になっているか、バスの占有
率はどれくらいか、バスをどのマスタが使用している
か、などである。これらの情報を表示する処理を行う記
述もシステムの記述に付加する。図2では、あらかじめ
ライブラリにとして用意しておいたCPUの情報を表示
するための記述を、CPU情報表示部105として、ま
た、バスの情報を表示するための記述を、バス情報表示
部106として、それぞれ、必要箇所に、また必要な変
更を加えて、システム記述104に取り込むこととして
いる。
【0030】2.シミュレーション制御部を組み込む。
【0031】シミュレーション実行中はユーザの指示に
応じて、システムをリセットしたり動作させたりする必
要がある。そこで、ユーザの指示に応じてシステムの制
御を行う機構(シミュレーション制御部107)をシス
テムの記述104に付加することでシミュレータソース
108を完成させる。
【0032】3.項目2.で記述したシミュレーション
モデル(シミュレータソース108)をC++コンパイ
ラ109でコンパイルして、シミュレータの実行形式
(シミュレータ110)を得る。
【0033】4.シミュレータ110を実行することに
より、シミュレーションを行う。
【0034】シミュレーションによりシステムの動作が
正しいことが確認されたら、このC++記述を元に実際
の回路を作成する。
【0035】[本発明による実施の形態の具体的構成]
【0036】本実施の形態で用いるクラスについて説明
する。本実施の形態では、図4のようなクラスを、クラ
ス・ライブラリとして用意する。本実施の形態では、図
4に示すように、回路全般に共通する性質を有するクラ
スCmComponent(コンポーネントクラス)、クロックに
同期して動作する回路の性質を有するクラスCmSyncModu
le(同期モジュールクラス)、バスマスタのメイン部の
性質を有するクラスCmBusMaster(バスマスタクラ
ス)、バススレーブのメイン部の性質を有するクラスCm
BusSlave(バススレーブクラス)、バスマスタインター
フェースの性質を有するクラスCmBusMstIntf(バスマス
タ・インターフェースクラス)、バススレーブインター
フェースの性質を有するクラスCmBusSlvIntf(バススレ
ーブ・インターフェースクラス)、バスの性質を有する
クラスCmBusSystem(バスクラス)、CPUの性質を有
するクラスCmCpu(CPUクラス)、メモリの性質を有
するクラスCmMemory(メモリクラス)、そして、バスを
含む回路の1階層の性質を有するクラスCmHier(階層ク
ラス)を定義することとする。
【0037】本発明においては、あらかじめライブラリ
として用意するこれらのクラスを、回路基底クラスと呼
ぶ。これらのクラスの間には、図5に示す継承関係があ
る。すなわち、図5においては、クラスCmSyncModule
(202)がクラスCmComponent(201)を継承し、
それ以外の各クラス(クラスCmBusMaster(203)、
クラスCmBusSlave(204)、クラスCmBusMstIntf(2
05)、クラスCmBusSlvIntf(206)、クラスCmBusS
ystem(207)、クラスCmHier(208))が、クラ
スCmSyncModule(202)を継承するように定義されて
いる。なお、図5では、各クラスの継承関係とともに、
各クラスが持つ主なメンバ関数の一覧を示しているが、
メンバ関数の詳細については後述する。また、図5に示
していないクラスCmCpu(クラス・CPU)は、クラスC
mBusMaster(203)を継承し、クラスCmMemory(クラ
ス・メモリ)は、クラスCmBusSlave(204)を継承す
るように定義されていることとする。
【0038】最初にシステムを回路モジュールに分割す
る段階では、各回路モジュールのシステムにおける役割
はすでに決まっているはずである。そこで、システムの
各回路モジュールに対応する回路クラスを記述する際
は、回路の役割に合った回路基底クラスをクラスライブ
ラリの中から選択して継承することにより、回路モジュ
ールのクラスを回路基底クラスの派生クラス(実回路ク
ラスあるいはユーザ作成クラス)として定義する。そし
て、それぞれの関数をオーバーライドすることにより、
所望の動作をする回路クラスを実現する。
【0039】例えば、実回路クラスの例としては、図6
のようなクラスが挙げられる。すなわち、PCI(Peri
pheral Component Interconnect)バスをモデル化する
際に用いられる3つのクラスのなかで、クラスCmBusMst
Intfを回路基底クラスとするクラスCmPciBusMstIntf、
クラスCmBusSlvIntfを回路基底クラスとするクラスCmPc
iBusMstIntfおよびクラスCmBusSystemを回路基底クラス
とするクラスCmPciBusMstIntf、V850(商標)CP
Uをモデル化する際に用いられるクラスCmCpuを回路基
底クラスとするクラスCmV850などが一例として挙げられ
る。
【0040】システムに含まれる各回路クラスを作成し
た後は、これらを含むシステムを1つのクラスとして記
述する。このシステムのクラスには、上で作成した各回
路クラスのオブジェクトが含まれる。また回路情報表示
部もシステムのクラスに組み込む。このシステムのクラ
スも各回路クラスと同様に、システムの性質に合った回
路基底クラスをクラスライブラリの中から選んで、継承
する。
【0041】上記本発明に基づくシミュレーションの方
式は、以下のようになる。図7に一例を示す。
【0042】1.シミュレーション対象となるシステム
をC++言語により記述する。
【0043】(A’)各回路モジュールのクラスを宣言
(作成)する。ここで、各回路モジュールのクラスは、
あらかじめ作成しておいた複数の回路基底クラスからな
るクラスライブラリ300の中からそれぞれに適した回
路基底クラスを継承することによって宣言する。図7の
例では、ユーザ作成CPUクラス101をCPU回路基
底クラス(クラスCmCpu)301を継承することで宣言
し、ユーザ作成バスマスタインターフェースクラス10
2をバスマスタインターフェース回路基底クラス(クラ
スCmBusMstIntf)302を継承することで宣言し、そし
て、ユーザ作成バスクラス103をバス回路基底クラス
(クラスCmBusSystem)303を継承することで宣言し
ている。
【0044】(B’)次に、システムのクラスを作成す
る。ここで、システムのクラスも、クラスライブラリ3
00の中からそれに適した回路基底クラスを継承するこ
とによって作成する。図7の例では、同期回路回路基底
クラス(クラスCmSyncModule)304を継承することで
作成している(図7の’)。
【0045】(C’)次に、回路の情報表示部(CPU
表示部105およびバス情報表示部106)を組み込
む。
【0046】なお、上記各手順(A’),(B’),
(C’)は、クラスライブラリ300に定義されている
回路基底クラスを継承することで各回路モジュールを示
すクラスおよび複数の回路モジュールからなるシステム
のクラスを作成する点を除いて、基本的な内容は、図2
を参照して上記[前提事項]の欄で述べた手順(A),
(B),(C)と同様である。また、図7では、図2に
示すものに対応する構成に、同一の符号を付けている。
【0047】2.次に、シミュレーション制御部107
を組み込み、シミュレータソース108を作成する。
【0048】3.項目2.の記述をC++コンパイラ1
09でコンパイルして、シミュレータの実行形式110
を得る。
【0049】4.これを実行することにより、シミュレ
ーションを行う。
【0050】本実施の形態では、システムが回路基底ク
ラスを継承していることにより、システムも所定の回路
モジュールの性質を持つ。したがって、あるシステム
を、別のシステムに含まれる回路モジュールとして用い
ることが可能になる。つまり、階層的にシステムを記述
することが可能である。階層的にシステムを記述した場
合についても本発明の効果が得られる。
【0051】[回路基底クラス詳細]
【0052】次に、図4に示す回路基底クラスについて
詳細に説明する。
【0053】(1)CmComponentクラスは、以下の関数
を持ち、クロックを持たない組合せ回路を記述する際に
用いられる。
【0054】・Reset関数を持つ。これは回路の非同期
リセットに用いられる。
【0055】・GetPinValue関数を持つ。これは他の回
路Xからこの回路Yの端子の信号値を読み取る際に、回
路Xによって実行される。
【0056】・SetPinValue関数を持つ。これは他の回
路Xからこの回路Yの端子に信号を印加する際に、回路
Xによって実行される。
【0057】Reset関数は、純粋仮想関数である。よっ
て、この関数はCmComponentを継承したクラスで処理の
内容を定義しなくてはならない。また、本実施の形態で
は、各回路間で端子を介して行う通信のほかに、バスを
介しての通信を行うことができるようになっている。こ
のバスを介して通信を行う場合については、CmBusMaste
rクラスやCmBusSlaveクラスを用いて高速にシミュレー
ションを行うようにする。したがって、バスを介しない
通信は上記GetPinValue関数とSetPinValue関数を用いて
記述することになる。
【0058】(2)CmSyncModuleクラスは、以下の関数
を持ち、クロックを持つ順序回路を記述する際に用いら
れる。
【0059】・Reset関数、GetPinValue関数、SetPinVa
lue関数を持つ。これらの意味はクラスCmComponentに同
じである。
【0060】・OneStep関数を持つ。これは回路を1ステ
ップ動作させるために用いられる。OneStep関数は、純
粋仮想関数である。よって、この関数はCmSyncModuleを
継承したクラスで処理の内容を定義しなくてはならな
い。
【0061】(3)CmBusMasterクラスは、以下の関数
を持ち、バスマスタのメイン部を記述するときに使用さ
れる。ここでバスマスタとは、バスを能動的に駆動する
回路モジュールを記述するときに使用される。また下記
説明文中で参照されるバスマスタインターフェースと
は、バスの差違を吸収するためにバスとバスマスタの間
に挿入される回路モジュールである。
【0062】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はクラスCm
SyncModuleに同じである。
【0063】・ReadBusMaster関数を持つ。これはこの
オブジェクトからバスへ値を読み出す。
【0064】・WriteBusMaster関数を持つ。これはこの
オブジェクトへバスから来た値を書き込む。
【0065】・ConnectBusMstIntf関数を持つ。これは
バスマスタインターフェースを接続するために用いられ
る。
【0066】ReadBusMaster関数、WriteBusMaster関数
等は、純粋仮想関数である。よって、これらの関数はク
ラスCmBusMasterを継承したクラスで処理の内容を定義
しなくてはならない。
【0067】(4)CmBusSlaveクラスは、以下の関数を
持ち、バススレーブのメイン部を記述するときに使用さ
れる。ここでバススレーブとは、バスから受動的にデー
タを受け取る回路モジュールである。また下記説明文中
で、バススレーブインターフェースとは、バスの差違を
吸収するためにバスとバススレーブの間に挿入される回
路モジュールである。
【0068】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はクラスCm
SyncModuleに同じである。
【0069】・ReadBusSlave関数を持つ。これは、この
オブジェクトからバスへ値を読み出す。
【0070】・WriteBusSlave関数を持つ。これは、こ
のオブジェクトへバスから来た値を書き込む。
【0071】・ConnectBusSlvIntf関数を持つ。これは
バススレーブインターフェースを接続するために用いら
れる。
【0072】ReadBusSlave関数、WriteBusSlave関数等
は、純粋仮想関数である。よって、これらの関数はクラ
スCmBusSlaveを継承したクラスで処理の内容を定義しな
くてはならない。
【0073】(5)CmBusMstIntfクラスは、以下の関数
を持ち、バスマスタインターフェースを作成する際に使
用される。ここで、バスマスタインターフェースとは、
バスを能動的に駆動する際の、バスの差違を吸収する回
路モジュールである。
【0074】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はクラスCm
SyncModuleに同じである。
【0075】・IsBusReq関数を持つ。これは、このバス
マスタインターフェースがバスの使用を要求しているか
どうかを戻す。
【0076】・AssertBusGnt関数を持つ。これは、外部
の回路(通常アービタ)からこのバスマスタインターフ
ェースに対し、バスの使用を許可することを通知する。
【0077】・DiassertBusGnt関数を持つ。これは、外
部の回路(通常アービタ)からこのバスマスタインター
フェースに対し、バスを使用を許可しないことを通知す
る。
【0078】・AppendWriteData関数、StartWrite関
数、IsWriteEnd関数、AppendReadAddress関数、StartRe
ad関数、IsReadEnd関数、GetReadData関数を持つ。これ
らはクラスCmBusMasterオブジェクトからクラスCmBusSy
stemオブジェクトを制御するために使用される。
【0079】AppendWriteData関数は、データを書き込
むべきバススレーブのアドレス、書き込むべきデータ、
書き込むべきデータのバイト数を当該クラス内の所定の
変数領域(バッファ)に書き込む関数である。StartWri
te関数は、バスへのデータ等の書き込み動作を開始する
関数である。IsWriteEnd関数は、バスへのデータ等の書
き込み動作が終了したか否かの結果を戻す関数である。
AppendReadAddress関数は、データを読み出すべきバス
スレーブのアドレス、読み出すデータのバイト数を上記
バッファに書き込む関数である。StartRead関数は、バ
スからのデータの読み出し動作を開始する関数である。
IsReadEnd関数は、バスからのデータの読み出し動作が
終了したか否かの結果を戻す関数である。GetReadData
関数は、バススレーブから上記バッファに読み出したデ
ータをそのバッファから取り出す関数である。
【0080】(6)CmBusSlvIntfクラスは、以下の関数
を持ち、バスから受動的にデータを受け取る際の、バス
の差違を吸収する回路モジュールを記述するために使用
される。
【0081】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はクラスCm
SyncModuleに同じである。
【0082】・IsBusReq関数を持つ。これは、このバス
スレーブインターフェースがバスの使用を要求している
かどうかを戻す。
【0083】・AssertBusGnt関数を持つ。これは、外部
の回路(通常アービタ)からこのバススレーブインター
フェースに対し、バスの使用を許可することを通知す
る。
【0084】・DiassertBusGnt関数を持つ。これは、外
部の回路(通常アービタ)からこのバススレーブインタ
ーフェースに対し、バスを使用を許可しないことを通知
する。
【0085】・AppendWriteData関数、StartWrite関
数、IsWriteEnd関数、AppendReadAddress関数、StartRe
ad関数、IsReadEnd関数、GetReadData関数を持つ。クラ
スCmBusSystemの派生クラスからクラスCmBusSlvIntfへ
値を読み書きするために使用される。読み書きの対象が
異なることを除いて、これらの関数における基本的な機
能はクラスCmBusMstIntfの場合と同様である。
【0086】(7)CmBusSystemクラスは、以下の関数
を持ち、データをマスタからスレーブに伝達する回路モ
ジュールを記述するときに使用される。
【0087】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はクラスCm
SyncModuleに同じである。
【0088】・ConnectBusMstIntf関数を持つ。これは
クラスCmBusMstIntfの派生クラスをこのオブジェクトに
接続する。
【0089】・ConnectBusSlvIntf関数を持つ。これは
クラスCmBusSlvIntfの派生クラスをこのオブジェクトに
接続する。
【0090】・SetUserReadMap関数を持つ。これは、こ
のバスのバスリードマップを指定する際に使用される。
バスリードマップとは、バスを介して回路モジュールか
ら値を読み出すときに使われるアドレスマップである。
バスリードマップはCmHierクラスのUserReadMap関数と
して記述される。
【0091】・SetUserWriteMap関数を持つ。これは、
このバスのバスライトマップを指定する際に使用され
る。バスライトマップとは、バスを介して回路モジュー
ルへ値を書き込むときに使われるアドレスマップであ
る。バスライトマップはCmHierクラスのUserWriteMap関
数として記述される。
【0092】・SetUserArbitor関数を持つ。これは、こ
のバスのアービタを指定する際に使用される。アービタ
とは、バスの使用権を調停する回路である。この回路は
CmHierクラスのUserArbitor関数として記述される。
【0093】・ReadMap関数を持つ。これは、このバス
を介して回路モジュールから情報を取り出す。
【0094】・WriteMap関数を持つ。これは、このバス
を介して回路モジュールへ情報を書き込む。
【0095】(8)CmCpuクラスは、クラスCmBusMaster
を継承しており、以下の関数を持ち、CPUを記述する
ときに使用される。
【0096】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数、ConnectBusMstIntf関数を持
つ。これらの意味はクラスCmSyncModuleに同じである。
【0097】・ConnectBusMstIntf関数を持つ。これは
バスマスタインタフェースを接続するために用いられ
る。
【0098】・GetPc関数を持つ。これは現在のプログ
ラムカウンタの値を戻す。
【0099】・GetReg関数を持つ。これは指定されたレ
ジスタの値を戻す。
【0100】・SetReg関数を持つ。これは指定されたレ
ジスタの値を戻す。
【0101】・GetData関数を持つ。これは指定された
アドレスに格納されたデータを戻す。
【0102】・SetData関数を持つ。これは指定された
アドレスのデータを上書きする。
【0103】以上のように、CPUをモデルとする回路
基底クラスCmCpuにおいては、バスマスタをモデルとす
る回路基底クラスCmBusMasterを継承することで、クラ
スCmBusMasterで定義される関数を持つほか、GetPc関
数、GetReg関数、SetReg関数、GetData関数、およびSet
Data関数を持つことによって、プログラム実行時におけ
る各レジスタやプログラムカウンタの情報を取り出して
CPU情報表示部によって表示すること等が可能とな
る。
【0104】(9)CmMemoryクラスは、クラスCmBusSla
veを継承しており、以下の関数を持ち、メモリを記述す
るときに使用される。
【0105】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数、ConnectBusSlvIntf関数を持
つ。これらの意味はクラスCmBusSlaveに同じである。
【0106】・GetData関数を持つ。これは指定された
アドレスに格納されたデータを戻す。
【0107】・SetData関数を持つ。これは指定された
アドレスのデータを上書きする。
【0108】(10)CmHierクラスは、クラスCmSyncMo
duleを継承しており、以下の関数を持ち、バスを含むシ
ステムを記述するときに使用される。
【0109】・Reset関数、GetPinValue関数、SetPinVa
lue関数、OneStep関数を持つ。これらの意味はCmBusSla
veに同じである。
【0110】・UserReadMap関数を持つ。これは、この
システムに含まれるバスのバスリードマップを記述する
際に使用される。ここで記述されたバスリードマップは
CmBusSystemクラスのSetUserReadMap関数により、バス
に登録される。
【0111】・UserWriteMap関数を持つ。これは、この
システムに含まれるバスのバスライトマップを記述する
際に使用される。ここで記述されたバスライトマップは
CmBusSystemクラスのSetUserWriteMap関数により、バス
に登録される。
【0112】・UserArbitor関数を持つ。これは、この
システムに含まれるバスのアービタを記述する際に使用
される。ここで記述されたアービタはCmBusSystemクラ
スのSetUserArbitor関数により、バスに登録される。
【0113】次に、本実施の形態においてバスを介して
データを伝送する場合のシステムの記述例について説明
する。ここで、システムの記述例を説明する前に上述し
たアドレスマップとアービタについて簡単に説明する。
【0114】アドレスマップとは、どのアドレスに対し
てどの回路が割り当てられているのかを示した表であ
る。アービタとは、複数のバスマスタがバスを使用した
いと要求したときに、どのバスマスタに使用権を与える
かを調停する回路である。これらは、一般に良く知られ
ているものである。
【0115】まず、アドレスマップについて説明する。
バスにはたくさんの回路が接続されている。そのため、
バスにただデータを流しただけでは、どの回路に対する
指示なのかを判断することができない。そこで、回路を
指定するためにアドレスを用いている。バスには、デー
タとアドレスが必ず対にして流される。また、アドレス
がどのような値のときはデータをどの回路に渡すかとい
うことを決めておく。このアドレスと回路の対応関係が
アドレスマップである。
【0116】バスにデータとアドレスを対にして流すこ
とは、本実施の形態においては、クラスCmHierのUserRe
adMap関数およびUserWriteMap関数にデータとアドレス
を対にして渡すことに対応している。アドレスマップ
は、本実施の形態においては、UserReadMap関数およびU
serWriteMap関数内に、渡されたアドレスに対応する回
路を判断し、その回路に対してデータを渡す、という処
理を書くことに対応している。
【0117】一方、アービタは、2つ以上のバスマスタ
がバスに接続されているときに必要になる。バスはただ
の信号線に信号を流すだけの仕組みである。よって、2
つ以上のバスマスタが同時にバスに信号を流すと、2つ
の信号が1つの信号線で衝突することになる。よって、
正しい値を目的の回路モジュールに伝えることができな
くなる。これを避けるため、アービタというものが使わ
れている。一般的に、アービタを使うときは、バスマス
タがバスに信号を流す前に、必ずアービタにバスの使用
を要求することになる。アービタは各バスマスタのから
要求を見て、どれか一つのバスマスタにだけバスの使用
を許可する。バスマスタはバス使用許可が来てはじめ
て、バスを使用できるようになる。
【0118】本実施の形態では、バスマスタを、バスマ
スタとバスマスタインターフェースに分割して構成して
いる。したがって、バスの使用要求/許可はアービタと
バスマスタインターフェースの間で行われる。
【0119】以下、図8〜図13を参照して、バスを介
したデータの通信例について説明する。図8は、この例
で用いるシステムABCの構成を示すブロック図であ
り、図9〜図13は、C++言語によるシステムの記述
例を示す一連のリストであって、図9〜図13の順に連
続している。
【0120】図8に示すように、この例では、システム
ABCを、PCIバス401を介して、2つのCPU
(CPU1(402)、CPU2(403))と、タイ
マ1(404)と、カウンタ1(405)とから構成し
ている。CPU1(402)、CPU2(403)、タ
イマ1(404)、およびカウンタ1(405)にはそ
れぞれPCIバス401とのインタフェースとなるイン
タフェース402a、403a、404a、および40
5aを設けている。なお、システムの記述例を説明する
際には、図8のシステムABCに、図示していない他の
回路が複数接続されているものとしてそれらの回路に関
する記述の記述位置についても説明する。
【0121】システム記述においては、まず、図9に示
すように、システムABCに対応するオブジェクトABC
をクラスCmHierを継承するものとして宣言している(図
9の)。次に、図8のPCIバス(401)に対応す
るPCIバスを、システムABCの中にユーザ作成クラス
(実回路クラス)CmPciBusSystem(回路基底クラスはク
ラスCmBusSystemであるとする。)として作成する(図
9の)。次に、図8のCPU1(402)、CPU2
(403)に対応するものとして、システムABCの中に
オブジェクトCpu1,Cpu2というクラスCmCpuによる2つ
のCPUを作成する(図9の)。また、オブジェクト
Cpu1,Cpu2はバスマスタなので、システムABCの中に、
バスマスタとしてのオブジェクトCpu1,Cpu2をバスに繋
ぐためのバスマスタインターフェースオブジェクトCpu1
BusMstIntf,Cpu2BusMstIntfを作成する(図9の;図
8のインターフェース402a,403aに対応)。こ
のとき、バスマスタインターフェースCpu1BusMstIntf,
Cpu2BusMstIntfは、ユーザ作成クラスでCmPciBusMstInt
f(クラスCmPciBusMstIntfの回路基底クラスはクラスCm
BusMstIntfであるとする。)によって作成される。
【0122】次に、システムABCの中にタイマ1(40
4)に対応するTimer1という回路を作成する(図9の
)。また、オブジェクトTimer1はバススレーブなの
で、システムABCの中に、オブジェクトTimer1をバスに
繋ぐためのバススレーブインターフェース(図8のイン
ターフェース404aに対応)を作成する(図9の
)。次に、システムABCの中にカウンタ1(405)
に対応するCounter1という回路を作成する(図9の
)。また、オブジェクトCounter1はバススレーブなの
で、システムABCの中に、オブジェクトCounter1をバス
に繋ぐためのバススレーブインターフェース(図8のイ
ンターフェース405aに対応)を作成する。ここで、
オブジェクトTimer1は、ユーザ作成クラスCmTimer1に基
づくものとして、オブジェクトCounter1は、ユーザ作成
クラスCmCounter1に基づくものとして作成されるが、ユ
ーザ作成クラスCmTimer1,CmCounter1は、ともにクラス
CmBusSlaveの派生クラスであるとする。また、それそれ
のバススレーブインターフェースオブジェクトTimer1Bu
sSlvIntf,Counter1BusSlvIntfは、ともにクラスCmBusS
lvIntfの派生クラスCmPciBusSlvIntfに基づいて宣言さ
れている。
【0123】また、他のモジュールについての記述は図
9のの位置に記述する。
【0124】次に、UserBusReadMap関数について記述す
る(図10の)。UserBusReadMap関数では、バスリー
ドマップを記述する。戻り値は、RDATAという構造体で
ある。RDATA.Statusは、0なら読みだし成功、1なら読
みだし失敗を意味する。RDATA.Dataは、読みだし成功の
ときだけ、読み出した値を戻す。また、ULONGは32bitの
信号値を意味する。UserBusReadMap関数は、アドレスad
dressの値を元に、値を読み出す回路を決めて、その回
路のバススレーブインターフェースの読みだし関数を実
行する。まず、戻り値を持つ変数vを構造体RDATAとして
定義する(図10の)。
【0125】次に、アドレス100から200までは、回路
(オブジェクト)Timer1から値を読み出すことに設定す
るための判定式を記述する(図10の)。判定式が真
の場合に実行されるものとして、オブジェクトTimer1Bu
sSlvIntfに対してAppendReadAddress関数を0,address-
100,byte_countの組を引数として実行することによっ
て、読み出すアドレスとバイト数を指定する(図10の
)。次に、オブジェクトTimer1BusSlvIntfに対してSt
artRead関数を実行して、値を読み出している(図10
の)。次に、IsReadEnd関数によって、読み出しが成
功したかどうかを調べ(図10の)、読みだしが成功
した場合には、v.Statusを0に設定して(図10の
)、オブジェクトTimer1BusSlvIntfに対してGetReadD
ata関数を実行することで、読み出した値を取り出し、
v.Dataに設定している(図10の)。一方、読み出し
が失敗した場合には、v.Statusに1を設定して復帰する
ようにしている(図10の)。ここでAppendReadAddr
ess関数、StartRead関数、IsReadEnd関数およびGetRead
Data関数を実行する場合には、第1引数には0を指定し
て、これらの関数の実行が通常の転送方法によるもので
あることを通知する。この第1引数は、後述するマスタ
とスレーブを入れ替えた転送方式(Split転送)と、通
常の転送方法とを区別するために用意されている。
【0126】また、回路Counter1に対しては、読み出し
アドレスを200から300までとして、回路Timer1のときと
同様の記述を行う(図10の(10)〜(11))。さらに、他
の回路に関して同様に記述する(図10の(12))。
【0127】次に、UserBusWriteMap関数によって、バ
スライトマップを記述する(図11の)。戻り値は、
int(整数)であり、0なら書き込み成功、1なら書き
込み失敗を意味することとする。また、引数addressとd
ataは、ともにULONG(32bit)の信号値である。
【0128】ここでは、アドレスaddressの値を元に、
値を書き込む回路を決めて、その回路のバススレーブイ
ンターフェースの書き込み関数を実行する(図11の
〜)。まず、アドレス100から200までは、回路Timer1へ
値を書き込むことにする(図11の)。オブジェクト
Timer1BusSlvIntfに対してAppendWriteData関数を0,(a
ddress-100),data,byte_countの組を引数として実行
し、書き込む情報を指定する(図11の)。次に、St
artWrite関数を実行して値を書き込む(図11の)。
次に、回路Timer1に対してIsWriteEnd関数を実行するこ
とで、書き込みが成功したかどうかを調べる(図11の
)。書き込みが成功した場合には、戻り値を0にし、
書き込みが失敗した場合には、戻り値を1にして復帰す
る。ここでAppendWriteData関数、StartWrite関数、お
よびIsWriteEnd関数を実行する場合には、上述したAppe
ndReadAddress関数などを実行する場合と同様に、第1
引数には0を指定して、これらの関数の実行が通常の転
送方法によるものであることを通知する。
【0129】次に、回路Counter1について記述する。回
路Counter1については、アドレス250から350までとし
て、回路Timer1のときと同様に記述する(図11の〜
(10))。また、他の回路についても同様に記載する(図
11の(11))。
【0130】次に、関数UserArbitorおいてアービタに
関する動作を記述する(図12の)。関数UserArbito
rの戻り値はvoid(なし)である。なお、バス使用許可
はバスマスタインターフェースに直に与えることとす
る。まず、オブジェクトCpu1BusMstIntfおよびオブジェ
クトCpu2BusMstIntfに対してIsBusReq関数を実行し、バ
ス使用要求をバスマスタインターフェースから直に取り
出す(図12の)。次に、ここではオブジェクトCpu1
がオブジェクトCpu2よりも優先するとして、判定を行い
(図12の)、Cpu1がバスを要求していたら、Cpu2が
バスを要求しているかどうかに関わらず、Cpu1にバスを
使用させる。すなわち、オブジェクトCpu1BusMstIntfに
対してAssertBusGnt関数を実行し、続いてオブジェクト
Cpu2BusMstIntfに対してDiassertBusGnt関数を実行し
て、Cpu1を使用可、Cpu2を使用不可とする(図12の
)。
【0131】一方、オブジェクトCpu1がバスを使用して
いない場合で、かつ、オブジェクトCpu2がバスを使用し
ようとしているときに(図12の)、Cpu1を使用不可
にして、Cpu2を使用可とする(図12の)。また、両
者から使用要求が出されていない場合には、両者を使用
不可に設定する(図12の)。
【0132】次に、システムABCの接続および動作を関
数ABC(void)内に記述する(図13の)。関数ABC(voi
d)は、C++言語の仕様によって、システムABCのオブ
ジェクトを作る時に呼ばれる関数(コンストラクタ;ク
ラス名と同一名称の関数)である。まず、各回路と各バ
スインターフェースを、ConnectBusMstIntf関数またはC
onnectBusSlvIntf関数によって接続するとともに、各バ
スインターフェースとPCIバスとをConnectBusMstInt
f関数によって接続する(図13の)。このとき、各
回路のバスインターフェースオブジェクトのアドレスを
引数とすることによって、PCIバスと各回路が接続さ
れる。また、他の回路についても同様に記述する(図1
3の)。
【0133】次に、オブジェクトPciBusSystemに対して
SetUserReadMapおよびSetUserWriteMap関数を実行する
ことで、アドレスマップを指定する(図13の)。こ
の関数を実行することによって、上述したアドレスマッ
プが、オブジェクトPciBusSystemに登録されることにな
る。このことで、PciBusSystemは、上述したアドレスマ
ップを使用できるようになる。
【0134】次に関数OneStepによって、システムABCが
1単位時間にどのような動作をするかを記述する(図1
3の)。システムABCは、システムのそれぞれの構成
要素が勝手に動くことによって動作する。したがって、
システムABCの階層ですることと言えば、それぞれのシ
ステムの構成要素を1単位時間動作させることだけであ
る(図13の(コメント文))。まず、PCIバスPc
iBusSystemに対して、OneStep関数を実行する(図12
の)。バスは信号線なので、本来はクロックは必要な
いが、デバグ機能として、クロックに同期して情報を取
り出せるようにするため、クロックを与えている。次
に、各オブジェクトCpu1BusMstIntf,Cpu2BusMstIntf,
Timer1BusSlvIntf,Counter1BusSlvIntf,Cpu1,Cpu2,
Timer1,Counter1に対してOneStep関数を実行して1単
位時間の動作を実行させる(図12の)。また、その
他の回路についても同様にOneStep関数を動作させる記
述を行う(図12の)。
【0135】以上の記述によってシステムABCのシステ
ム記述が完成する。本実施の形態では、この例のよう
に、各モジュール間を接続するバスを、バスシステム
と、バスマスタ・インターフェースまたはバススレーブ
・インターフェースとに分割して記述するとともに、各
オブジェクト(回路モジュール)をあらかじめ定めた継
承関係に基づいて記述することで、システムにおける各
オブジェクト間の接続インターフェースを統一化された
形態で記述することができる。
【0136】[回路基底クラスのヘッダファイル]
【0137】次に、上述した各回路基底クラスのうちの
主なもののヘッダファイルについて図14〜図23を参
照して説明する。なお、各図においては、符号“//”を
付したコメント行によって各記述の詳細な説明を行って
いる。なお、記述中“virtual void Reset(void) =
0;”(例えば図14)のように、“virtual”と“=0”
を付加した関数は、純粋仮想関数であり、そのクラスを
継承するクラスにおいてその関数の定義が必ず必要であ
ることを示している。また、各図では、理解をしやすく
するため、各関数の詳細な記述を省略してコメント行の
みとしている。各図の内容は次の通りである。
【0138】図14は、クラスCmComponentを定義する
記述である。クラスCmComponentでは、Reset関数を純粋
仮想関数として定義している。図15は、クラスCmComp
onentの派生クラスであるクラスCmSyncModuleを定義す
る記述である。クラスCmComponentでは、OneStep関数を
純粋仮想関数として定義している。なお、クラスCmSync
Moduleは、クラスCmComponentの派生クラスであり、ま
たクラスCmComponent内の関数のオーバーライドを行っ
ていないので、クラスCmComponentの関数についての定
義はそのまま取り込まれることになる。
【0139】図16は、クラスCmSyncModuleの派生クラ
スであるクラスCmBusMasterを定義する記述を示してい
る。図17は、クラスCmSyncModuleの派生クラスである
クラスCmBusSlaveを定義する記述を示している。図18
および図19は、クラスCmSyncModuleの派生クラスであ
るクラスCmBusMstIntfを定義する記述を示している。ク
ラスCmBusMstIntfの定義では、図19に示す“virtual
void OneStep(void) {…}”という仮想関数によって、
この回路を1ステップ動作させるための記述をクラスCm
SyncModuleで定義されたOneStep関数をオーバーライド
することで記述している。また、図18のAppendWriteD
ata関数、StartWrite関数、IsWriteEnd関数、およびApp
endReadAddress関数、ならびに、図19のStartRead関
数、IsReadEnd関数、およびGetReadData関数の引数とし
て、整数変数modeを設定することで、後述するマスタと
スレーブを入れ替えた転送方法(Split(スピリット)
転送)の動作を可能としている。図20および図21
は、クラスCmSyncModuleの派生クラスであるクラスCmBu
sSlvIntfを定義する記述を示している。図22は、クラ
スCmSyncModuleの派生クラスであるクラスCmBusSystem
を定義する記述を示している。そして、図23は、クラ
スCmSyncModuleの派生クラスであるクラスCmHierを定義
する記述を示している。
【0140】[バスシミュレーション方式]次にバスシ
ミュレーションの方式すなわち具体的なシミュレーショ
ンの動作について詳細に説明する。バスシミュレーショ
ンの基本的な方針は、次のようになっている。
【0141】●バスマスタはバスの細かい制御をバスマ
スタインターフェースに任せる。バスマスタは読み書き
すべきデータをすべて一気に瞬間にバスマスタインター
フェース内のバッファに登録する。
【0142】●バスマスタインターフェースからバスス
レーブまでの通信は、OneStep関数が実行されるたびに
実行される。
【0143】・バスマスタインターフェースはOneStep
が呼ばれるたびにデータを1つずつバッファから取り出
し、バスへ渡す。
【0144】・バスはバスリードマップ/バスライトマ
ップから、読み書きの対象となるバススレーブを判定
し、そのバススレーブに対応するバススレーブインター
フェースに読み書きの指示を出す。
【0145】・バススレーブインターフェースはバスか
ら来た指示に基づきバススレーブを読み書きし、結果を
バスに戻す。
【0146】・バスはバススレーブインターフェースか
ら戻された結果をバスマスタインターフェースに返す。
【0147】・バスマスタインターフェースはバスから
戻された結果を元に、次のOneStepでの動作を決める。
【0148】次に、上記の実施形態における具体的な関
数実行の流れを、データの書き込みの例で説明する。例
えば、図24に示すシステムXにおいて、バスマスタA
1、バスマスタインターフェースB1、バスC1、バススレ
ーブインターフェースD1、バススレーブE1がこの順に接
続されているものとする。このシステムにおいて、例え
ば、図25に示す2組の情報(アドレス/データ/バイト
数…0x00100000/0x00112233/4,0x00100004/0x44556677
/4)を、例えばCPU等の回路であるバスマスタA1か
ら、例えばメモリ等の回路であるバススレーブE1に書き
込むことにする。
【0149】なお、システムXならびに、バスマスタA
1、バスマスタインターフェースB1、バスC1、バススレ
ーブインターフェースD1、およびバススレーブE1に関す
る記述は、上述した対応する各クラスの性質を継承して
記述されているものとする。すなわち、システムXはク
ラスCmSyncModuleを、バスマスタA1はクラスCmBusMaste
rを、バスマスタインターフェースB1はクラスCmBusMstI
ntfを、バスC1はクラスCmBusSystem、バススレーブイン
ターフェースD1はクラスCmBusSlvIntfを、そして、バス
スレーブE1はクラスCmBusSlaveを、それぞれ直接あるい
はそれらをさらに継承するクラスを継承して作成されて
いるものとする。また、システムXのUserWriteMap関数
により、アドレス0x00100000および0x00100004はバスス
レーブインターフェースD1に対応づけられているものと
する。また、システムXの構築時に、バスC1のSetUserWr
iteMap関数を実行することにより、システムXのUserWri
teMap関数がバスC1のバスライトマップとしてすでに登
録されているものとする。また、いつも、バスマスタA
1、バスマスタインターフェースB1、バスC1、バススレ
ーブインターフェースD1、およびバススレーブE1それぞ
れに対しては、それぞれを1ステップ動作させる関数On
eStepが、システムXのOneStepの中から呼び出されてい
ることとする。
【0150】以上の構成において、図26に示すような
単位時間ごとの各時間1〜4におけるシステムXの動作
を図27〜図30を参照して説明する。
【0151】[時間1]
【0152】まず、時間1におけるシステムXの動作を
図27を参照して説明する。図27は、同一単位時間
(時間1)内における各回路の動作を時系列で示す図で
ある。時間1では、まず、バスマスタA1のOneStep関数
が実行される。そこでは、バスマスタA1が、バスマスタ
インターフェースB1の関数AppendWriteData(0,0x001000
00,0x00112233,4)を実行する。次に、バスマスタインタ
ーフェースB1は情報をバッファに保存しておく。次に、
バスマスタA1はバスマスタインターフェースB1のAppend
WriteData(0,0x00100004,0x44556677,4)関数を実行す
る。次に、バスマスタインターフェースバスマスタイン
ターフェースB1は情報をバッファに保存しておく。次
に、バスマスタA1はバスマスタインターフェースB1のSt
artWrite関数を実行する。次に、バスマスタインターフ
ェースB1は書き込みが要求されたことを覚えておく。次
に、バスマスタA1はバスマスタインターフェースB1のIs
WriteEnd関数を実行する。次に、バスマスタインターフ
ェースB1は、バスマスタA1に対してまだ書き込み動作中
であることを戻す。次に、バスマスタA1は待機状態とな
る。
【0153】バスマスタA1のOneStep関数が終了する
と、次に、バスマスタインターフェースB1のOneStep関
数が実行される。そこでは、バスマスタインターフェー
スB1はバスマスタA1から書き込みが要求されたので、バ
スの使用を要求する。これは次に外部からバスマスタイ
ンターフェースB1のIsBusReq関数が実行されたときの戻
り値を真にすることに対応する。ここで、バスマスタイ
ンターフェースB1のOneStep関数が終了する。
【0154】バスマスタインターフェースB1のOneStep
関数が終了すると、次に、バスC1のOneStep関数が実行
される。バスC1のOneStep関数は、まず、アービタを動
作させる。次に、アービタはバスマスタインターフェー
スB1のIsBusReq関数を実行する。次に、バスマスタイン
ターフェースB1はバスの使用を要求していることを戻
す。ここで、アービタはバスマスタインターフェースB1
にバスの使用を許可したとする。アービタはバスマスタ
インターフェースB1のAssertBusGnt関数を実行する。バ
スマスタインターフェースB1はバスを許可されたことを
覚えておく。ここで、バスC1のOneStep関数が終了す
る。
【0155】バスC1のOneStep関数が終了すると、次
に、バススレーブインターフェースD1のOneStep関数が
実行される。時間1では、バススレーブインターフェー
スD1のOneStep関数は、何も行わずに終了する。
【0156】バススレーブインターフェースD1のOneSte
p関数が終了すると、次に、バススレーブE1のOneStep関
数が実行される。ここでは、バススレーブE1固有の動作
をするが、バスに関しては何も動作しない。
【0157】[時間2]
【0158】次に、次の単位時間である時間2における
システムXの動作について図28を参照して説明する。
時間2では、時間1の場合と同様に、まず、バスマスタA1
のOneStep関数が実行される。ここでは、バスマスタA1
はバスマスタインターフェースB1のIsWriteEnd関数を実
行する。この場合、バスマスタインターフェースB1はま
だ書き込み動作中であることを戻す。次に、バスマスタ
A1は待機状態となる。
【0159】バスマスタA1のOneStep関数が終了する
と、バスマスタインターフェースB1のOneStep関数が実
行される。バスマスタインターフェースB1のOneStep関
数では、バスマスタインターフェースB1はバスの使用を
許可されたので、バスに書き込む。つまり、次の動作を
行う。バスマスタインターフェースB1はバッファから情
報を一つ取り出す。このとき、アドレス:0x00100000,
データ:0x00112233,バイト数:4である。次に、バスマ
スタインターフェースB1はバスC1のWriteMap(0x0010000
0,0x00112233,4)関数を実行する。
【0160】次に、バスC1のWriteMap関数は、以下の動
作を行う。バススレーブインターフェースD1のAppendWr
iteData(0,0x00100000,0x00112233,4)関数を実行する。
バススレーブインターフェースD1は与えられた情報をバ
ッファに蓄える。バススレーブインターフェースD1のSt
artWrite関数を実行する。バススレーブインターフェー
スD1はバススレーブE1のWriteBusSlave(0x00100000,0x0
0112233,4)関数を実行する。バススレーブE1は与えられ
た情報を内部に書き込む。書き込みが成功したかどうか
をバススレーブインターフェースD1に返す。ここでは成
功したことにする。バススレーブインターフェースD1の
IsWriteEnd関数を実行する。バススレーブインターフェ
ースD1からバススレーブE1への書き込みは成功したの
で、真となる。バススレーブインターフェースD1のIsWr
iteEnd関数の戻り値を戻す。
【0161】次に、バスマスタインターフェースB1は戻
り値から、情報が正常に書き込まれたことを知る。そこ
で、バッファの中身を1つ削除する。バスマスタインタ
ーフェースB1にはまだバッファに1つ情報があるので、
次のバスマスタインターフェースB1のOneStepの実行で
も同じことを行う。
【0162】バスマスタインターフェースB1のOneStep
関数が終了すると、バスC1のOneStep関数が実行され
る。時間2におけるバスC1のOneStep関数では、何も実行
されない。
【0163】次に、バスC1のOneStep関数が終了する
と、バススレーブインターフェースD1のOneStep関数が
実行される。時間2におけるバススレーブインターフェ
ースD1のOneStep関数では、何も実行されない。
【0164】次に、バススレーブインターフェースD1の
OneStep関数が終了すると、バススレーブE1のOneStep関
数が実行される。バススレーブE1のOneStep関数では、
バススレーブE1固有の動作をするが、バスに関しては何
も動作しない。
【0165】[時間3]
【0166】時間3では、図29に示すように、まず、
バスマスタA1のOneStep関数が実行される。バスマスタA
1のOneStep関数では、バスマスタA1はバスマスタインタ
ーフェースB1のIsWriteEnd関数を実行する。この場合、
バスマスタインターフェースB1はまだ書き込み動作中で
あることを戻す。ここで、バスマスタA1は待機状態とな
り、バスマスタA1のOneStep関数が終了する。
【0167】バスマスタA1のOneStep関数が終了する
と、バスマスタインターフェースB1のOneStep関数が実
行される。時間3のバスマスタインターフェースB1のOne
Step関数では、バスマスタインターフェースB1がバスの
使用を許可されているので、バスに書き込む動作を行
う。つまり、以下の動作を行う。
【0168】バスマスタインターフェースB1はバッファ
から情報を一つ取り出す。取り出される情報は、アドレ
ス:0x00100004,データ:0x44556677,バイト数:4の情報
である。次に、バスマスタインターフェースB1はバスC1
のWriteMap(0x00100004,0x44556677,4)関数を実行す
る。
【0169】ここで、バスC1のWriteMap関数は、以下を
処理を行う。まず、バスC1のWriteMap関数は、バススレ
ーブインターフェースD1のAppendWriteData(0,0x001000
04,0x44556677,4)関数を実行する。ここで、バススレー
ブインターフェースD1は与えられた情報をバッファに蓄
える。次に、バスC1のWriteMap関数は、バススレーブイ
ンターフェースD1のStartWrite関数を実行する。ここ
で、バススレーブインターフェースD1はバススレーブE1
のWriteBusSlave(0x00100004,0x44556677,4)関数を実行
する。ここで、バススレーブE1は与えられた情報を内部
に書き込む。そして、書き込みが成功したかどうかをバ
ススレーブインターフェースD1に返す。ここでは成功し
たことにする。次に、バスC1のWriteMap関数は、バスス
レーブインターフェースD1のIsWriteEnd関数を実行す
る。ここでは、バススレーブインターフェースD1からバ
ススレーブE1への書き込みは成功したので、真となる。
バスC1のWriteMap関数は、バススレーブインターフェー
スD1のIsWriteEnd関数の戻り値を戻す。
【0170】バスマスタインターフェースB1は戻り値か
ら、情報が正常に書き込まれたことを知る。そこで、バ
ッファの中身を1つ削除する。バスマスタインターフェ
ースB1のバッファには情報は無い。そこで、バスマスタ
インターフェースB1は書き込み動作を完了する。これ
は、次のバスマスタインターフェースB1のIsWriteEnd関
数の戻り値を真とすることに対応する。ここで、バスマ
スタインターフェースB1のOneStep関数が終了する。
【0171】バスマスタインターフェースB1のOneStep
関数が終了すると、バスC1のOneStep関数が実行される
が、ここでは何も処理がなされずに、OneStep関数が終
了する。
【0172】バスC1のOneStep関数が終了すると、バス
スレーブインターフェースD1のOneStep関数が実行され
るが、ここでは何も処理がなされずに、関数が終了す
る。
【0173】次に、バススレーブE1のOneStep関数が実
行されて、バススレーブE1が固有の動作をする。ただ
し、バスに関しては何も処理は行われない。
【0174】[時間4]
【0175】次に、時間4になると、図30に示すよう
に、バスマスタA1のOneStep関数が実行される。時間4の
バスマスタA1のOneStep関数では、バスマスタA1はバス
マスタインターフェースB1のIsWriteEnd関数を実行す
る。ここで、バスマスタインターフェースB1は書き込み
が終了したことを戻す。次に、バスマスタA1は次の動作
を始める。時間4では、バスマスタインターフェースB1
のOneStep関数、バスC1のOneStep関数、バススレーブイ
ンターフェースD1のOneStep関数が順次実行される。こ
れらのOneStep関数では何も処理が行われず関数が終了
する。次に、バススレーブE1のOneStep関数が実行され
る。バススレーブE1のOneStep関数では、バスに関して
は何も処理が行われず、バススレーブE1固有の動作のみ
が行われる。
【0176】以上の時間1〜時間4の動作によって図25
に示すデータの書き込みが完了する。
【0177】[Split(スピリット)転送について]次
に、バスを介したデータ転送の他の形態について説明す
る。通常バスは、バスマスタからバススレーブという方
向だけデータの読み書きの指示が送られる。ところが高
機能のバスには、バスマスタからバススレーブに対して
送られた読み書きの要求に対して、バススレーブが即座
に応答できない場合、一旦その通信を終了して、その後
改めて、今度はバススレーブからバスマスタへ、通常と
は逆の方向に、主体的に値を返すことがある。ここで
は、このような状況をSplit転送と呼ぶことにする。Spl
it転送とは、最初マスタからスレーブに指示が行った時
点から、それが一旦終了して、逆にスレーブからマスタ
へ指示が行くまでの、一連の動作を指す。Split転送は
高機能なバスに存在することが知られている。本実施形
態において、Split転送をシミュレーションする場合に
ついて説明する。
【0178】Split転送では、上記の例と、スレーブと
マスタの関係が全く逆になる。すなわち、
【0179】●バススレーブはバスの細かい制御をバス
スレーブインターフェースに任せる。バススレーブは読
み書きすべきデータをすべて一気に瞬間にバススレーブ
インターフェース内のバッファに登録する。
【0180】●バススレーブインターフェースからバス
マスタまでの通信は、OneStep関数が実行されるたびに
実行される。ここでは、以下の処理が行われる。
【0181】・バスマスタインターフェースはOneStep
関数が呼ばれるたびにデータを1つずつバッファから取
り出し、バスへ渡す。
【0182】・バスはバスリードマップ/バスライトマ
ップから、読み書きの対象となるバスマスタを判定し、
そのバスマスタに対応するバスマスタインターフェース
に読み書きの指示を出す。
【0183】・バスマスタインターフェースはバスから
来た指示に基づきバスマスタを読み書きし、結果をバス
に戻す。
【0184】・バスはバスマスタインターフェースから
戻された結果をバススレーブインターフェースに返す。
【0185】・バススレーブインターフェースはバスか
ら戻された結果を元に、次のOneStep関数での動作を決
める。
【0186】これらを可能にするため、バススレーブと
バスマスタの間で同じ機能が、バススレーブインターフ
ェースとバスマスタインターフェースとで同じ機能があ
れば良いことになる。そこで、本実施の形態では、バス
スレーブとバスマスタ、バススレーブインターフェース
とバスマスタインターフェースを同じ構造としている。
また、現在どちらの方向に通信が行われているか(つま
り、マスタ→スレーブかスレーブ→マスタか)を判定す
るために、AppendWriteDataなどの関数にはmodeという
引数が用意されている(図18、図19、図20、図2
1参照)。このmodeが1のときは、通常と全く逆の動作
をすることになっている。
【0187】[回路クラスの作成例]
【0188】次に、新たな回路クラスを作成する場合の
具体例を説明する。ユーザが新たなバスマスタインター
フェースクラスをCUserBusMstIntfという名前で作成す
る場合を考える。まず、新たなクラスCUserBusMstIntf
がCmBusMstIntfクラスを継承するものとして宣言する。
これにより、このクラスCUserBusMstIntfはCmBusMstInt
fクラスと同じ関数を持つことになる。次に、これらの
関数をオーバーライドして、所望の動作を実現する新た
なクラスCUserBusMstIntfを作成する。
【0189】新たな回路クラスを作成する場合の別の例
を示す。ユーザが新たなCPUクラスをCUserCpuという
名前で作成する場合を考える。まず、新たなクラスCUse
rCpuがCmCpuクラスを継承するものとして宣言する。こ
れにより、このクラスCUserCpuはCmCpuクラスと同じ関
数を持つことになる。次に、これらの関数をオーバーラ
イドして、所望の動作を実現する新たなクラスCUserCpu
を作成する。
【0190】[本実施の形態の主な効果]
【0191】効果1:回路モジュールの差し替えが容易
である。すなわち、システムを構成する回路モジュール
の一部分を差し替えた場合でも、他の回路モジュールの
記述を変更する必要がない。
【0192】効果2:回路モジュール間の接続の正しさ
が自動で検査される。すなわち、回路モジュールを誤っ
て接続すると、コンパイラでコンパイルする際にエラー
となる。
【0193】効果3:情報表示の仕組みを、同じ性質を
持つ回路モジュールの間で共通に使用することができ
る。すなわち、情報表示の仕組みを回路毎に別途に用意
する必要はない。
【0194】効果4:シミュレーション制御の仕組み
を、シミュレーション対象のシステム間で共通に使用す
ることができる。すなわち、 シミュレーション対象の
システムを変更しても、シミュレーション制御の仕組み
を変更する必要がない。
【0195】効果5:回路のインターフェース部の記述
が十分であるかどうかを自動で検査できる。すなわち、
不足している場合、コンパイラでコンパイルする際にエ
ラーとなる。
【0196】[上記効果が得られる理由]
【0197】〇効果1の理由
【0198】効果1の理由の理由について、図31〜図
33を参照して説明する。図31は、あるクラスClassX
の記述例(a)と、クラスClassXとクラスCmBusMstIntf
との関係の模式図(b)を示している。図31(a)に
示すように、クラスClassXに、回路基底クラスCmBusMst
Intfのオブジェクトと接続するための関数ConnectBusMs
tIntfを定義するとともに(図31(a)の)、回路
基底クラスCmBusMstIntfのオブジェクトBusMstIntfのAp
pendReadData関数およびStartRead関数を実行する(図
31(a)の,)。これによって、図31(b)に
示すように、クラスClassXのオブジェクトは、回路基底
クラスCmBusMstIntfを継承したクラスのオブジェクトの
AppendReadData関数およびStartRead関数を実行するこ
とが可能となる。
【0199】例えば、クラスClassXのオブジェクトObje
ctXと、回路基底クラスCmBusMstIntfの派生クラスであ
るクラスCmPciBusMstIntfのオブジェクトPciBusMstIntf
とを有するシステムを記述する場合、図32(a)に示
すように、オブジェクトObjectXをクラスClassXのオブ
ジェクトとして定義するとともに(図32(a)の
)、オブジェクトPciBusMstIntfをクラスCmPciBusMst
Intfのオブジェクトとして定義し(図32(a)の
)、さらに、オブジェクトObjectXをConnectBusMstIn
tf関数によってオブジェクトPciBusMstIntfに接続する
(図32(a)の)。これによって、図32(b)に
示すように、オブジェクトObjectXは、オブジェクトPci
BusMstIntfのAppendReadData関数およびStartRead関数
を実行することが可能となる。
【0200】また、図33(a)および(b)に示すよ
うに、オブジェクトObjectXに接続するバスマスタイン
ターフェースオブジェクトを、オブジェクトPciBusMstI
ntfから、共通の回路基底クラスCmBusMstIntfの派生ク
ラスであるクラスCUserBusMstIntfのオブジェクトUserB
usMstIntfに変更する場合は、システム記述(図33
(a))において、オブジェクトUserBusMstIntfをクラ
スCUserBusMstIntfとして宣言するとともに、オブジェ
クトObjectXのConnectBusMstIntf関数を実行する際の引
数を、オブジェクトPciBusMstIntfのアドレスからオブ
ジェクトUserBusMstIntfのアドレスに変更するだけでよ
い。この場合、図31(a)に示すオブジェクトClassX
の記述は、変更する必要はない。
【0201】以上のように、回路基底クラスが共通であ
る場合、例えば、すべてのバスマスタインターフェース
に対して回路基底クラスCmBusMstIntfが基本クラスとな
るように共通に定義されている場合、任意のクラスClas
sXでは、通信相手のバスマスタインターフェースがCmBu
sMstIntfクラスであると宣言しておけば、通信相手のバ
スマスタインターフェースが変更されたとしても、クラ
スClassXの記述を変更すること無しに、CmBusMstIntfク
ラスで定義されている手順によって、クラスClassXのオ
ブジェクトと変更後のバスマスタインターフェースとの
通信ができることになる。すなわち、ある回路モジュー
ルXに新たなバスマスタインターフェースクラスCUserBu
sMstIntfを接続する場合でも、回路モジュールXの記述
を変更する必要はなくなる。
【0202】一方、仮に回路基底クラスが存在しない場
合には、ある回路クラスXからクラスCUserBusMstIntfへ
指示を送る場合には、クラスXから指示を送る先がCUser
BusMstIntfクラスのオブジェクトであることを、クラス
Xの記述中に書かなくてはならない。従って、クラスXの
接続先を、従来のバスマスタインターフェースから、CU
serBusMstIntfに変更する場合、クラスXの記述を書き換
える必要がある。
【0203】次に、図34〜図36を参照して、上記と
は別の例を挙げて説明する。ある回路クラスClassYを考
える。クラスClassYは別の回路の端子から値を読み込ん
で、その値に基づいて動作を行うこととする。この場
合、回路基底クラスの考え方によれば、クラスClassYの
記述(図34(a))では、値を読み込む先の回路オブ
ジェクトがCmComponentクラスであると記述し(図34
(a)の)、このCmComponentクラスのオブジェクト
のGetPinValue関数を実行することによって端子から値
を読み込むことになる(図34(a)の)。ここで、
回路基底クラスの間にも継承関係が存在していることに
注意する。例えば、図35(a)および(b)に示すク
ラスCUserCpu(図35(a)の)がクラスCmCpuを継
承しているとすると、クラスCUserCpuはクラスCmCompon
entも継承していることになる。よって、クラスCmCompo
nentの性質を持つ。したがって、クラスCmComponentで
定義されているメンバ関数を使用することで、クラスCl
assYの記述を変更すること無く、CUserCpuオブジェクト
をClassYオブジェクトに接続することが可能となる。
【0204】このように、回路基底クラス間に継承関係
が存在していることにより、記述を変更することなく回
路モジュールの差し替えができる。
【0205】〇効果2の理由
【0206】例えば図36(a)および(b)に示すよ
うに、バスマスタインターフェースの回路基底クラスCm
BusMstIntfの派生クラスであるクラスCUserBusMstIntf
を、誤って関数ConnectBusSlvIntfでバススレーブクラ
スCmBusSlaveのオブジェクトBusSlaveに接続しようとし
た場合を考える。この場合、ConnectBusSlvIntf関数はC
mBusSlvIntfクラスを基本クラスに持つクラスしか接続
することができない。CmBusSlvIntfクラスを基本クラス
に持たないクラスを接続したコードをコンパイルしよう
としても、C++の仕様により、コンパイル時の型チェ
ックで、C++コンパイラがエラーを出力する。よっ
て、クラスCmBusSlvIntfを継承していないクラスCUserB
usMstIntfを誤ってクラスCmBusSlaveに接続しようとし
たことが正しく検出される(図36(a)の)。この
ように、誤って接続しようとしたときに必ずエラーが発
生するので、ユーザが正しい接続をする手助けとなる。
【0207】〇効果3の理由
【0208】CPUをモデルとするオブジェクトCpuの
情報表示部は、GetPc関数やGetReg関数などのオブジェ
クトCpuの内部状態を取り出す関数によって得られる情
報を、加工して、ユーザに内部情報として表示できるよ
うにしている。この情報表示部を、回路基底クラスCmCp
u内で定義するとともに、オブジェクトCpuがCmCpuクラ
スであると記述しておく。すると、CmCpuクラスを継承
して作られた回路Cpuは、すべてこの情報処理部をその
まま使用することができることになる。例えば新たなユ
ーザ作成クラスCUserCpuがクラスCmCpuを継承して作ら
れているとすると、クラスCmCpuで定義されている既存
のCPUの情報処理部をそのまま用いることができるよ
うになる。つまり、新たなCPUクラスCUserCpu用に新
たに情報表示部を用意する必要はない。
【0209】〇効果4の理由
【0210】一般に、システムはクロックを持つ順序回
路(クロック同期回路)となるので、クラスCmSyncModu
leの性質を持つ。そこで、シミュレーション制御部は、
システムがクラスCmSyncModuleであるとして、そのRese
t関数、OneStep関数などを実行することにより、シミュ
レーションを制御している。これにより、システムがク
ラスCmSyncModuleを継承している限り、どのようなシス
テムに対しても、1つのシミュレーション制御の仕組み
を共通に適用することができる。
【0211】〇効果5の理由
【0212】例えばバススレーブの場合、ReadBusSlave
関数やWriteBusSlave関数は、バスとの値の受け渡しに
用いられる関数であり、処理の内容が記述されている必
要がある。ここで、バススレーブの回路基底クラスCmBu
sSlaveでは、ReadBusSlave関数やWriteBusSlave関数が
純粋仮想関数となっている。よって、システムを構成す
るバススレーブの回路クラスでReadBusSlave関数やWrit
eBusSlave関数の記述漏れがあったとしても、クラスCmB
usSlaveを継承していれば、C++コンパイラでコンパ
イルを行う際に、純粋仮想関数がオーバーライドされて
いない旨のエラーが出力される。このように、必要な関
数の記述漏れを自動でチェックすることができる。
【0213】なお、上述した実施の形態は、本発明の実
施形態の一例であって、本発明の実施の形態は上述した
ものに限定されない。例えば、使用するオブジェクト指
向言語はC++言語に限定されるものではなく、JAV
A言語等、上述したC++言語による継承、クラス等の
オブジェクト指向技術を実現するための仕組みと同等の
ものを有するものであれば、それに変更可能である。ま
た、回路基底クラスは、上記のものに限定されず、任意
の回路モジュールの性質を有する新たなクラスを追加し
たり、あるいは上記のクラスを適宜統合したクラスを作
成すること等が可能である。
【0214】また、本発明によるシミュレーション方法
あるいはシミュレーション装置は、コンピュータとそれ
によって実行されるシミュレーションプログラムとによ
って実現することができ、そのコンピュータによって実
行されるプログラムは、コンピュータ読み取り可能な記
録媒体に記録して頒布することが可能である。
【0215】
【発明の効果】本発明によれば、オブジェクト指向言語
を用い、オブジェクト指向言語の継承、クラス分け等の
特徴を利用して複数モジュールによって構成されるシス
テムを記述することで、複数モジュールからなるシステ
ムをソフトウェアによってシミュレーションする際に、
システムおよび各回路モジュールの記述ならびに各モジ
ュール間の接続に関する記述や、システム、回路モジュ
ールの拡張、変更等を、従来に比べ、より容易にかつ確
実に行うことができるようになる。
【図面の簡単な説明】
【図1】 本発明の実施の形態で使用するC++言語に
ついて説明するための説明図
【図2】 本発明によるシミュレーション方法(装置)
の基本構成(本発明の前提となる構成)を示すブロック
【図3】 図2に示すシステム記述104を説明するた
めの説明図であって、C++言語による記述例(a)
と、図3(a)の記述例に対応する模式図(b)を示し
ている。
【図4】 本発明によるシミュレーション方法(装置)
の実施の形態において用いられる回路基底クラスの一覧
を示す図
【図5】 本発明の実施の形態における回路基底クラス
の階層関係図
【図6】 図4の回路基底クラスを基本クラスとして作
成される実回路クラスの一例を示す図
【図7】 本発明によるシミュレーション方法(装置)
の実施の形態を示すブロック図
【図8】 本発明の実施の形態におけるシステム記述の
例を説明する際に使用する回路システムの例を示すブロ
ック図
【図9】 本実施の形態における図8に示す回路システ
ムのシステム記述の一例を示す図であって、図9〜図1
3で一続きのシステム記述を示している。
【図10】 図9に続くシステム記述例を示す図
【図11】 図10に続くシステム記述例を示す図
【図12】 図11に続くシステム記述例を示す図
【図13】 図12に続くシステム記述例を示す図
【図14】 図4に示すクラスCmComponentの宣言文の
記述例を示す図
【図15】 図4に示すクラスCmSyncModuleの宣言文の
記述例を示す図
【図16】 図4に示すクラスCmBusMasterの宣言文の
記述例を示す図
【図17】 図4に示すクラスCmBusSlaveの宣言文の記
述例を示す図
【図18】 図4に示すクラスCmBusMstIntfの宣言文の
記述例を示す図であって、図18〜図19で一続きの記
述例を示している。
【図19】 図18に続く記述例を示す図
【図20】 図4に示すクラスCmBusSlvIntfの宣言文の
記述例を示す図であって、図20〜図21で一続きの記
述例を示している。
【図21】 図20に続く記述例を示す図
【図22】 図4に示すクラスCmBusSyetemの宣言文の
記述例を示す図
【図23】 図4に示すクラスCmHierの宣言文の記述例
を示す図
【図24】 本実施の形態におけるバスを介したデータ
転送のシミュレーション例を説明する際に用いるシステ
ムの構成を示すブロック図
【図25】 図24のシステムの構成において転送する
データ例を示す図
【図26】 図24のシステムを用いて、本実施の形態
におけるバスを介したデータ転送のシミュレーション例
を説明する際の動作タイミングを示すタイミング図
【図27】 図26の時間1における動作を時系列で説
明する説明図
【図28】 図26の時間2における動作を時系列で説
明する説明図
【図29】 図26の時間3における動作を時系列で説
明する説明図
【図30】 図26の時間4における動作を時系列で説
明する説明図
【図31】 本実施の形態における新たなクラスの作成
方法を説明する説明図であって、クラスの宣言文の記述
例(a)と、図31(a)の記述例に対応する模式図を
示している。
【図32】 図31に示すクラスClassXを用いたシステ
ム記述の一例を示す図であって、システムの記述例
(a)と、図32(a)の記述例に対応する模式図を示
している。
【図33】 図31に示すクラスClassXを用いたシステ
ム記述の他の例を示す図であって、システムの記述例
(a)と、図33(a)の記述例に対応する模式図を示
している。
【図34】 本実施の形態におけるクラスの他の作成例
を説明する説明図であって、クラスの宣言文の記述例
(a)と、図34(a)の記述例に対応する模式図を示
している。
【図35】 図34に示すクラスClassYを用いたシステ
ム記述の他の例を示す図であって、システムの記述例
(a)と、図35(a)の記述例に対応する模式図を示
している。
【図36】 本実施の形態におけるシステムの記述例を
説明する説明図であって、システムの記述例(a)と、
図36(a)の記述例に対応する模式図を示している。
【図37】 従来のHDLによる回路システムの記述例
を説明する説明図であって、回路システムの記述例
(a)と、図37(a)の記述例に対応する模式図を示
している。
【符号の説明】
101 ユーザ作成CPUクラス 102 ユーザ作成バスマスタI/Fクラス 103 ユーザ作成バスクラス 104 システム記述 105 CPU情報表示部 106 バス情報表示部 107 シミュレーション制御部 108 シミュレータソース 109 C++コンパイラ 110 シミュレータ 300 クラスライブラリ 301 CPU回路基底クラス 302 バスマスタI/F回路基底クラス 303 バス回路基底クラス 304 同期回路回路基底クラス

Claims (10)

    【特許請求の範囲】
  1. 【請求項1】 複数の回路モジュールからなるシステム
    をソフトウェアによってシミュレーションするシミュレ
    ーション方法において、 オブジェクト指向言語を用い、 基本となる回路モジュールをクラスとして記述した複数
    の回路基底クラスをあらかじめライブラリとして用意し
    ておき、 ライブラリとして用意されている回路基底クラスを継承
    することで、シミュレーションする回路モジュールをク
    ラスとして記述し、 クラスとして記述した複数の回路モジュールを組み合わ
    せることで、シミュレーションするシステムの記述を行
    うことを特徴とするシミュレーション方法。
  2. 【請求項2】 ライブラリに用意されている回路基底ク
    ラスを継承することで、システムをクラスとして記述す
    ることを特徴とする請求項1記載のシミュレーション方
    法。
  3. 【請求項3】 少なくとも、クロック信号に非同期で動
    作する回路を含む回路の性質を有するコンポーネントク
    ラスと、コンポーネントクラスを基本クラスとする派生
    クラスであって、クロックに同期して動作する回路の性
    質を有する同期モジュールクラスとを、回路基底クラス
    として、あらかじめライブラリに用意しておくことを特
    徴とする請求項1又は2記載のシミュレーション方法。
  4. 【請求項4】 さらに、バスの性質を有するバスクラス
    と、バスマスタの性質を有するバスマスタクラスと、バ
    ススレーブの性質を有するバススレーブクラスとを、同
    期モジュールクラスの派生クラスとして記述された回路
    基底クラスとして、あらかじめライブラリに用意してお
    くことを特徴とする請求項3記載のシミュレーション方
    法。
  5. 【請求項5】 さらに、同期モジュールクラスを基本ク
    ラスとするものであって、バスマスタインターフェース
    の性質を有するバスマスタインターフェースクラスと、
    バススレーブインターフェースの性質を有するバススレ
    ーブインターフェースクラスとを、回路基底クラスとし
    て、あらかじめライブラリに用意しておくことを特徴と
    する請求項4記載のシミュレーション方法。
  6. 【請求項6】 さらに、同期モジュールクラスを基本ク
    ラスとするものであって、中央処理装置の性質を有する
    中央処理装置クラスを、回路基底クラスとして、あらか
    じめライブラリに用意しておくことを特徴とする請求項
    3記載のシミュレーション方法。
  7. 【請求項7】 さらに、同期モジュールクラスを基本ク
    ラスとするものであって、バスを含む回路の1階層の性
    質を有する階層クラスを、回路基底クラスとして、あら
    かじめライブラリに用意しておくことを特徴とする請求
    項3〜6のいずれか1項に記載のシミュレーション方
    法。
  8. 【請求項8】 さらに、 バススレーブクラスを基本ク
    ラスとするものであってメモリの性質を有するメモリク
    ラスを、回路基底クラスとして、あらかじめライブラリ
    に用意しておくことを特徴とする請求項4又は5記載の
    シミュレーション方法。
  9. 【請求項9】 コンピュータを用い、請求項1〜8のい
    ずれか1項に記載のシミュレーション方法を実行するシ
    ミュレーション装置。
  10. 【請求項10】 請求項1〜8のいずれか1項に記載の
    シミュレーション方法をコンピュータを用いて実行する
    際に用いられるプログラムを記録した電子計算機読み取
    り可能な記録媒体。
JP34395999A 1999-12-02 1999-12-02 オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体 Pending JP2001160080A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP34395999A JP2001160080A (ja) 1999-12-02 1999-12-02 オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体
US09/726,618 US6882966B2 (en) 1999-12-02 2000-12-01 Method, and apparatus for simulating a system using an object oriented language

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP34395999A JP2001160080A (ja) 1999-12-02 1999-12-02 オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体

Publications (1)

Publication Number Publication Date
JP2001160080A true JP2001160080A (ja) 2001-06-12

Family

ID=18365569

Family Applications (1)

Application Number Title Priority Date Filing Date
JP34395999A Pending JP2001160080A (ja) 1999-12-02 1999-12-02 オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体

Country Status (2)

Country Link
US (1) US6882966B2 (ja)
JP (1) JP2001160080A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2002101564A1 (fr) * 2001-06-12 2002-12-19 Tops Systems Corporation Systeme multiprocesseur, procede permettant de le concevoir et systeme de multiprocesseur decrit en langage de description de materiel
JP2007156728A (ja) * 2005-12-02 2007-06-21 Hitachi Information & Communication Engineering Ltd 論理検証方法及び論理検証システム
JP2008269274A (ja) * 2007-04-20 2008-11-06 Meidensha Corp ソフトウェア開発支援システム、開発支援方法およびプログラム

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4529063B2 (ja) * 2001-03-30 2010-08-25 ルネサスエレクトロニクス株式会社 システムシミュレータ、シミュレーション方法及びシミュレーションプログラム
US7085703B2 (en) * 2001-11-30 2006-08-01 International Business Machines Corporation Count data access in a distributed simulation environment
WO2003091914A1 (en) * 2002-04-25 2003-11-06 Arc International Apparatus and method for managing integrated circuit designs
US20030212617A1 (en) * 2002-05-13 2003-11-13 Stone James S. Accounts payable process
AU2002313263A1 (en) * 2002-06-25 2004-01-06 Primegate Limited Logic verifying system, logic verifying method, computer program, and recording medium
FR2843213B1 (fr) * 2002-07-30 2004-12-24 Bull Sa Procede et systeme d'etablissement automatique d'un modele global de simulation d'une architecture
US20070271160A1 (en) * 2002-09-12 2007-11-22 The Pnc Financial Services Group, Inc. Accounts payable process
US7424703B1 (en) * 2003-04-01 2008-09-09 Cadence Design Systems, Inc. Method and system for simulation of mixed-language circuit designs
US8504992B2 (en) * 2003-10-31 2013-08-06 Sonics, Inc. Method and apparatus for establishing a quality of service model
US9087036B1 (en) * 2004-08-12 2015-07-21 Sonics, Inc. Methods and apparatuses for time annotated transaction level modeling
US20060036422A1 (en) * 2004-08-13 2006-02-16 Gryba John S Methods and systems for electronic device modelling
US7694249B2 (en) * 2005-10-07 2010-04-06 Sonics, Inc. Various methods and apparatuses for estimating characteristics of an electronic system's design
US8868397B2 (en) 2006-11-20 2014-10-21 Sonics, Inc. Transaction co-validation across abstraction layers
CN101918903B (zh) * 2008-01-18 2013-01-09 西门子公司 规划装置和技术设备规划方法
TW201027378A (en) * 2009-01-08 2010-07-16 Realtek Semiconductor Corp Virtual platform and related simulation method
US10198540B1 (en) * 2013-09-27 2019-02-05 Cadence Design Systems, Inc. System and method for profiling during an electronic design simulation
US10467366B2 (en) 2016-10-14 2019-11-05 Oracle International Corporation Methods and systems for simulating high-speed link designs
US11231948B2 (en) * 2018-10-18 2022-01-25 Sternum Ltd. Applying security mitigation measures for stack corruption exploitation in intermediate code files
US10930366B2 (en) * 2019-07-17 2021-02-23 Micron Technology, Inc. Storage device with test interface

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4965743A (en) * 1988-07-14 1990-10-23 The United States Of America As Represented By The Administrator Of The National Aeronautics And Space Administration Discrete event simulation tool for analysis of qualitative models of continuous processing system
US6135647A (en) * 1997-10-23 2000-10-24 Lsi Logic Corporation System and method for representing a system level RTL design using HDL independent objects and translation to synthesizable RTL code
US6237129B1 (en) * 1998-03-27 2001-05-22 Xilinx, Inc. Method for constraining circuit element positions in structured layouts
US6223142B1 (en) * 1998-11-09 2001-04-24 International Business Machines Corporation Method and system for incrementally compiling instrumentation into a simulation model

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2002101564A1 (fr) * 2001-06-12 2002-12-19 Tops Systems Corporation Systeme multiprocesseur, procede permettant de le concevoir et systeme de multiprocesseur decrit en langage de description de materiel
JP2007156728A (ja) * 2005-12-02 2007-06-21 Hitachi Information & Communication Engineering Ltd 論理検証方法及び論理検証システム
JP2008269274A (ja) * 2007-04-20 2008-11-06 Meidensha Corp ソフトウェア開発支援システム、開発支援方法およびプログラム

Also Published As

Publication number Publication date
US6882966B2 (en) 2005-04-19
US20010021903A1 (en) 2001-09-13

Similar Documents

Publication Publication Date Title
JP2001160080A (ja) オブジェクト指向言語によるシステムのシミュレーション方法、装置及びそのプログラムを記録した記録媒体
US5594741A (en) Method for control of random test vector generation
US7036114B2 (en) Method and apparatus for cycle-based computation
US6338109B1 (en) Microcontroller development system and applications thereof for development of a universal serial bus microcontroller
KR101035832B1 (ko) 집적 종단점 장치와, 집적 pci 익스프레스 종단점 장치및 pci 익스프레스 통신 시스템
US6571204B1 (en) Bus modeling language generator
CN112685240A (zh) 芯片子系统验证方法和装置
US20030149946A1 (en) Method of switching external models in an automated system-on-chip integrated circuit design verification system
CN103793263B (zh) 一种基于PowerPC处理器的DMA事务级建模方法
JP2008140405A (ja) 電子回路と制御プログラムとのコバリデーション方法
CN102184290B (zh) 嵌入式微处理器的周期精确和位精确系统级模型构建方法
US7228513B2 (en) Circuit operation verification device and method
US7552043B2 (en) Method, system and program product for selectively removing instrumentation logic from a simulation model
US20020183997A1 (en) Apparatus and method for specifying the configuration of mixed-language simulation models
US20170293702A1 (en) Modeling a bus for a system design incorporating one or more programmable processors
Chevalier et al. SPACE: A hardware/software SystemC modeling platform including an RTOS
CN1312583C (zh) 仿真装置和仿真方法
US20040153301A1 (en) Integrated circuit development methodology
Dong et al. Refinement-Based Verification of Device-to-Device Information Flow.
JP2004021907A (ja) 性能評価用シミュレーションシステム
US6460164B1 (en) Integration of externally developed logic in a memory mapped system
Ho Verification of the StarT-voyager bus interface units
Sokhatski Practical Aspects of Design Verification of Complex Chips
CN117762771A (zh) 一种验证平台搭建方法、电子设备及存储介质
Smart The Life Cycle of a Virtual Platform

Legal Events

Date Code Title Description
A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20020507