初めてのCPUを作ってみた

5,334 views

Published on

2/16にカーネル/VM探検隊@関西で発表した内容です。初めてのCPUを作ってみた。でもそのCPUはちょっと変わってて…?

Published in: Technology
1 Comment
16 Likes
Statistics
Notes
  • あっスライドに入れ忘れた 実際のVerilogコードは
    https://gist.github.com/siritori/4967071
    ↑ こちらです
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
5,334
On SlideShare
0
From Embeds
0
Number of Embeds
839
Actions
Shares
0
Downloads
19
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide

初めてのCPUを作ってみた

  1. 1. 初めてのCPUをつくってみた 筑波大学情報科学類 えりっくさーとる
  2. 2. 自分について•  @siritori  •  CPUとか(リアルに)よくわからない•  おもいっきりソフトウェアの人間です•  好き:しりとりと自然言語処理とおっぱい 筑波大学情報科学類 えりっくさーとる
  3. 3. カーネル/VMのネタのためにCPU作るか(適当)
  4. 4. 作ったもの•  Whitespaceを実行するCPU
  5. 5. 作ったもの•  Whitespaceを実行するCPU
  6. 6. 作ったもの•  Whitespaceを実行するCPU•  落ち着け、別に大したことではない•  メモリ上にWhitespaceコードを置いて それを実行するようなやつ•  Verilogで書いてみた
  7. 7. 前提知識Verilog•  ハードウェア記述言語(HDL)の一種•  もともとシミュレーション用の言語•  入出力のピンと、回路ブロックの挙動とその 接続状態を書く•  なんか授業で(超ざっくり)習ったぽよ
  8. 8. 前提知識Whitespace•  みんな大好きEsolang•  半角スペースとタブ文字と改行だけで表現•  そもそもコードが目に見えない
  9. 9. 前提知識Whitespace[SP][SP][TAB][TAB][SP][LF][SP][SP][TAB][SP][LF][TAB][SP][SP][SP] こういうの
  10. 10. 前提知識Whitespace PUSH[SP][SP][TAB][TAB][SP][LF] PUSH[SP][SP][TAB][SP][LF] ADD[TAB][SP][SP][SP]
  11. 11. 前提知識Whitespace[SP][SP][TAB][TAB][SP][LF][SP][SP][TAB][SP][LF]リテラルは2進数で表現。[TAB][SP][SP][SP][TAB]を1、[SP]を0として表現[LF]が終わりを意味する
  12. 12. 前提知識Whitespace もしかして:タダのアセンブリ?
  13. 13. 前提知識Whitespace もしかして:タダのアセンブリ?
  14. 14. 前提知識Whitespacepush add label loaddup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  15. 15. 前提知識 スタック操作Whitespacepush add label loaddup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  16. 16. 前提知識 算術操作Whitespacepush add label loaddup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  17. 17. 前提知識 ジャンプ操作Whitespacepush add label loaddup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  18. 18. 前提知識 ヒープ(メモリ) 操作Whitespacepush add label loaddup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  19. 19. 前提知識Whitespacepush add label load 入出力操作dup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  20. 20. 前提知識Whitespace もしかして:タダのアセンブリ? ...ってことは、実行できるCPU作れるのでは? という話に当然なる
  21. 21. 前提知識Whitespace もしかして:タダのアセンブリ? ...ってことは、実行できるCPU作れるのでは? という話に当然なる(断定)
  22. 22. 前提知識 完
  23. 23. おもむろに書き始める
  24. 24. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  25. 25. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  26. 26. ヒープ•  ぶっちゃけただのメモリ•  かんたーん CS CLK [31:0]q LOAD[31:0]addr [31:0]d
  27. 27. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  28. 28. スタック•  [3:0]modeで操作を指定•  算術命令もいれちゃった(* ∀ 人)•  top1がスタックトップ、top2は2番目 CS RST CLK [31:0]top1[3:0]mode [31:0]top2[31:0]addr [31:0]d
  29. 29. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  30. 30. プログラムメモリ&フェッチ
  31. 31. プログラムメモリ&フェッチ あれ?Whitespaceって 命令が固定長じゃなくね?
  32. 32. プログラムメモリ&フェッチ うわー あかんやつやこれ
  33. 33. プログラムメモリ&フェッチ•  読み始めるアドレスを入れると•  オペコードとオペランドと次のアドレスがでてくるようなメモリ•  オペコードが1クロックで1発フェッチができないので、終わったらDONEフラグを立てるようにしてみた
  34. 34. プログラムメモリ&フェッチこんな感じに遷移することにする CMD OP END FETCH FETCH
  35. 35. プログラムメモリ&フェッチ•  addrから読み始めるアドレスを入力•  cmdにオペコード,opにオペランド CS [31:0]next RST [5:0]cmd CLK [31:0]op[31:0]addr DONE
  36. 36. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  37. 37. だーかーらーCPUのしくみ知らんって 言ってるじゃん(´;ω;`)
  38. 38. フローコントローラと ステートマシンこんな感じに遷移することにする(既視感 FETCH EXEC1 EXEC2
  39. 39. フローコントローラと ステートマシン•  フェッチが終わるまで待ってー•  命令にあわせてヒープやスタックを起こし て仕事させてー•  場合によっては書き込む•  を繰り返す
  40. 40. フローコントローラと ステートマシン•  inputとoutputピンがやたら多いので 図は省略
  41. 41. ブロック図 フロー コントローラヒープ & スタック ステートマシン プログラム メモリ & フェッチ
  42. 42. デモ0x001 push 60x006 push 40x00C add0x010 call 0x01000x100 push 20x105 mul0x109 slide 20x10F ret
  43. 43. デモ これらを  0x001 push 6 ハンドアセンブル  0x006 push 4 する(震え声 0x00C add0x010 call 0x01000x100 push 20x105 mul0x109 slide 20x10F ret
  44. 44. まとめ•  普段の勉強法とは違う方法でやってみた•  なんだかんだでCPUできた•  Whitespaceが動くアーキテクチャは 作れる
  45. 45. ところで
  46. 46. 前提知識Whitespacepush add label load 入出力操作dup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit
  47. 47. 前提知識Whitespacepush add label load 入出力操作dup sub call store もしかして:タダのアセンブリ?copy mul jump getcswap sub jeq getnpop div jneg putcslide mod ret putn exit I/Oは?
  48. 48. 終わってねーよ
  49. 49. ご清聴 ありがとうございました

×