初めての

CPUをつくってみた
   筑波大学情報科学類
    えりっくさーとる
自分について
•  @siritori	
  
•  CPUとか(リアルに)よくわからない
•  おもいっきりソフトウェアの人間です
•  好き:しりとりと自然言語処理とおっぱい



              筑波大学情報科学類
               えりっくさーとる
カーネル/VMのネタのために

CPU作るか(適当)
作ったもの
•  Whitespaceを実行するCPU
作ったもの
•  Whitespaceを実行するCPU
作ったもの
•  Whitespaceを実行するCPU

•  落ち着け、別に大したことではない

•  メモリ上にWhitespaceコードを置いて
 それを実行するようなやつ

•  Verilogで書いてみた
前提知識
Verilog
•  ハードウェア記述言語(HDL)の一種
•  もともとシミュレーション用の言語
•  入出力のピンと、回路ブロックの挙動とその
 接続状態を書く
•  なんか授業で(超ざっくり)習ったぽよ
前提知識
Whitespace
•  みんな大好きEsolang

•  半角スペースとタブ文字と改行だけで表現

•  そもそもコードが目に見えない
前提知識
Whitespace
[SP][SP][TAB][TAB][SP][LF]

[SP][SP][TAB][SP][LF]

[TAB][SP][SP][SP]

                    こういうの
前提知識
Whitespace
           PUSH
[SP][SP][TAB][TAB][SP][LF]
           PUSH
[SP][SP][TAB][SP][LF]
                    ADD
[TAB][SP][SP][SP]
前提知識
Whitespace
[SP][SP][TAB][TAB][SP][LF]

[SP][SP][TAB][SP][LF]
リテラルは2進数で表現。
[TAB][SP][SP][SP]
[TAB]を1、[SP]を0として表現
[LF]が終わりを意味する
前提知識
Whitespace
  もしかして:タダのアセンブリ?
前提知識
Whitespace
  もしかして:タダのアセンブリ?
前提知識
Whitespace
push  add   label load
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
  スタック操作

Whitespace
push  add   label load
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
         算術操作

Whitespace
push  add   label load
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
              ジャンプ操作

Whitespace
push  add   label load
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
                    ヒープ(メモリ)
                      操作
Whitespace
push  add   label load
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
Whitespace
push  add   label load
                     入出力操作
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
Whitespace
  もしかして:タダのアセンブリ?
       ...ってことは、

実行できるCPU作れるのでは?
   という話に当然なる
前提知識
Whitespace
  もしかして:タダのアセンブリ?
       ...ってことは、

実行できるCPU作れるのでは?
 という話に当然なる(断定)
前提知識



 完
おもむろに書き始める
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




        プログラム
         メモリ
          &
        フェッチ
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




        プログラム
         メモリ
          &
        フェッチ
ヒープ
•  ぶっちゃけただのメモリ
•  かんたーん

      CS
     CLK
                   [31:0]q
    LOAD
[31:0]addr
   [31:0]d
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




        プログラム
         メモリ
          &
        フェッチ
スタック
•  [3:0]modeで操作を指定
•  算術命令もいれちゃった(* ∀ 人)
•  top1がスタックトップ、top2は2番目

      CS
     RST
     CLK              [31:0]top1
[3:0]mode
                      [31:0]top2
[31:0]addr
   [31:0]d
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




       プログラム
         メモリ
          &
        フェッチ
プログラムメモリ&フェッチ
プログラムメモリ&フェッチ


 あれ?Whitespaceって
 命令が固定長じゃなくね?
プログラムメモリ&フェッチ



 うわー
 あかんやつやこれ
プログラムメモリ&フェッチ
•  読み始めるアドレスを入れると
•  オペコードとオペランドと次のアドレス
がでてくるようなメモリ
•  オペコードが1クロックで1発フェッチが
できないので、終わったらDONEフラグ
を立てるようにしてみた
プログラムメモリ&フェッチ
こんな感じに遷移することにする




         CMD        OP
 END
        FETCH     FETCH
プログラムメモリ&フェッチ
•  addrから読み始めるアドレスを入力
•  cmdにオペコード,opにオペランド


      CS          [31:0]next
     RST          [5:0]cmd
     CLK          [31:0]op
[31:0]addr        DONE
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




        プログラム
         メモリ
          &
        フェッチ
だーかーらーCPUのしくみ知らんって
  言ってるじゃん(´;ω;`)
フローコントローラと
    ステートマシン
こんな感じに遷移することにする(既視感




 FETCH   EXEC1   EXEC2
フローコントローラと
     ステートマシン
•  フェッチが終わるまで待ってー
•  命令にあわせてヒープやスタックを起こし
 て仕事させてー
•  場合によっては書き込む
•  を繰り返す
フローコントローラと
     ステートマシン



•  inputとoutputピンがやたら多いので
 図は省略
ブロック図

         フロー
       コントローラ
ヒープ       &      スタック
       ステートマシン




        プログラム
          メモリ
           &
         フェッチ
デモ
0x001 push 6
0x006 push 4
0x00C add
0x010 call 0x0100

0x100 push 2
0x105 mul
0x109 slide 2
0x10F ret
デモ
                      これらを	
  
0x001 push 6        ハンドアセンブル	
  
0x006 push 4         する(震え声	
0x00C add
0x010 call 0x0100

0x100 push 2
0x105 mul
0x109 slide 2
0x10F ret
まとめ
•  普段の勉強法とは違う方法でやってみた
•  なんだかんだでCPUできた
•  Whitespaceが動くアーキテクチャは



       作れる
ところで
前提知識
Whitespace
push  add   label load
                     入出力操作
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit
前提知識
Whitespace
push  add   label load
                     入出力操作
dup    sub  call  store
    もしかして:タダのアセンブリ?
copy   mul  jump  getc
swap   sub  jeq   getn
pop    div  jneg  putc
slide  mod  ret   putn
            exit

    I/Oは?
終わってねーよ
ご清聴
 ありがとう
ございました

初めてのCPUを作ってみた