Skip to content

Instantly share code, notes, and snippets.

@levelfour
Last active October 10, 2017 12:46
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save levelfour/5cd66a1031b9e24dca42 to your computer and use it in GitHub Desktop.
Save levelfour/5cd66a1031b9e24dca42 to your computer and use it in GitHub Desktop.

1stアーキテクチャ: Carina

名前の由来

全天で2番目に明るいカノープスの学名(Carinae)から。「竜骨」という意味(りゅうこつ座のα星)。 ちなみに全天で太陽の次に最も明るいのはシリウスだが、見かけの等級が大きく絶対等級はそれほど大きくない。

アーキテクチャ詳細

  • 32bitプロセッサ(命令長、レジスタ長は基本的に32bit)

レジスタセット

  • General Purpose Register × 32
    • $zeroは定数の0
  • Floating Point Register × 32
  • Comparison Status
    • 1bitの比較結果格納用レジスタ, true/false
  • 例外用レジスタ ... Cause & Status
  • Program Counter

命令セット

(!)がついている命令はMIPSには存在しない命令

コア命令セット

(MIPSでは)1clockで終了

  • add
  • addi
  • and
  • andi
  • beq
  • bne
  • j (アドレス直接指定でジャンプ)
  • jal (戻りアドレスをr31に格納してジャンプ)
  • jr (レジスタに指定した番地にジャンプ)
  • jral(!) (戻りアドレスをr31に格納してレジスタに指定した番地にジャンプ)
  • lw (disp付き32bitロード命令)
  • nor
  • or
  • ori
  • slt (set less than)
  • slti
  • sll (shift left logical)
  • srl (shift right logical)
  • sw (disp付き32bitストア命令)
  • sub
  • nop(!)
  • hlt(!)
  • in(!)
    • ブロッキングでRS-232C受信
    • 受信キューが空の場合はブロッキング
  • out(!)
    • ノンブロッキングでRS-232C送信
  • asr.[eq|ne|lt|le](!)
    • アサーション命令
    • 基本はc.x.sと同じだが、false時にエラー終了し、その時点での全レジスタ値をデバッグ送信する
  • asr.[eq|ne|lt|le].s(!)
  • syscall

算術コア命令セット

(MIPSでは)2clock以上かかる

  • bclt
  • bclf
  • div
  • add.s
    • add single = 32bit fadd
  • c.[eq|lt|le].s
    • compare single, 3種類の比較方法
  • mul.s
  • inv.s(!)
  • sub.s
  • lw.s(lwcl)
  • mult
  • sw.s(swcl)

分岐

無条件分岐

  • jとjrはオペランドに指定したアドレスに無条件分岐
  • jal(jump and link)はr31に戻りアドレス(pc+4)を格納してアドレスにジャンプする

条件付き分岐

  • 等値性に基づいて分岐するときはbeqとbneを使う
  • 非等値性に基づいて分岐するときはslt系列を使ってオペランドを比較し、その結果を0/1と比較する

関数呼び出しと分岐

関数の呼び出しには「末尾呼び出し/not 末尾呼び出し」「直接呼び出し / クロージャ呼び出し」の計4種類がある。 それぞれ適切な分岐命令で実現することができる。

  • 末尾 + 直接呼び出し … j
  • 末尾 + クロージャ … jr
  • 非末尾 + 直接呼び出し … jal
  • 非末尾 + クロージャ … jral

呼び出し規約

jalとjrを用いたbranch and link

命令のバイトコード

MIPSに存在する命令はMIPSのバイトコードに準拠する。それ以外の命令について、バイトコードを示す。

  • nop
    • syntax sugar(適当にadd r0等に翻訳)
  • hlt
    • 111...11
  • jral
    • R: | 0x00(6bit) | reg(5bit) | ignore(15bit) | 0x09(5bit) |
  • in
    • R: | 0x1A(6bit) | ignore(5bit) | reg(5bit) | ignore(16bit) |
  • out
    • R: | 0x1B(5bit) | 00000 | reg(5bit) | ignore(16bit) |
  • asr.[eq|ne|lt|le]
    • R: | 0x1C(5bit) | r1(5bit) | r2(5bit) | ignore(10bit) | op(6bit) |
  • asr.[eq|ne|lt|le].s
    • FR: | 0x1D(5bit) | 0x10(5bit) | f1(5bit) | f2(5bit) | ignore(5bit) | op(6bit) |
  • syscall
    • R: | 0x1E(5bit) | - (5bit) | - (5bit) | - (5bit) | - (5bit) | vector(6bit) |
  • inv.s
    • FR: | 0x11(5bit) | 0x10(5bit) | f1(5bit) | ignore(5bit) | fdst(5bit) | 0x03(6bit) |

メモリ空間のセグメンテーション

  • .text
  • .data
  • スタック

の順でSRAMに割り当てる。スタックはSRAMの最後尾から定位アドレスへ伸びる。

SRAMの先頭からBlock RAMのサイズ分だけの領域アドレスはBlock RAMとバイパスがなされており、この領域のアドレスにアクセスしようとした場合はBRAMにアクセスされるようになる。 この領域は主に.textを割りつけるのに使う。

実行ファイル形式とプログラムロード

実行ファイルフォーマット(仮称CARN)

  • ヘッダ(16B)
    • magic number "CARN" (4B)
    • .text size (4B)
    • .data size (4B)
    • .entry point addr (4B)
  • .text
  • .data

プログラムロード

プロセッサを起動してまずCARNヘッダが送信されてくるのをwaitする。 ヘッダを受け取った後は.textサイズ、.dataサイズに従って残りの部分をロードし、上述の通りメモリに割り当てる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment