[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
r3000
クラスは、R3000プロセッサをシミュレートする具体プロセッサ
クラスである。プロセッサ内の5段命令パイプラインをシミュレートしている。
r3000
クラスの実装のために、以下のクラスが使用されている。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサのワード等は、typedef
で定義されている。
r3000_word
signed_r3000_word
unsigned_r3000_word
sizeof_r3000_word
size_t
型の定数で、ワードのバイト数を表す。値は4である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサの32個の一般レジスタを格納するレジスタファイルのクラス。
register_file<word, c_array<32>>
クラスを継承している。本来の
R3000 プロセッサのレジスタ0は値が0に固定されているが、このクラスにはそ
の機能はない。See section 7.7 register_fileクラス.
static string register_name(int i)
static int register_number(const string&)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサの命令セットのそれぞれの命令を表す。
void set(address_type, data_type)
void clear(void)
nop
にする。
r3000_word image(void) const
address_type pc(void) const
r3000_instruction::operation_type operation(void) const
r3000_instruction::opcode_type opcode(void) const
lw
、add
など)を参照する。実際の値については
`r3000_instruction.h'を参照のこと。
bool is_i_type(void) const
bool is_j_type(void) const
bool is_r_type(void) const
bool is_co_type(void) const
bool is_load(void) const
bool is_store(void) const
bool is_load_or_store(void) const
int rs(void) const
rs
フィールドを参照する。
int rt(void) const
rt
フィールドを参照する。
int rd(void) const
rd
フィールドを参照する。
int sa(void) const
sa
フィールドを参照する。
int base(void) const
base
フィールドを参照する。
data_type immediate(void) const
immediate
フィールドを参照する。
signed_data_type signed_immediate(void) const
immediate
フィールドを符号付きワードで参照する。
data_type target(void) const
target
フィールドを参照する。
int coprocessor_number(void) const
data_type break_code(void) const
break
命令のコード番号を参照する。
address_type jump_address(void) const
address_type branch_address(void) const
string opcode_string(void) const
opcode
の文字列を得る。
string operation_string(void) const
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサ内の命令バッファの1エントリを表す。命令フェッチ、レジス タフェッチ、実行、メモリアクセス、ライトバック等の処理を行うためのイン タフェースを持つ。
void instruction_fetch(address_type, data_type)
void register_fetch(const r3000_register_file&)
void forwarding(const r3000_pipeline_stage&)
void execute(void)
void load_fetch_for_big_endian(data_type)
void load_fetch_for_little_endian(data_type)
void partial_word_store_fetch_for_big_endian(data_type)
void partial_word_store_fetch_for_little_endian(data_type)
void mf_fetch(data_type)
mf
命令(mfhi
、mflo
、mfc
)でロードするワード
データをフェッチする。引数にフェッチするワードデータを与える。
void writeback(r3000_register_file&)
r3000_instruction::operation_type operation(void) const
r3000_instruction::opcode_type opcode(void) const
lw
、add
など)を参照する。実際の値については
r3000_instruction.h
を参照のこと。
bool is_integer_input(void) const
bool is_integer_output(void) const
bool is_coprocessor_input(void) const
bool is_coprocessor_output(void) const
data_type source1(void) const
data_type source2(void) const
data_type distination(void) const
address_type access_address(void) const
address_type word_aligned_access_address(void) const
data_type access_data(void) const
address_type distination_pc(void) const
bool is_load(void) const
bool is_store(void) const
bool is_load_or_store(void) const
data_type break_code(void) const
break
命令のコードを参照する。
string opcode_string(void) const
string operation_string(void) const
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサ内の命令バッファを表す。命令バッファクラス
instruction_buffer<r3000_word, c_array<r3000_word, 5>>
クラスの
派生クラスである。See section 7.6 instruction_bufferクラス.
パイプライン段数は5段で、各ステージの参照にステージ名を使用できる。ス テージ名は以下の通りである。
if_stage()
rd_stage()
ex_stage()
mm_stage()
wb_stage()
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のストールを表すクラス。
r3000_stall::stall_type type(void) const
void set(r3000_stall::stall_type)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサ内での未解決のストールの管理を行うバッファ。ストールの
追加、削除、変更等を行う。入力されたストールはfetch
関数によって
優先度順に整列され、内部キューに格納される。格納されているストールの処
理はr3000_integer_unit
クラスによって行われる。このクラスは現在
のストールが何であるかという情報だけを管理し、実際のストール解決処理は
行わない。
r3000_stall::stall_type type(void) const
bool is_run_cycle(void) const
fetch
関数が呼ばれてストールが内部
キューに格納されるまではプロセッサは実行サイクルにある。
bool is_stall_cycle(void) const
bool is_internal_stall_cycle(void) const
bool is_external_stall_cycle(void) const
bool is_buffered(void) const
bool have_next_stall(void) const
void push(r3000_stall::stall_type)
fetch
関数によっ
て内部キューに格納される。
void pop(void)
void streaming_to_instruction_cache_miss_refill(void)
void change(r3000_stall::stall_type)
void fetch(void)
void clear(void)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサ内の整数乗算器を表すクラス。HI
レジスタ、
LO
レジスタを持ち、mult
、multu
、div
、
divu
命令の処理を行う。演算開始時に演算器の内部変数に演算時間が
設定され、演算が終了するまでレジスタがロックされる。
data_type hi(void) const
HI
レジスタを参照する。
data_type lo(void) const
LO
レジスタを参照する。
void mult(data_type, data_type)
mult
命令を実行する。引数は命令に与えるレジスタの値である。
void multu(data_type, data_type)
multu
命令を実行する。引数は命令に与えるレジスタの値である。
void div(data_type, data_type)
div
命令を実行する。引数は命令に与えるレジスタの値である。
void divu(data_type, data_type)
divu
命令を実行する。引数は命令に与えるレジスタの値である。
void clock(void)
void clear(void)
unsigned int mult_wait(void)
mult
命令、multu
命令に要する時間のクロック数を返す。
unsigned int div_wait(void)
div
命令、divu
命令に要する時間のクロック数を返す。
void set_mult_wait(unsigned int)
mult
命令、multu
命令に要する時間のクロック数を設定する。
void set_div_wait(unsigned int)
div
命令、divu
命令に要する時間のクロック数を設定する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のバスアクセスのインタフェースを提供するクラス。
bus_port<word_type, word_type>
の派生クラスである。
See section 6.3 bus_portクラス.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000に接続される1次キャッシュを表すクラス。directmap_cache<word,
word>
クラスの派生クラスである。See section 7.4 directmap_cacheクラス.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のメモリアクセス処理、キャッシュアクセス処理を行うユニット。整数 演算器からのメモリアクセス要求を受け、それに応じてバスインタフェースを 通じてバスにアクセスし、必要があればキャッシュに値を書き込む。クロック 入力を受けて状態遷移する。
11.11.1 r3000_memory_access_unitクラスの定義 11.11.2 r3000_memory_access_unitクラスの使い方
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
void clock_in(void)
void clock_out(void)
void reset(void)
bool is_connected_to_instruction_cache(void) const
bool is_connected_to_data_cache(void) const
void connect_instruction_cache(r3000_directmap_cache&)
void connect_data_cache(r3000_directmap_cache&)
void disconnect_instruction_cache(void)
void disconnect_data_cache(void)
address_type instruction_read_address(void) const
data_type instruction_read_data(void) const
address_type data_read_address(void) const
data_type data_read_data(void) const
address_type data_write_address(void) const
data_type data_read_data(void) const
bool instruction_read_is_requested(void) const
bool instruction_read_is_ready(void) const
bool instruction_read_is_wait(void) const
bool instruction_read_is_ack(void) const
bool instruction_read_is_trans(void) const
bool instruction_read_is_trans_last(void) const
bool data_read_is_requested(void) const
bool data_read_is_ready(void) const
bool data_read_is_wait(void) const
bool data_read_is_ack(void) const
bool data_read_is_trans(void) const
bool data_read_is_trans_last(void) const
bool data_write_is_requested(void) const
bool data_write_is_ready(void) const
bool data_write_is_wait(void) const
bool data_write_is_ack(void) const
bool data_write_is_trans(void) const
bool data_write_is_trans_last(void) const
void send_single_instruction_read_request(address_type)
void send_multi_instruction_read_request(address_type)
void send_single_data_read_request(address_type)
void send_multi_data_read_request(address_type)
void send_data_write_request(address_type, data_type)
bool is_instruction_reading(void) const
bool is_data_reading(void) const
bool is_reading(void) const
bool is_writing(void) const
bool have_read_request(void) const
bool is_cacheable(address_type) const
bool is_cacheable_instruction(address_type) const
bool is_cacheable_data(address_type) const
bool is_instruction_cache_hit(address_type) const
bool is_data_cache_hit(address_type) const
data_type instruction_cache_read(address_type) const
data_type data_cache_read(address_type) const
void data_cache_write(address_type, data_type) const
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
r3000
クラスのメモリアクセスは、単一命令リード、複数命令リード、
単一データリード、複数データリード、単一データライトの5種類である。複
数ワードアクセスはキャッシュが使用可能な場合にのみ行われ、転送ワード数
はキャッシュラインサイズに等しい。
以下、データに関するアクセスについてのアクセス方法を示す。命令アクセス についてもアクセス方法は同一である。
is_cacheable_data
関数でキャッシュ不可能なデータであることを確認
する。
send_single_data_read_request
関数で単一データリード要求を発行す
る。これにより、バスが空き次第メモリアクセスが発行される。
data_read_is_ack
関数が真になったら、次のクロックでデータが転送
されるので、データ受信の準備を行う。
data_read_data
関数を用いてデータを受け取る。
is_cacheable_data
関数でキャッシュ可能なデータであることを確認す
る。
send_multi_data_read_request
関数で複数データリード要求を発行す
る。これにより、バスが空き次第メモリアクセスが発行される。アクセスに使
用されるアドレスは、引数に与えられたアドレスをキャッシュライン境界に補
整したものである。また、転送ワード数はキャッシュラインサイズである。
data_read_is_ack
関数が真になったら、次のクロックからデータ転送
が開始される。
data_read_address
、
data_read_data
関数で参照できる。
data_read_is_trans_last
関数が真を返すと、データ転送がそのクロッ
クで終了したことを示している。
send_data_write_request
関数で単一データライト要求を発行する。こ
れにより、バスが空き次第メモリアクセスが発行される。また、データがキャッ
シュ可能で、かつキャッシュ内にそのアドレスのデータが格納されている場合、
要求を発行した時点で自動的にデータキャッシュに書き込まれる。
data_write_is_trans
関数が真を返すと、データライトがそのクロック
で終了したことを示している。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のライトバッファを表すクラス。write_buffer
クラスの派生クラ
スである。バッファサイズの初期値は4である。See section 7.8 write_bufferクラス.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のライトバッファを操作するユニット。
r3000_memory_access_unit
クラスのオブジェクトに接続した状態で使
用され、書き込み要求を自動的にメモリアクセスユニットに送信する。
void push(address_type, data_type)
bool is_full(void) const
bool is_empty(void) const
bool is_ready(void) const
bool is_busy(void) const
bool is_buffered(address_type) const
data_type read(address_type) const
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000のCp0コプロセッサの32個のレジスタを格納するレジスタファイルのクラ
ス。register_file<r3000_word, c_array<r3000_word, 32>>
クラスを
継承している。See section 7.7 register_fileクラス.
static string register_name(int i)
static int register_number(const string&)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000内の整数演算器を表す。命令バッファ、レジスタファイル、乗算器、ス トールバッファ、プログラムカウンタを内部に格納し、プロセッサ内の整数演 算全般を取り扱う。メモリアクセスユニット、ライトバッファ、コプロセッサ、 キャッシュは外部から接続する。処理の大半は命令バッファなどの各クラスに よって行われるため、このクラスではそれらの処理の仲介、データの受渡しな どを行う。
状態遷移はclock
関数によって行う。この関数は、r3000
クラス
の外部からのデータ入力と外部へのデータ出力の中間で呼び出されるよう設計
されている。
11.16.1 r3000_integer_unitクラスの定義 11.16.2 r3000_integer_unitクラスのクロック関数
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
data_type register_file(size_t i) const
address_type pc(void) const
data_type hi(void) const
HI
レジスタを参照する。
data_type lo(void) const
LO
レジスタを参照する。
bool is_run_cycle(void) const
bool is_stall_cycle(void) const
bool is_internal_stall_cycle(void) const
bool is_external_stall_cycle(void) const
bool is_streaming(void) const
void clock(void)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
命令バッファのライトバックステージに、レジスタファイルへの書き戻しを指 示する。
命令バッファのメモリアクセスステージの命令を判別し、ロード命令、ストア 命令を処理する。コプロセッサが接続されている場合は、コプロセッサ転送命 令も処理する。
DATA_FETCH_BUSY_STALL_WFLUSH
へ遷移するようストールバッ
ファに指示する。存在しない場合、続いてキャッシュをチェックする。すでに
キャッシュ内に存在するデータである場合、メモリアクセスステージにキャッ
シュからデータを渡す。コプロセッサロード命令の場合は、さらにコプロセッ
サへデータを渡す。コプロセッサがデータを受け取れない状態であれば、次の
サイクルからCOPROCESSOR_FETCH_BUSY_STALL
へ遷移するようストール
バッファに指示する。データがキャッシュ中に存在しない場合、メモリアクセ
スユニットにキャッシュラインへの複数ワードロードを依頼し、次のサイクル
からDATA_CACHE_MISS_STALL
へ遷移するようストールバッファに指示す
る。
UNCACHEABLE_DATA_STALL_WFLUSH
へ遷移するようストールバッ
ファに指示する。存在しない場合、メモリアクセスユニットに単一ワードロー
ドを依頼し、次のサイクルからUNCACHEABLE_DATA_STALL
へ遷移するよ
うストールバッファに指示する。
SW
命令であれば、ライトバッファをチェックし、空きがあればライト
バッファに書き込むアドレスとデータを送る。空きがない場合、次のサイクル
からWRITE_BUSY_STALL
へ遷移するようストールバッファに指示する。
PARTIAL_WORD_STORES_FIXUP
へ遷移
するようストールバッファに指示する。データがキャッシュまたはライトバッ
ファ中に存在しない場合、データがキャッシュまたはライトバッファ中に存在
しない場合、メモリアクセスユニットにキャッシュラインへの複数ワードロー
ドを依頼し、次のサイクルからDATA_CACHE_MISS_STALL
へ遷移するよう
ストールバッファに指示する。
PARTIAL_WORD_STORES_FIXUP
へ遷移するようストールバッファに指示す
る。データがライトバッファ中に存在しない場合、メモリアクセスユニットに
単一ワードロードを依頼し、次のサイクルから
UNCACHEABLE_DATA_STALL
へ遷移するようストールバッファに指示する。
SWC
命令であれば、コプロセッサの状態をチェックする。コプロセッサ
がデータを出力可能であれば、ライトバッファをチェックし、空きがあればラ
イトバッファに書き込むアドレスとデータを送る。空きがない場合、次のサイ
クルからWRITE_BUSY_STALL
へ遷移するようストールバッファに指示す
る。コプロセッサがデータを出力できないならば、次のサイクルから
COPROCESSOR_OUTPUT_BUSY_STALL
へ遷移するようストールバッファに指
示する。
MFC
またはCFC
命令であれば、コプロセッサの状態をチェックす
る。コプロセッサがデータを出力可能であれば、データを受け取って命令バッ
ファのメモリアクセスステージへ渡す。コプロセッサがデータを出力できない
ならば、次のサイクルからCOPROCESSOR_OUTPUT_BUSY_STALL
へ遷移する
ようストールバッファに指示する。
MTC
またはCTC
命令であれば、コプロセッサの状態をチェックす
る。コプロセッサがデータを受け取り可能であれば、命令バッファのメモリア
クセスステージのデータをコプロセッサへ渡す。コプロセッサがデータを受け
取れない状態であれば、次のサイクルから
COPROCESSOR_FETCH_BUSY_STALL
へ遷移するようストールバッファに指
示する。
まず初めに、処理する命令がコプロセッサ分岐命令かどうかを調べる。コプロ
セッサ分岐命令であった場合は、コプロセッサのfpcond
を調べ、実行
ステージに渡しておく(1)。
続いて命令バッファの実行ステージに実行を行わせ、その命令を判別し、分岐
命令、整数乗除算命令、MFHI
、MFLO
、MTHI
、
MTLO
命令を処理する。
MFHI
、MFLO
命令であれば、乗算器がbusy状態でなければ、レジ
スタ値を実行ステージに送り、実行ステージからレジスタフェッチステージへ
のフォワーディングを行う。乗算器がbusy状態であれば、次のサイクルから
MULTIPLY_UNIT_BUSY_STALL
へ遷移するようストールバッファに指示す
る。
MTHI
、MTLO
命令であれば、乗算器に実行ステージ内のソースレ
ジスタ値を渡す。
命令バッファのレジスタフェッチステージにレジスタフェッチを行わせ、さら にメモリアクセスステージからのフォワーディング、実行ステージからのフォ ワーディングを行う。
コプロセッサに接続されている場合は、コプロセッサが命令を受け取り可能な
状態かどうか調べる。コプロセッサが命令を受け取り可能であった場合、コプ
ロセッサにレジスタフェッチステージ内の命令ワードを渡す。コプロセッサが
命令を受け取り不能であった場合、次のサイクルから
COPROCESSOR_IFETCH_BUSY_STALL
へ遷移するようストールバッファに指
示する。
命令バッファの命令フェッチステージに命令をフェッチする。
INSTRUCTION_CACHE_MISS_STALL
へ遷移するようストールバッファに指
示する。
UNCACHEABLE_INSTRUCTION_STALL
へ遷移
するようストールバッファに指示する。
ストールバッファにストールのフェッチを依頼する。これにより、各命令ステー ジの実行で発生したストールが優先度順にストールバッファの内部キューに整 列され、次のサイクルでの動作が決定される。
次のサイクルが実行サイクル、もしくはストリーミングサイクルであれば、プ ログラムカウンタの値を4進め、命令バッファのステージを1進める。
ストリーミングは、分岐とストールが発生しない限り継続される。
現在のプログラムカウンタ値を一次変数に保存しておく。
命令フェッチ以外のステージの実行を行う。この処理は通常の実行サイクルと 全く同じ処理が行われる。
プログラムカウンタ値、ストールバッファに格納されたストールの有無をチェッ クし、状態に応じて命令フェッチ処理、ストールへの遷移を行う。
ストリーミングを終了する。メモリアクセスユニットの命令リフィルが最後の
命令でなければ、ストールバッファの内部キューの先頭に強制的に
INSTRUCTION_CACHE_MISS_REFILL
を挿入する。その後、通常の命令フェッ
チ、ストールバッファのフェッチを行う。
ストリーミングを終了する。メモリアクセスユニットの命令リフィルが最後の
命令でなければ、ストールバッファの内部キューの先頭に強制的に
INSTRUCTION_CACHE_MISS_REFILL
を挿入する。命令リフィルが最後の命
令であれば、命令バッファの命令フェッチステージに命令を渡す。その後、ス
トールバッファのフェッチを行う。
メモリアクセスユニットの命令リフィルが最後の命令でなければ、ストリーミ ングを終了する。その後、命令バッファの命令フェッチステージに命令を渡し、 ストールバッファのフェッチを行う。
現在処理中のストールに応じた処理を行う。
INSTRUCTION_CACHE_MISS_STALL
INSTRUCTION_CACHE_MISS_REFILL
に遷移する。
INSTRUCTION_CACHE_MISS_REFILL
INSTRUCTION_CACHE_MISS_FIXUP
に遷移する。転送して
いるアドレスがプログラムカウンタ値に等しく、ストールバッファ中に他のス
トールが格納されていなければ、次のサイクルで
INSTRUCTION_CACHE_MISS_FIXUP_TO_STREAMING
に遷移する。
INSTRUCTION_CACHE_MISS_FIXUP
INSTRUCTION_CACHE_MISS_FIXUP_TO_STREAMING
UNCACHEABLE_INSTRUCTION_STALL
UNCACHEABLE_INSTRUCTION_FIXUP
に遷移する。
UNCACHEABLE_INSTRUCTION_FIXUP
DATA_CACHE_MISS_STALL_WFLUSH
COPROCESSOR_FETCH_BUSY_STALL
へ遷移するようストールバッファに指
示する。コプロセッサロード命令でない場合は、ストールバッファの先頭のス
トールを削除する。データがキャッシュ中に存在しない場合、メモリアクセス
ユニットにキャッシュラインへの複数ワードロードを依頼し、次のサイクルか
らDATA_CACHE_MISS_STALL
へ遷移するようストールバッファに指示する。
DATA_CACHE_MISS_STALL
DATA_CACHE_MISS_REFILL
に遷移する。
DATA_CACHE_MISS_REFILL
DATA_CACHE_MISS_FIXUP
に遷移する。
DATA_CACHE_MISS_FIXUP
メモリアクセスステージがコプロセッサロード命令の場合、メモリアクセスス
テージにデータを渡す。メモリアクセスステージからレジスタフェッチステー
ジへのフォワーディングを行い、次にストールバッファの先頭のストールを削
除する。さらにコプロセッサがデータを受け取り可能かどうかを調べ、受け取
り可能であればデータを渡す。受け取り不能であれば、次のサイクルから
COPROCESSOR_FETCH_BUSY_STALL
へ遷移するようストールバッファに指
示する。
メモリアクセスステージがロード命令の場合、メモリアクセスステージにデー タを渡す。そして、メモリアクセスステージからレジスタフェッチステージへ のフォワーディングを行う。最後にストールバッファの先頭のストールを削除 する。
メモリアクセスステージが部分ワードストア命令の場合、メモリアクセスステー
ジにデータを渡す。次のサイクルでPARTIAL_WORD_STORES_FIXUP
に遷移
する。
UNCACHEABLE_DATA_STALL_WFLUSH
UNCACHEABLE_DATA_STALL
へ遷移するようストールバッファに指示する。
UNCACHEABLE_DATA_STALL
UNCACHEABLE_DATA_FIXUP
に遷移する。
UNCACHEABLE_DATA_FIXUP
メモリアクセスステージがコプロセッサロード命令の場合、メモリアクセスス
テージにデータを渡す。メモリアクセスステージからレジスタフェッチステー
ジへのフォワーディングを行い、次にストールバッファの先頭のストールを削
除する。さらにコプロセッサがデータを受け取り可能かどうかを調べ、受け取
り可能であればデータを渡す。受け取り不能であれば、次のサイクルから
COPROCESSOR_FETCH_BUSY_STALL
へ遷移するようストールバッファに指
示する。
メモリアクセスステージがロード命令の場合、メモリアクセスステージにデー タを渡す。そして、メモリアクセスステージからレジスタフェッチステージへ のフォワーディングを行う。最後にストールバッファの先頭のストールを削除 する。
メモリアクセスステージが部分ワードストア命令の場合、メモリアクセスステー
ジにデータを渡す。次のサイクルでPARTIAL_WORD_STORES_FIXUP
に遷移
する。
EXECUTE_PARTIAL_WORD_STORES_FIXUP
WRITE_BUSY_STALL
へ遷移するようストールバッファに指示する。空き
がある場合は、ストールバッファの先頭のストールを削除する。
WRITE_BUSY_STALL
WRITE_BUSY_FIXUP
に遷移する。
WRITE_BUSY_FIXUP
MULTIPLY_UNIT_BUSY_STALL
MULTIPLY_UNIT_BUSY_FIXUP
に遷移する。
MULTIPLY_UNIT_BUSY_FIXUP
MFHI
、MFLO
命令であれば、レジスタ値を実行ス
テージに送り、実行ステージからレジスタフェッチステージへのフォワーディ
ングを行う。最後にストールバッファの先頭のストールを削除する。
COPROCESSOR_IFETCH_BUSY_STALL
COPROCESSOR_IFETCH_BUSY_FIXUP
に遷移する。
COPROCESSOR_IFETCH_BUSY_FIXUP
COPROCESSOR_FETCH_BUSY_STALL
COPROCESSOR_FETCH_BUSY_FIXUP
に遷移する。
COPROCESSOR_FETCH_BUSY_FIXUP
COPROCESSOR_OUTPUT_BUSY_STALL
COPROCESSOR_OUTPUT_BUSY_FIXUP
に遷移する。
COPROCESSOR_OUTPUT_BUSY_FIXUP
WRITE_BUSY_STALL
へ遷移
するようストールバッファに指示する。
命令バッファのメモリアクセスステージの命令がその他のコプロセッサ命令で あれば、コプロセッサからデータを取り出し、命令バッファのメモリアクセス ステージへ渡す。最後にストールバッファの先頭のストールを削除する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
R3000プロセッサを表すクラスである。内部にr3000_bus_interface
ク
ラス、r3000_memory_access_unit
クラス、
r3000_write_buffer_unit
クラス、r3000_integer_unit
クラス、
r3000_cp0
のオブジェクトを持つ。
プロセッサの実体は、メモリアクセス部はr3000_bus_interface
クラス、
r3000_memory_access_unit
クラス、r3000_write_buffer_unit
クラスによって実装されている。また、演算部分は
r3000_integer_unit
クラス、r3000_cp0
クラスなどが担当する。
r3000
クラスは外部とのインタフェースだけを提供する。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
generic_processing_element
クラスの継承クラスで、R3000プロセッサ
によるプロセシングエレメントを表す。See section 8.20 generic_processing_elementクラス.
set_instruction_cache_size(size_type, size_type)
set_data_cache_size(size_type, size_type)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
mips--ecoff形式の実行ファイル形式を規定したクラス。mips--ecoff形式のバ イナリファイルをロードする機能を持つ。
void load_header(istream&)
bool load_body_to_memory(istream&, memory_map_type&)
void disassemble(ostream&, memory_map_type&, address_type, size_type)
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |