MIST32アーキテクチャ

このページは現在更新していません。最新版はOpen Design Computer Project - MIST32をご覧ください。

MIST32はアウトオブオーダ実行を行うことを前提としたプロセッサアーキテクチャです。命令セットレベルでアウトオブオーダ実行に必要となるハードウェアを極力小さくできるように配慮し、命令レベルの並列化を低消費電力で実現しようとするアーキテクチャです。主な特徴としてはwith Flag命令の廃止や、CC(Condition Code)の採用、独自のAFE(After Execution Expansion)を搭載します。

この命令セットはMIST1032SAの開発とともに拡張・変更しています。よって、ここに書かれた情報はまだほぼ決定事項ではありますが、変更する可能性があります。

MIST32アーキテクチャについての構想や検討についてはMIST32開発履歴をご覧ください。

With Flag命令の廃止

MIST32アーキテクチャでは基本的に従来のプロセッサで存在するADDCなどの、1つ前のフラグを参照する命令は廃止しています。これにより、アウトオブオーダー実行において使用する、リザベーションステーションの待ち受け数を最低限に減らすことが可能となります。待ち受けや依存性解析は非常に大きなハードウェアを必要とするため、低消費電力で動作させるためには待ち受けユニットを減らすことが必要です。なお、条件ブランチ命令などは、条件判定のために1つ前の命令のフラグを参照できるようになっています。

このような仕組みをとることにより、組み込みで使用する場合、若干の性能低下が起こる可能性があります。しかしながら、このMIST32はモバイル端末~コンピュータなどの、オペレーティングシステムが搭載されることを前提としているアーキテクチャなので、With Flag命令の仕様は極端に少ないという考えを元にしています。その根拠としては、CまたはC++言語において、通常変数がオーバーフローしたことは無視されるという点にあります。たとえばLinuxカーネル(x86)において、非With Flag命令であるADDと、With Flag命令であるADCの出現率は1/180程であるため,With Flag命令を許しハードウェア規模を増大させるコストよりも、若干の性能は犠牲とし、他の命令に置き換えることで解決します。

AFE : After Execution Expansion

条件がtrueな場合のみに実行を行い、falseの場合はnop命令として実行される仕組みです。MIST32アーキテクチャではこの方式を積極的に採用することによりBranch命令の使用率を極力下げようという考えです。

通常、分岐予測ミスを含む例外に対応したアウトオブオーダ実行では、動的に実行順序が変更されるため、ある一定の数だけコミットすると、そこを例外の戻り先ポイントとし、プログラムカウンタ(以下PC)の戻り先としてそれを指定するようにします。しかし、コミットされたポイント以降にも実行が完了した命令が存在し、さらにパイプラインの段数が長くなるにつれて例外のペナルティは大きくなります。後者は通常のパイプラインプロセッサにも言えることですが、構造がより複雑になるアウトオブオーダ実行を搭載する場合より多くのペナルティが生まれてしまいます。

CCを用いると、例外が発生する可能性がある分岐命令を使用せずとも、簡単な分岐命令はCCに置き換えられるため上記のような問題を極力減らすことが可能です。

After Execution Expansion(以下AFE)は、通常の命令を実行した後その演算結果またはフラグを参照して条件が一致すれば固定長のシフト・インクリメントなどの単純な命令を追加実行できるようにした仕組みです。この仕組みはCCと似ていますが、追加実行機能を単純な命令に限定してすべてを1命令で行えるようにしたのが特徴となります。

レジスタセット

MIST32アーキテクチャは通常演算などで使用される汎用レジスタと、プロセッサの状態を示したり設定するためのシステムレジスタを持ちます。

RISCでありながらもこのように明確に分けることにより、アウトオブオーダー実行時、必要な待ち合わせユニットの大幅な削減が可能となり、結果的に回路規模を小さくすることができ、低消費電力化も可能となります。

汎用レジスタ

レジスタ名
GR0~GR31

システムレジスタ

システムレジスタへのリード・ライトはそのレジスタ専用に設けられている命令を用いて実現が可能です。また、システムレジスタによっては、プログラムから一切アクセスが禁止されているものもあります。 この章はまだ未完成。

