JP2008059192A - ハード・ソフト協調検証用シミュレータ - Google Patents
ハード・ソフト協調検証用シミュレータ Download PDFInfo
- Publication number
- JP2008059192A JP2008059192A JP2006234298A JP2006234298A JP2008059192A JP 2008059192 A JP2008059192 A JP 2008059192A JP 2006234298 A JP2006234298 A JP 2006234298A JP 2006234298 A JP2006234298 A JP 2006234298A JP 2008059192 A JP2008059192 A JP 2008059192A
- Authority
- JP
- Japan
- Prior art keywords
- time
- cpu
- simulation
- function
- tid
- 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
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Test And Diagnosis Of Digital Computers (AREA)
Abstract
【解決手段】ハードウエアとソフトウエアのシミュレーション・モデルとして生成された複数のスレッドに対応して、そのシミュレーション時刻を制御するためのタイムキーパーを設ける。各タイムキーパー12は、スレッド毎のシミュレーション時刻Tsimを保持する変数X、積算時間Tsumを保持する変数Y、及び中断時刻と対応する中断メソッドを格納する中断要求待ち行列Qを有し、スレッドから6種類のメソッド呼び出しに応じて変数x,yと待ち行列Qを管理し、必要な場合にSystemCシミュレータ11のwait関数を呼び出す。これにより、wait関数呼び出し回数が削減され、全体の処理時間が短縮できる。
【選択図】図1
Description
このシミュレータ10は、SystemCシミュレータをベースとしてハードウエアとソフトウエアの協調検証を行うもので、従来のSystemCシミュレータ11の前段に複数のタイムキーパー12を設けたものである。
sum_timeメソッド呼び出しを行うことによって進めるようになっている。
flush_timeメソッド呼び出しを行う。これにより、タイムキーパーtikの積算時間Tsumを引数とするSystemCシミュレータ11のwait関数を呼び出しが行われる。このwait関数呼び出しにより、SystemCシミュレータ11のカーネル内で管理している実行中のデバイスのシステム時刻Tsysが積算時間Tsumで指定される時間だけ進められると共に、実行可能なデバイスの内で最もシステム時刻Tsysの小さいデバイスに制御が渡されるコンテキスト切り替え制御が行われる。
sync_timeメソッド呼び出しを行うことにより、タイムキーパーdtikのシミュレーション時刻がsTsimに設定される。
デバイスにおけるシミュレーション時刻の制御は、そのデバイスに対応したタイムキーパーに対してsum_timeメソッド呼び出しを行うことによって実現される。
class cpu:public sc_module
{
public:
sc_port<tikIF,0>ctik //port to CPU Time Keeper
SC_CTOR(CPU){
SC_THREAD(main);
}
void main(void)
}
class tikIF:public sc_interface{
public:
virtual void break_time(uint64 bTsim,uint64 bTsys,void(TikIF::*method)())=0;
virtual void flush_time(void)=0;
virtual void sum_time(long time)=0;
virtual uint64 current_time(void)=0;
virtual void sync_time(uint64 sTsim)=0;
};
sc_port<tikIF,0>ctik; //port to CPU Time Keeper
SC_CTOR(CPU){
SC_THREAD(main);
}
cpu =new cpu(“cpu”); //CPUを生成
ctik =new tik(“ctik”); //CPU用タイムキーパーを生成
cpu->tik(*ctik); //CPUにCPU用タイムキーパーを接続
typedef enum{C_TID=0,P_TID=1,…
} tid_t;
void CPU::main(void){
tik[C_TID]->sum_time(cT1);
tik[C_TID]->sum_time(cT2);
tik[C_TID]->sum_time(cTK);
}
cTsumK=cT1+cT2+…+cTK
cTsimK=cTsum0+cTsumK=cT0+cT1+cT2+…+cTK
ハードウエアとソフトウエアの協調検証環境では、CPU、メモリ、周辺デバイスがバス経由で接続され、CPU上で動作するソフトウエアと周辺デバイスが協調して動作しながら処理を進める。バスに接続されるデバイスには、このバスに対して能動的にデータ転送を開始できるバスマスタと、受動的にバス要求を待つバススレーブがある。通常、CPUがバスマスタとなってデータ転送バス要求を出力し、バス経由でバススレーブであるメモリや周辺デバイスにアクセスすることで処理が進められる。ここでは、バスを経由したデータ転送のモデルを、トランザクションレベルでモデル化する場合の例を説明する。
class pdev: public sc_module
{
public:
sc_port<tikIF,0>tik; //タイムキーパーアクセスのためのポート
sc_port<busIF>bus; //バスアクセスのためのポート
SC_CTOR(pdev){
SC_THREAD(main);
}
}
cpu =new cpu(“cpu”); //CPUを生成
pdev =new pdev(“pdev”); //周辺デバイスを生成
bus =new bus(“bus”); //バスを生成
ctil =new tik(“ctik”); //CPU用タイムキーパーを生成
ptic =new tik(“ptik”); //周辺デバイス用タイムキーパーを生成
cpu->bus(*bus); //CPUにバスを接続
cpu->tik(*ctik); //CPUにCPU用タイムキーパーを接続
bus->pdev->(*pdev); //バスに周辺デバイスをスレーブとして接続
bus->tik(*ctik); //バスにCPU用タイムキーパーを接続
bus->tik(*ptik); //バスに周辺デバイス用タイムキーパーを接続
pdev->bus(*bus); //周辺デバイスにバスを接続
pdev->tik(*ctik); //周辺デバイスにCPU用タイムキーパーを接続
pdev->tik(*ptik); //周辺デバイスに周辺デバイス用タイムキーパーを接続
void bus::(long address,long data,tid_t tid){
addressをデコードして周辺デバイスpdevを選択し、
バスアービタによりバス権を獲得;
pdev->write(address,data,tid);
}
/*周辺デバイスにおけるwriteメソッドの記述例*/
void pdev::write(long address,long data,tid_t tid){
tid[tid]->sum_time(Tacc);
addressで指定されるレジスタにdataの書き込みを行う;
if(上記書き込みによって周辺デバイスが起動される場合){
tik[P_TID]->sync_time(tik[tid]->current_time());
notify(pdev_start);
}
}
void pdev::main(){
for(;;){ //以下の処理を繰り返す
Wair(pdev_start); //notify(pdev_start)が実行されるまで待つ
tik[P_TID]->sum_time(pT1); //ptikのシミュレーション時刻に経過時間pT1を加算
tik[P_TID]->sum_time(pT2); //ptikのシミュレーション時刻に経過時間pT2を加算
tik[P_TID]->sum_time(pTL); //ptikのシミュレーション時刻に経過時間pTLを加算
}
}
ポーリングは、周辺デバイスがその動作状況に応じて特定のレジスタの内容を更新し、CPUがバス経由でその特定のレジスタの内容を読み出すためのreadメソッドを呼び出すことで実現される。
pTsumL=pT1+pT2+…+pTL
pTsimL=pTsum0+pTsumL=pT0+pT1+pT2+…+pTL
pTsim0+(pT1+pT2+…+pTL-1)≦cTsimK≦pTsimL=pTsim0+(pT1+pT2+…+pTL)
tik[P_TID]->break_time(tik[C_TID]->currenttime()
,tik[C_TID]->current_sc_time()
,&TikIF::flush_time);
tik[C_TID]->flush_time();
バスには、複数のバスマスタが接続されることがある。例えば、複数のCPU間でバスを共有するときに、DMAC(Direct Memory Access Controller)のようにバスマスタとなり得る周辺デバイスをバスに接続する場合である。このような場合、複数のバスマスタ間のバス要求を調停するためのバスアービタが必要になる。
アドレスをデコードし、バススレーブのタイムキーパー識別子s-tidを決定;
tik[s_tid]->break_time(tik[m_tid]->current_time()
,tik[m_tid]->current_sc_time()
,&TikIF::flush_time);
スレッドの起動後、外部からの非同期イベントの発生をスレッドに通知したい場合がある。例えば、CPUが周辺デバイスを起動した後、周辺デバイスが割り込み信号によってCPUに割り込みを発生させ、周辺デバイスの状態をCPUに通知したいような場合である。
class cpu:public sc_module
{
public:
sc_port<tikIF>ctik; // port to CPU Time Keeper
SC_CTOR(CPU){
SC_THREAD(main); //mainスレッドを起動
SC_THREAD(inthdr); //割り込みハンドラを起動
}
void main(void);
void inthdr(void);
}
(1) CPUのmainスレッドによる周辺デバイスの起動
CPUのmainスレッドの記述例を以下に示す。
void cpu::main(void){
bus->write(address,data,C_TID); //周辺デバイススレッドを起動
intct1->no_wait_intreq(); //周辺デバイスからの割り込み要求待ち
tik[C_TID]->sum_time(cT1);
tik[C_TID]->sum_time(cT2);
tik[C_TID]->sum_time(cTK);
}
void intct1::no_wait_intreq(void){
cpu_wait_int=NO_WAIT_INT;
wait(intreq_start);
}
void intct1::wait_intreq(void){
cpu_wait_int=WAIT_INT;
wait(intreq_start);
}
typedef enum {NOJAIT_INT=O // no wait for interrupt request
,WAIT_INT=1 // wait for interrupt request
}wait_int_t;
cpu_wait_int変数は、割り込み要求処理スレッドint_requestで参照される。
周辺デバイスpdevは、CPUからのwriteメソッドによって起動された後、必要に応じてシミュレーション時刻を進める処理を行い、このCPUに対する割り込みを通知する必要が生じた際、割り込みコントローラintct1に対して割り込み通知を行う。
void pdev::write(1ong address,1ong data,tid_t tid){
tik[tid]->sum_time(Tacc);
addressで指定されるレジスタにdataの書き込みを行う;
if(上記書き込みによって周辺デバイスが起動される場合){
tik[P_TID]->sync_time(tik[tid]->current_time());
notify(pdev_start);
}
}
void pdev::main(){
for(;;){ //以下の処理を繰り返す
wait(pdev_start);//notify(pdev_start)が実行されるまで待つ
tik[PJID]->sum_time(pT1);//ptikのシミュレーション時刻にpT1経過時間を加算
tik[PJID]->sum_time(pT2);//ptikのシミュレーション時刻にpT2経過時間を加算
tik[PJID]->sum_time(pTL);//ptikのシミュレーション時刻にpTL経過時間を加算
//以下の手順によって割り込み要求をCPUに通知する。
tik[I_TID]->sync_time(tik[P_TID]->current_time());
intct1->intct1_start(); //割り込み要求を割り込コントローラに通知
tik[P_TID]->flush_time();
// 制御を割り込コントローラに渡す。
}
}
割り込みコントローラintct1におけるintct1_startメソッドは、下記の記述例に示すようにnotify(intct1_start)メソッド呼び出しによって、割り込みコントローラのint_contro1スレッドを起動する。
void intct1::intct1_start(){
notify(intct1_start);
}
void intct1::int_request(){
for(;;){
wait(intct1_start); //割り込みの発生を待つ
tik[I_TID]->suM_time(iT);//itikのシミュレーション時刻にiT経過時間を加算割り込み優先度判定を行う。
if(割り込み要求が許可された){
if(cpu_wait_int==NO_WAIT_INT)
tik[C_TID]->break_time(tik[I_TID]−>current_time() // 割り込み発生時刻をCPUの中断時刻に設定
,tik[I_TID]->current_sc_time() // 割り込み発生システム時刻を設定
,&TikIF::flush_time //flush_timeをCPUの中断メソッドに設定
else
tik[C_TID]=sync_time(tik[I_TID]->current_time(); //
notify(intreq_start); //
tik[I_TID]->flush_time(); //
notify(inthdr?start); //
}
}
}
Typedef enum{C_TID=0 //Time Keeper#1=CPU
,P_TID=1 //Time Keeper#2=Peripheral
,I_TID=2 //Time Keeper#3=Interrupt Controller
}tid_t; //time keeper id type
上記notify(intreq_start)メソッド呼び出しにより、CPUのmainスレッドは、intct1->no_wait_intreq()メソッド呼び出しによる周辺デバイスからの割り込み要求待ち状態が解除され、以降に続くsum_timeメソッド呼び出しによってシミュレーション時刻を進める。シミュレーション時刻が、上記break_timeメソッド呼び出しによって設定した中断時刻以上に達した場合、対応する中断メソッド(CPUタイムキーパーに対するflush_timeメソッド)呼ぴ出しによって、上記notify(inthdr_start)メソッド呼び出しによって起動された割り込みハンドラに制御が渡される。
下記にCPUの割り込みハンドラinthdrの記述例を示す。
void cpu::inthdr(){
for(;;){
intct1->wait_inthdr(); //割り込みコントローラによる割り込み通知待ち
tik[C_TID]->sum_time(hT1);
tik[C_TID]->sum_time(hT2);
tik[C_TID]->sum_time(hTM);
}
}
void intct1::wait_inthdr(void){
wait(inthdr_start);
}
割り込みハンドラ処理後のmainスレッド処理が再開される。
図9は、ステップ(3)において、break_timeメソッドを実行した際のシミュレーション時刻の様子を示している。
(cT1+cT2+…+cTK-1)≦(pT1+pT2+…+PTL)+iT≦(cT1+cT2+…+cTK)
(3-1) 割り込みコントローラにおいて、割り込み要求と割り込みを要求した周辺デバイスのシミュレーション時刻を割り込み要求待ち行列に格納する。
(3-2) 割り込みを要求した周辺デバイスに対してflush_timeメソッドを実行する。これにより、割り込みを発生する可能性のある他の周辺デバイスヘ制御が渡され、上記(3-1)からの処理が繰り返される。
(3-3) 割り込み要求待ち行列に格納された最も小さいシミュレーション時刻の割り込み要求のうち最も優先度の高い割り込み要求を選択する。
(3-4) 選択した割り込み要求が今回の周辺デバイスからの割り込み要求であるとき、次のステップ(3-5)へ進む。そうでないとき、つまり、他の周辺デバイスの割り込み要求が選択されたとき、周辺デバイスのスレッドを待ち状態にさせる。この待ち状態は、ステップ(3-5)において解除される。待ち状態が解除された後、ステップ(3-3)へ進む。
(3-5) 選択した割り込み要求による割り込みハンドラ処理が起動された時点で、他の割り込み要求の待ち状態をnotifyにより解除する。
割り込み制御(その1)の特殊な場合として、CPUが周辺デバイスのmainスレッドを起動した後、直ちに割り込みハンドラ待ちになる場合がある。このような場合、図11に示すように、CPUのmainスレッドにおける周辺デバイスのスレッド起動のためのバスアクセスを行った後、割り込みコントローラintct1に対してintct1->wait_intreqメソッド呼び出しを行い、cpu_wait_int変数にWAIT_INTの値を設定して割り込み要求の発生を待った後、wait(inthdr_end)関数を呼び出して割り込みハンドラの完了待ちとなる。
void CPU: :main (void){
bus->write(address,data,C_TID);//周辺デバイススレッドを起動
intct1->wait_intreq(); //割り込み要求待ち
wait(inthdr_end); //割り込みハンドラの終了待ち
tik[C_TID]->sum_time(cT1);
tik[C_TID]->sum_time(cT2);
tik[C_TID]->sum_time(cTK);
}
void cpu::inthdr(){
for(;;){
wait(inthdr_start);
tik[C_TID]->sum_time(hT1);
tik[C_TID]->sum_time(hT2);
tik[C_TID]->sum_time(hTM);
notify(inthdr_end); //割り込みハンドラの完了をmainスレッドに通知
}
}
上記2つの割り込み制御(その1及びその2)の拡張として、CPUのmainスレッドが周辺デバイスを起動した後、他の処理(例えば、次に周辺デバイスを起動するための準備)を実行しておき、次に周辺デバイスを起動する直前で、CPUが周辺デバイスからの割り込み通知があり、割り込みハンドラの実行が完了したかどうかを確認したい場合がある。
void CPU::main(void){
for(i=o; i<10; i++){
bus->write(address,data,C_TID); //周辺デバイススレッドを起動
intct1->no_wait_intreq(); //割り込みコントローラによる割り込み通知待ち
tik[C_TID]->sum_time(cT1);
tik[C_TID]->sum_time(cT2);
tik[C_TID]->sum_time(cTK);
if(!inthdr_end_flag) //既に割り込みハンドラ処理が完了しているとき
wait(inthdr_end); //割り込みハンドラの終了待ち
inthdr_end_flag=false;
}
}
void cpu: : inthdr O {
for(;;){
wait(inthdr_start);
tik[C_TID]->sum_time(hT1);
tik[C_TID]->sum_time(hT2);
tik[C_TID]->sum_time(hTM);
inthdr_end_flag=true;
notify(inthdr_end); //割り込みハンドラの完了をmainスレッドに通知
}
}
上記の割り込み制御(その1〜その3)では、いずれも割り込みコントローラや割り込みハンドラを独立したスレッドとしてインプリメントしている。このため、割り込みが発生する度にスレッド間のコンテキスト切り替えが発生し、シミュレーション速度が低下する。
void cpu::inthdr(){
tik[C_TID]->sum_time(iT);//CPUタイムキーパーのシミュレーション時刻に経過時間iTを加算
tik[C_TID]->sum_time(hTI);
tik[C_TID]->sum_time(hT2);
tik[C_TID]->sum_time(hTM);
}
void intct1::int_request(tid_t tid){
割り込み優先度判定を行う。
if(割り込み要求が許可された){
if(cpu_wait_int==NOJAIT_INT)
tik[C_TID]->break_time(tik[tid]->current_time()// 割り込み発生時刻をCPUの中断時刻として登録
,tik[tid]->current_sc_time()
,&TikIF::inthdr));//割り込みハンドラを中断メソッドとして登録
else
tik[C_TID]=sync_time(tik[I_TID]->current_time());//割り込み発生時刻をCPUの時刻に設定
notify(intreq_start);//CPUの割り込み待ち状態を解除
tik[tid]->flush_time();// CPUのmainスレッドに制御を渡す
}
}
void TikIF::inthdr(){
cpu->inthdr();
}
void pdev::main(){
for(;;){ //以下の処理を繰り返す
wait(pdev_start); //notify(pdev_start)が実行されるまで待つ
tik[P_TID]->sum_time(pT1);//ptikのシミュレーション時刻にpT1経過時間を加算
tik[P_TID]->sum_time(pT2);//ptikのシミュレーション時刻にpT2経過時間を加算
tik[P_TID]->sum_time(pTL);//ptikのシミュレーション時刻にpTL経過時間を加算
//以下の手順によって割り込み要求をCPUに通知する。
intct1->int_request(P_TID);//割り込みコントローラメソッドを呼び出す
}
}
・break_time(tid_t d_tid,uint64 bTsim,uint64 bTsys,void(TikIF::*method)())メソッド(第7の関数):タイムキーパー識別子d_tidで指定されるタイムキーパーに対して、break_time(bTsim,bTsys,method)メソッド呼び出しを行う。
・flush_time(tid_t tid)メソッド(第8の関数):タイムキーパー識別子tidで指定されるタイムキーパーに対して、flush_time(time)メソッド呼び出しを行う。
・sum_time(tid_t tid,1ong time)メソッド(第9の関数):タイムキーパー識別子tidで指定されるタイムキーパーに対して、sum_time(time)メソッド呼び出しを行う。
・current_time(tid_t tid)メソッド(第10の関数):タイムキーパー識別子tidで指定されるタイムキーパーに対して、current_timeメソッド呼び出しを行い、結果を戻り値として返す。
・sync_time(tid_t tid,uint64 sTsim)メソッド(第11の関数):タイムキーパー識別子tidで指定されるタイムキーパーに対して、sync_time(sTsim)メソッド呼び出しを行う。
void tiks::break_time(tid_td_tid,uint64 bTsim,uint64 bTsys,void(TikIF::*method)()){
tik[(d_tid]->break_time(bTsim,bTsys,method);
}
void tiks::flush_time(tid_t tid){
tik[tid]->flush_time();
}
void tiks::sum_time(tid_t tid,1ong time){
tik[tid]->sum_time(time);
}
uint64 tiks::current_time(tid_t tid){
return tik[tid]->current_time();
}
void tiks::sync_time(tid_t tid,uint64 sTim){
tik[tid]-〉sync_time(sTim);
}
class tiks
:public sc_module
,public tiksIF
{
public:
sc_port<tikIF,0〉tik; /*ports to CPU time keepers */
void break_time(tid_t d_tid,uint64 bTsim,uint64 bTsys,void(TikIF::*method)());
void flush_time(tid_t tid);
void sum_time(tid_t tid,1ong time);
uint64 current_time(tid_t tid);
void sync_time(tid_t tid,uint64 sTsim);
}
cpu = new cpu(“cpu”);
pdev = new pdev(“pdev”);
tdev = new tdev(“tdev”);
tiks = new tiks(“tiks”);
ctik = new tik(“ctik”);
ptik = new tik(“ptik”);
ttik = new tik(“ttik”);
cpu->tiks(*tiks);
pdev->tiks(*tiks);
tdev->tiks(*tiks);
tiks->ctik(*ctik);
tiks->ptik(*ptik);
tiks-〉ttik(*ttik);
void CPU::main(void){
tiks->sum_time(C_TID,cT1);
tiks->sum_time(C_TID,cT2);
tiks->sum_time(C_TID,cTK);
}
void pdev::write (1ong address,1ong data,tid_t tid){
tiks->sum_time(tid,Tacc);
addressで指定されるレジスタにdataの書ぎ込みを行う;
if(上記書き込みによって周辺デバイスが起動される場合){
tiks->sync_time(P_TID,tiks->current_time(tid));
notify(pdev_start);
}
}
void pdev::main() {
for(;;){ //以下の処理を繰り返す
wait(pdev_start); //notify(pdev_start)が実行されるまで待つ
tiks->sum_time(P_TID,pTI);//ptikのシミュレーション時刻にpT1経過時間を加算
tiks->sum_time(P_TID,pT2);//ptikのシミュレーション時刻にpT2経過時間を加算
tiks->sum_time(P_TID,pTL);//ptikのシミュレーション時刻にpTL経過時間を加算
}
}
・set_sleepメソッド(第12の関数):変数statusを休眠状態SLEEPに設定する関数である。
・set_activeメソッド(第13の関数):変数statusを動作状態ACTIVEに設定する関数である。
・get_statusメソッド(第14の関数):変数statusを戻り値として返す関数である。
void pdev::write(1ong address,1ong data,tid_t tid){
tik[tid]->sum_time(Tacc);
addressで指定されるレジスタにdataの書き込みを行う;
if(上記書き込みによって周辺デバイスが起動される場合){
tik[P_TID]->sync_time(tik[tid]->current_time());
tik[P_TID]->set_active(); //デバイスを動作状態に設定
notify(pdev_start);
}
}
void pdev::main(){
for(;;){ //以下の処理を繰り返す
wait(pdev_start); //notify(pdev_start)が実行されるまで特つ
tik[P_TID]->sum_time(pT1); //ptikのシミュレーション時刻にpT1経過時間を加算
tik[P_TID]->sum_time(pT2); //ptikのシミュレーション時刻にpT2経過時間を加算
tik[P_TID]->sum_time(pTL); //ptikのシミュレーション時刻にpTL経過時間を加算
//以下の手順によって割り込み要求をCPUに通知する。
tik[I_TID]->sync_time(tik[PJID]->current_time());
notify(intct1_start); //割り込み要求を割り込コントローラに通知
tik[P_TID]->flush_time(); //制御を割り込コントローラに渡す
tik[P_TID]->set_sleep(); //デバイスを休眠状態に設定
}
}
・switch_threads(tid_t
tid)メソッド:タイムキーパー識別子tidで指定されるタイムキーパー以外のデバイスが動作状態である場合に、タイムキーパー統合モジュールtiksに対してflush_time(tid)メソッドの呼び出しを行う。
void tiks::switch_threads(tid_t tid){
int i;
for(i=O; iくtik.size();i++){
if(tid==i)
continue;
if(tik[i]->get_status==ACTIVE){
tik[tid]->flush_time();
return;
}
}
}
(a) SystemCシミュレータをC言語ベースのシミュレータ本体として使用した例を示したが、SpecC等のハードウエアモデル記述用言語によるシミュレータを使用することができる。
(b) 関数や引数の名称は一例である。
(c) 図2〜図13の動作説明は一例であり、シミュレーション対象のハードウエアやソフトウエアの機能に応じて適宜変更する必要がある。
10 シミュレータ
11 SystemCシミュレータ
12 タイムキーパー
Q 中断要求待ち行列
X,Y 変数
current_time,current_sc_time,flush_time,break_time,sum_time,sync_time メソッド
Claims (5)
- ハードウエアとソフトウエアの協調検証を行うためのC言語ベースのハード・ソフト協調検証用シミュレータであって、
前記ハードウエア及びソフトウエアに対応するシミュレーション・モデルを構成する複数のスレッド毎に設けられ、それぞれが対応するスレッドのシミュレーション時刻を制御するために、シミュレーション時刻を保持する第1の変数、積算時間を保持する第2の変数、中断時刻と対応する中断メソッドを格納する中断要求待ち行列、及び処理用の関数を備えた複数のタイムキーパーと、
前記タイムキーパーからの要求に応じて、管理しているシステム時刻を与えられた要求時間だけ進めると共に、並行して動作している前記スレッド間のコンテキスト切り替えを制御するC言語ベースのシミュレータ本体とを、
備えたことを特徴とするハード・ソフト協調検証用シミュレータ。 - 前記各タイムキーパーは、それぞれ、
呼び出しに応じて前記第1の変数のシミュレーション時刻を返す第1の関数と、
呼び出しに応じて前記シミュレーション時刻から前記積算時間を指しい引いた値を前記システム時刻として返す第2の関数と、
呼び出しに応じて前記第2の変数の積算時間を前記要求時間として前記シミュレータ本体のシステム時刻を進めた後、該第2の変数をゼロクリアする第3の関数と、
与えられた中断時刻、中断システム時刻及び中断メソッドを前記中断要求待ち行列に登録する第4の関数と、
前記中断要求待ち行列が空の場合には、前記シミュレーション時刻に引数として与えられる経過時間を加算して該シミュレーション時刻を進めると共に前記積算時間に該経過時間を加算して該積算時間を更新し、前記中断要求待ち行列が存在しかつ前記シミュレーション時刻が中断時刻未満の場合には、該シミュレーション時刻に前記経過時間を加算してそのシミュレーション時刻を進め、前記中断要求待ち行列が存在しかつ前記シミュレーション時刻が中断時刻以上の場合には、該中断要求待ち行列の内で中断時刻がシミュレーション時刻以上である中断メソッドを呼び出す第5の関数と、
引数として与えられた時刻が現在の前記シミュレーション時刻よりも大きいときに、該時刻と更新後のシミュレーション時刻の差分を引数とし前記第5の関数を呼び出す第6の関数とを、
備えたことを特徴とする請求項1記載のハード・ソフト協調検証用シミュレータ。 - 前記第5の関数は、前記中断要求待ち行列が存在しかつ更新したシミュレーション時刻が該中断要求待ち行列の先頭に格納された中断時刻に達したときに、該中断待ち行列の先頭から順に中断メソッドを呼び出し、その後シミュレーション時刻に前記積算時間を加算してこのシミュレーション時刻を進めると共に、該積算時間に前記経過時間を加算して該積算時間を更新し、この更新した積算時間が所定の閾値を越えた場合に前記第3の関数を呼び出すように構成したことを特徴とする請求項2記載のハード・ソフト協調検証用シミュレータ。
- タイムキーパー識別子で指定されるタイムキーパーに対して前記第4の関数を呼び出す第7の関数と、
前記タイムキーパー識別子で指定されるタイムキーパーに対して前記第3の関数を呼び出す第8の関数と、
前記タイムキーパー識別子で指定されるタイムキーパーに対して前記第5の関数を呼び出す第9の関数と、
前記タイムキーパー識別子で指定されるタイムキーパーに対して前記第1の関数を呼び出し、結果を戻り値として返す第10の関数と、
前記タイムキーパー識別子で指定されるタイムキーパーに対して前記第6の関数を呼び出す第11の関数とを、
有するタイムキーパー統合モジュールを設けたことを特徴とする請求項2または3記載のハード・ソフト協調検証用シミュレータ。 - 前記各タイムキーパーに、
対応するスレッドの状態が休眠状態か動作状態かを示す第3の変数と、
前記第3の変数を休眠状態に設定する第12の関数と、
前記第3の変数を動作状態に設定する第13の関数と、
前記第3の変数を戻り値として返す第14の関数とを、
設けたことを特徴とする請求項4記載のハード・ソフト協調検証用シミュレータ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006234298A JP2008059192A (ja) | 2006-08-30 | 2006-08-30 | ハード・ソフト協調検証用シミュレータ |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006234298A JP2008059192A (ja) | 2006-08-30 | 2006-08-30 | ハード・ソフト協調検証用シミュレータ |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008059192A true JP2008059192A (ja) | 2008-03-13 |
Family
ID=39241867
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006234298A Pending JP2008059192A (ja) | 2006-08-30 | 2006-08-30 | ハード・ソフト協調検証用シミュレータ |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008059192A (ja) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010009113A (ja) * | 2008-06-24 | 2010-01-14 | Fujitsu Microelectronics Ltd | シミュレーション装置およびプログラム |
JP2010049630A (ja) * | 2008-08-25 | 2010-03-04 | Fujitsu Ltd | シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法 |
JP2012509546A (ja) * | 2009-12-23 | 2012-04-19 | インチロン ゲーエムベーハー | 組み込みシステムをシミュレートするための方法及びデータ処理システム |
US20140325516A1 (en) * | 2011-02-15 | 2014-10-30 | Commissariat A L'energie Atomique Et Aux Energies Al Ternatives | Device for accelerating the execution of a c system simulation |
WO2015155839A1 (ja) * | 2014-04-08 | 2015-10-15 | 株式会社 日立製作所 | シミュレーションシステム、シミュレーション方法及びプログラム |
CN112400162A (zh) * | 2018-07-19 | 2021-02-23 | 日立汽车系统株式会社 | 模拟装置及其方法、以及ecu装置 |
CN114625108A (zh) * | 2022-03-21 | 2022-06-14 | 北京经纬恒润科技股份有限公司 | 一种仿真测试方法及装置 |
-
2006
- 2006-08-30 JP JP2006234298A patent/JP2008059192A/ja active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010009113A (ja) * | 2008-06-24 | 2010-01-14 | Fujitsu Microelectronics Ltd | シミュレーション装置およびプログラム |
JP2010049630A (ja) * | 2008-08-25 | 2010-03-04 | Fujitsu Ltd | シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法 |
JP2012509546A (ja) * | 2009-12-23 | 2012-04-19 | インチロン ゲーエムベーハー | 組み込みシステムをシミュレートするための方法及びデータ処理システム |
US8543369B2 (en) | 2009-12-23 | 2013-09-24 | Inchron, Gmbh | Method and data processing system for simulating an embedded system |
US20140325516A1 (en) * | 2011-02-15 | 2014-10-30 | Commissariat A L'energie Atomique Et Aux Energies Al Ternatives | Device for accelerating the execution of a c system simulation |
US9612863B2 (en) * | 2011-02-15 | 2017-04-04 | Commissariat A L'energie Atomique Et Aux Energies Alternatives | Hardware device for accelerating the execution of a systemC simulation in a dynamic manner during the simulation |
WO2015155839A1 (ja) * | 2014-04-08 | 2015-10-15 | 株式会社 日立製作所 | シミュレーションシステム、シミュレーション方法及びプログラム |
CN112400162A (zh) * | 2018-07-19 | 2021-02-23 | 日立汽车系统株式会社 | 模拟装置及其方法、以及ecu装置 |
CN114625108A (zh) * | 2022-03-21 | 2022-06-14 | 北京经纬恒润科技股份有限公司 | 一种仿真测试方法及装置 |
CN114625108B (zh) * | 2022-03-21 | 2024-01-30 | 北京经纬恒润科技股份有限公司 | 一种仿真测试方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9552448B2 (en) | Method and apparatus for electronic system model generation | |
US7957950B2 (en) | Hard/soft cooperative verifying simulator | |
US7246052B2 (en) | Bus master and bus slave simulation using function manager and thread manager | |
JP4667206B2 (ja) | マルチコアモデルシミュレーションプログラム、該プログラムを記録した記録媒体、マルチコアモデルシミュレータ、およびマルチコアモデルシミュレーション方法 | |
JP2008059192A (ja) | ハード・ソフト協調検証用シミュレータ | |
CN114580344B (zh) | 测试激励生成方法、验证方法、验证系统及相关设备 | |
JP2004110785A (ja) | メモリコントローラ | |
US20110265093A1 (en) | Computer System and Program Product | |
US20130073765A1 (en) | Semiconductor device and data processor | |
KR101704751B1 (ko) | 모듈 간의 타이밍 정보를 이용하는 멀티코어 시스템의 시뮬레이터, 및 그 시뮬레이션 방법 | |
AU2012227208B2 (en) | Global clock handler object for HDL environment | |
JP2007011720A (ja) | システムシミュレータ、システムシミュレート方法、制御プログラムおよび可読記録媒体 | |
CN113946445A (zh) | 一种基于asic的多线程模块及多线程控制方法 | |
JP2013196245A (ja) | シミュレーション方法、シミュレーション装置及びシミュレーションプログラム | |
US7761280B2 (en) | Data processing apparatus simulation by generating anticipated timing information for bus data transfers | |
TW201310241A (zh) | 全匯流排之交易層級模擬方法以快速與精確的爭用分析 | |
KR102576707B1 (ko) | 전자 시스템 및 그 동작 방법 | |
WO2021036421A1 (zh) | 多核架构的同步信号产生电路、芯片和同步方法及装置 | |
JP2007048019A (ja) | エミュレーション方法、エミュレータ、コンピュータ組込型デバイスおよびエミュレータ用プログラム | |
JP2004021907A (ja) | 性能評価用シミュレーションシステム | |
JP2019016168A (ja) | シミュレーションプログラム、方法、及び装置 | |
US20240134718A1 (en) | Apparatus and method for synchronizing participants of a simulation | |
US20240231956A9 (en) | Apparatus and method for synchronizing participants of a simulation | |
CN117332742B (zh) | 一种芯片设计阶段的仿真验证方法和装置 | |
US11373024B1 (en) | Circuit simulation based on a high-level language circuit specification |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20080922 |
|
A711 | Notification of change in applicant |
Free format text: JAPANESE INTERMEDIATE CODE: A712 Effective date: 20081210 |
|
RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7422 Effective date: 20090421 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20100106 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20100202 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20100727 |