CPUIDR(Processor ID Register)

プロセッサバージョン固有のIDを示します。1つのプロセッサ内に複数のコアを持つ場合においてもすべてのコアでこのIDは共通となります。このレジスタは正確にはレジスタではなくROMであり、いかなる場合においても書き込みを許しません。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~65~0
名称PIDPREV
機能MIST32に対応するプロセッサのIDプロセッサのリビジョン

COREIDR(Core ID Register)

コアごとにユニークな値を持ちます。このレジスタは正確にはレジスタではなくROMであり、いかなる場合においても書き込みを許しません。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~0
名称COREID

TIDR(Task ID Register)

現在実行中のタスクIDを示します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~1413~0
名称フラグ類予約TID

FLAGR(Flag Register)

ジャンプ命令のみリード可能でその他の命令では一切リード・ライト不可能となります。このレジスタを直接的にリード・ライトする専用命令も用意されていません。フラグ更新を行わない命令の直後、フラグレジスタはすべて0となります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
××××
ビットフィールド43210
名称SPOFCFPFZF
機能演算結果が負数の場合1演算結果がオーバーフローした際1演算結果に桁上げが生じた場合1演算結果が偶数なら1演算結果が0ならば1

PCR(Program Counter Register)

現在実行されている命令が格納されている、メモリのアドレスを挿します。すべての命令において、このレジスタを明示的に参照したり書き込みすることはできません。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~0
名称PC

SPR(Stack Point Register)

PUSH/POP系の命令にて2次的に操作されるレジスタです。SPRは次にPUSHされるべきメモリ上のアドレスを指します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~0
名称SPR

PSR(Program Status Register)

現在実行中のプロセッサのシステムを設定または示すレジスタです。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
××××
ビットフィールド31~76:54~321:0
名称予約CMOD IMMMUMOD
機能予約00:Kernel Mode 1~2:予約 : 3:User Mode予約0:Interrupt Mask 1:Interrupt Non Mask00:Invalid Paging(Direct Access) 01:1Level Paging 10:2Level Paging 11:予約

IOSAR(IO Start Address Register)

メモリマップドIOにおいて、I/Oにマップされる開始アドレスを示します。このレジスタから0xFFFFFFFFまではIOにマップされることを示します。なお、リセット直後は0x00000000になり、この状態はIOユニットの初期化が完了していないことを示します。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
××××
ビットフィールド31~0
名称IOSAR

PDTR(Page Directry Table Register)

現在参照しているページテーブルが格納されている物理アドレスを示すレジスタです。タスク切り替えの際に使用するレジスタで、特定の割り込み時にCPUが自動的に値を書き込みます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
××
ビットフィールド31~0
名称PDTR

TISR(Task Information Stractor Register)

カーネル空間にある現在実行中のタスクの、物理インデックスアドレスを示しています。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称TISPR

KPDTR(Kernel Page Directory Table Register)

カーネル空間が存在しているページの、ページテーブルが保持されている物理アドレスを示すレジスタです。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称KPDTR

IDTR(Interrupt Discriptor Table Register)

割り込みベクタの開始アドレスを物理アドレスで持っているレジスタ。このレジスタはバイトアドレスで割り込みベクタを示している。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称IIR

FI0R(Fault Infomation 0 Register)

フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称FI0R

FI1R(Fault Infomation 1 Register)

フォールトが発生した際にプロセッサにより自動的に書き込まれるレジスタです。フォールトの種類により格納される内容は異なります。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称FI1R

SRR0~n(System Reserved Register)

プロセッサコアで予約されているレジスタ。このレジスタはMIST32アーキテクチャに定義されませんが、コアの構成上用意される可能性があるレジスタです。全ての権限においてどのような場合においても利用不可能なレジスタです。プロセッサコアによって複数個予約される可能性があります。このレジスタはたとえばプロセッサ内部においてマイクロコードを実行するときや、ハードウェアコンテキストスイッチを行う際に利用されます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~0
名称不定

PPSR(Previous Program Status Register)

割り込みが発生すると自動的にPSRからPPSRにコピーされます。このレジスタは1つ前のタスクが実行されていた状態を示しています。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××××
ビットフィールド31~76:54~321:0
名称予約CMOD IMMMUMOD
機能予約00:Kernel Mode 1~2:予約 : 3:User Mode予約0:Interrupt Mask 1:Interrupt Non Mask00:Invalid Paging(Direct Access) 01:1Level Paging 10:2Level Paging 11:予約

PPCR(Previous Program Counter Register)

割り込みが発生すると自動的にPCの値がPPCRにコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~0
名称PC

PPDTR(Previous Page Directry Table Register)

割り込みが発生すると自動的にPDTRの値がコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×××
ビットフィールド31~0
名称PDTR

PTIDR(Previous Task ID Register)

割り込みが発生すると自動的にTIDRの値がコピーされます。

Kernel Mode ReadKernel Mode Write User Mode ReadUser Mode Write命令にて2次的にRead命令にて2次的にWrite命令以外にてWrite
×
ビットフィールド31~1413~0
名称フラグ類予約TID

メモリマップ

none

割り込み

MIST32では割り込みは2048のエントリを持っています。割り込みはハードウェア割り込み・トラップ(ソフトウェア割り込み)・フォールト・アボートに分類されています

FI0R/FI1Rについて

この2つのレジスタはフォールトが発生した際に、その要因の詳細を記憶するレジスタです。フォールトの種類により役割が異なります。

割り込み一覧

割り込み番号割り込みタイプ要因FI0RFI1R
0~3 予約
4~35HardwareGCIデバイス0~31nonenone
36HardwareDPD UTIM64A~Bnonenone
37HardwareDPD LSFLAGSnonenone
40Faultメモリアクセス特権違反(MMU)アクセスしたアドレス引き起こした命令が格納されているアドレス(これは未定)
41Fault無効命令(MMU)引き起こした命令が格納されているアドレスFI0Rと同様
42Faultページフォルト(MMU)アクセスしたアドレス引き起こした命令が格納されているアドレス(これは未定)
43Fault割り込みベクタ無効無効であった割り込み番号FI0Rと同様
44~49予約予約
50FaultTSS無効
51Fault除算エラー
52~53 予約
63Abortダブルフォールト
64~127SWソフトウェア割り込み用

割り込みベクタは割り込み番号ごとに存在し、各種フラグや割り込みハンドラ情報を持っています。

0Valid bit1:割り込みベクタが有効
1Mask bit1:割り込みハンドラが有効(無効の場合この割り込みは引き起こさない)
15~2予約予約
17~16PRI割り込みレベル
31~18予約予約
63~32HDL割り込みハンドラ

割り込み制御について

リセット後のIDTをセットする手順は以下のようになります。割り込みフラグを操作する場合必ず以下の手順を必要とします。割り込みハンドラの変更を行う際にはメモリ上の割り込みハンドラを書き換えるだけで問題ありません。リセット時以に設定を行うにはSRIEIW命令にて割り込みマスクを割り込み禁止にセットしてから行います。

  1. IDTをメモリ上の任意の位置に配置します。
  2. SRIDTW命令にてIDTのIndexを設定します。
  3. IDTS命令にてIDTをプロセッサに設定します。
  4. SRIEIW命令にてプロセッサの割り込みマスクを割り込み許可にします。

I/O

MIST32ではメモリマップドI/Oを採用しています。IO領域の開始アドレスはIOSRに示されます。IOSRの値は接続されるデバイス構成により変化し、このアドレスはリセット時に一度だけ書き換えられます。

IOはすべてワードアドレッシングのみ採用しています。よってByteやハーフワードロードストア命令であるld8, ld16 / st8, st16命令などにより参照された場合はアライメント違反の割り込みが発生します。

I/O空間の構成

I/O空間は標準タイマ、RTC、UARTなどを搭載しているDefault Peripheral System(DPS)と汎用的なデバイスを自由に接続可能なGeneration Device Connection Interface(GCI)から構成されます。

DPS

GCI

TST : Task Structure Table

TISPRが指すアドレスにTSTが存在します。TSTにはプロセッサが切り替えるべきタスクのキューと、タスク構造体が格納されています。

- TST全体の構成

0x00000000~0x000003FFQueue entry0~127
0x00000400~0x00260190Task Structure0~16383

- Queue entryの構成

ビットフィールド313029~1415~1413~0
名称VE予約予約?TID
機能0:このQueueエントリは無効 1:このQueueエントリは有効0:タスクはすでに実行済み 1:タスクの実行待ち予約未使用:0で埋めるこのQueueエントリが示すタスクID

- タスク構造体の内容

0x00000000~0x00000003TASK_INF
0x00000004~0x00000007GR0
0x00000080~0x00000083GR31
0x00000084~0x00000087PCR
0x00000088~0x0000008BSPR(User mode)
0x0000008C~0x0000008FSPR(Kernel mode)
0x00000090~0x00000093PDT
0x00000094~0x00000097PSR
0x00000098~0x0000009BFLAGR
0x00000098~0x000000FF予約

- TASK_INFの構成

ビットフィールド3130~2928~0
名称VP予約
機能0:このTASKは無効 1:このTASKは有効タスクの優先度、0~3で0が最も優先度が低い予約

CC : Condition Code

条件分岐を行う際の分岐条件をCondition Code(以下CC)で指定します。通常のプロセッサにおける条件付き実行で使用されるCCとは異なります。MIST32ではBranchの条件を指定するコードとなります。ビットフィールドはAFEと共通となり、ジャンプ命令系においてAFEが無効となり、CCとして扱われます。なお、アセンブリ言語記述の際はCC1および、CC2どちらも対象とされるCodeに変換されます。

CCは1つ前の命令の発生させるフラグを参照します。1つ前の命令はCMP、TEST等の比較命令や、フラグを発生させる命令を用意する必要があります。1つ前の命令がフラグを発生させる名デイではない場合、プロセッサは正常に動作を続けることができず、暴走を起こしたり、停止する可能性があります(これ、いつか修正)。 #ALで無条件ジャンプの場合はこの限りではありません。

CMP命令を使用した際のフラグは、第1オペランド-第2オペランドのフラグがCCと比較されます。 cmp r0, 1, #seo

CodeOperate条件CC1CC2CC3(GCC)フラグ条件
0x0AlwaysAlwaysAL  Always
0x1Equal==EQZ EQZF
0x2Not Equal!=NEQNZNE!ZF
0x3Minus- MI SF
0x4Plus+ PL !SF
0x5Even Number2% EN PS
0x6Odd Number!%2 ON !PS
0x7Overflow  OVF OF
0x8Unsigned >=(Cary Set)>=UEOCGEUCF
0x9Unsigned <(Not Cary Set)<UUNCLTU!CF
0xAUnsigned >>UO GTUCF and !ZF
0xBUnsigned ⇐UEU LEU!CF or ZF
0xCSigned >=>=SEO GE(SF and OF) or (!SF and !OF)
0xDSigned <<SU LT(SF and !OF) or (!SF and OF)
0xESigned >>SO GT!((SF xor OF) or ZF)
0xFSigned ⇐SEU LE(SF xor OF) or ZF

自動タスクスイッチについて

後日

インテリジェントタスクキャッシュ

MIST32では32本物汎用レジスタを持っていて、タスクスイッチのコストが大きいという問題点があります。そのため、自動タスクスイッチ使用する際に、比較的使用頻度の高いタスクを自動的にキャッシュして、それを設定された保護レベルでそのキャッシュが追い出されないように保護する機能を持ちます。使用されるキャッシュは通常のLoad/Storeパイプに接続された1Lまたはそれより下位のキャッシュが使用され、使用者はタスクストラクチャでレベルを設定するだけでプロセッサの昨日により実現されます。最大に使用できる領域は実装依存となり、キャッシュなので非実装もアーキテクチャとして許可されます。もしもその領域を使い果たした場合、プロセッサは自動的に保護レベルにのっとったLRUアルゴリズムに基づき自動的にメモリに退避します。

アライメント

メモリアライメント

メモリアクセスはByte, Half Word, Wordアクセスが可能です。アクセス可能なアライメントは以下のようになります。

Addr:0Addr:1Addr:2Addr:3
ld8/st8OK(1Byte)OK(1Byte)OK(1Byte)OK(1Byte)
ld16/st16OK(2Byte)不定OK(2Byte)不定
ld32/st32/ppush/push/pop/OK(4Byte)不定不定不定

不定なアドレスでアクセスした場合はアライメント違反の割り込みが発生します。

I/Oアライメント

I/OにはWordアクセスが可能のみ。アクセス可能なアライメントは以下のようになります。

Addr:0Addr:1Addr:2Addr:3
ld8/st8不定不定不定不定
ld16/st16不定不定不定不定
ld32/st32/ppush/push/pop/OK(4Byte)不定不定不定

レジスタアライメント

全てWord単位でのアクセスになります。任意Byteを取得したい場合は命令を組み合わせる必要があります。

関数呼び出し規約

呼び出し側(caller)

後日

呼び出される側(callee)

後日

MMU

MMUは最大2段階のページングをサポートします。MMUのコントロールはPSR[1:0]によって、無変換から2段階まで行うことが可能です。しかし、当分無変換と2段階のみサポートをします。

アクセスフラグについて

ページ内オフセットにあたる[13:0]はフラグを格納しています。フラグは以下のようにアサインされています。

13:6Reserved予約
5:4PP(Page Privilege Flag)[00 K:RW U:**][01 K:R* U:R*][10 K:RW U:R*][11 K:RW U:RW]
3EX(Execution Flag)このページが実行可能である場合1
2D(Dirty Flag)このページが書き込みを行っている場合1(1の場合スワップアウトの必要あり)
1R(Read Flag)リードしているページである場合1(ページアウトのLRU制御用)
0V(Valid Flag)このページが有効である場合1

2段階変換について

プロセッサによりアクセスされた論理アドレスは1,2段目ページオフセットと、ページ内オフセットに分けられます。

31:2322:1413:0
1段目ページオフセット2段目ページオフセットページ内オフセット
  1. 1段目はPDTRとページオフセットが加算されたアドレスから2段目のディレクトリアドレスを求めます。
  2. 2段目は1段目より求めた2段目のディレクトリアドレスと、2段目ページオフセットを加算し、そのアドレスからページインデックスが求められます。
  3. 上位18ビットをページインデックス、下位14bitのページ内オフセットとし、物理アドレスに変換されたアドレスとなります。

Call/Returnについて

MIST32ではCall、Return命令を持っていません。しかし、CALLの一部を実現する命令を備えていて、ユーザは以下で同等の機能を実現することが可能となります。

CALL命令

main:
	PPUSH				;PC+4 Push
	SPJMP	function,	#AL	;Function Call
 
function:
...

CALL命令

main:
...
 
function:
	POP	GR0		;Pop Return Address
	SPJMP	GR0,	#AL	;Return

命令リスト

命令リストはCGENが吐き出したやつを参照 命令リスト

アセンブリ記述例

	CLW	R1				//ループ回数 : レジスタをクリアする命令
loop:
	CMP	R0,	0x1	
	SPJMP	end,		#EQ		//R0が1ならばend
	ADD	R1,	0x1
	CMP	R0,	0x0
	SPJMP	odd,		#ON		//R0が奇数ならodd : 符号付PC相対ジャンプ
even:
	SHR	R0,	0x1
	SPJMP	loop				//goto loop
odd:
	SHL	R0,	0x1
	ADD	R0,	R0
	SPJMP	loop				//goto loop
end:
	RET
  • AFE使用
main:
	CLW	R1				//ループ回数 : レジスタをクリアする命令
loop:
	CMP	R0,	0x1        
	SPJMP	end,		#EQ		//R0が1ならばend : 符号付PC相対ジャンプ
	SHL	R0,	0x1,	&1_EVEN_NONE	//第1operandが偶数ならR0/2、それ以外のときこの命令はNOP
	MUL	R0,	0x3,	&1_ODD_INC	//第1operandが奇数なら(R0*3)+1、それ以外のときはNOP        
	ADD	R1,	0x1
	UPJMP	loop                        
end:
	RET