独自CPU開発で学ぶ コンピュータのしくみ

概 要

OSをサポートできる、アウトオブオーダ実行に最適化したオレオレコンピュータを作りたい! そんな夢を2人の学生がかなえました。本書は、全く新たなCPUとコンピュータシステムそのものを開発・提供することを目的としたプロジェクト「Open Design Computer Project」の成果を、開発に携わった学生2人がまとめたテキストです。独自アーキテクチャのCPUをFPGA上に実装し、そのCPUのためのgccとbinutilsの移植方法について解説します。

著者 伊藤剛浩、川田裕貴
価格 本体3200円(税別)
ISBN 978-4-7980-4536-8
発売日 2016/3/11
判型 B5変
ページ数 440
CD/DVD
ダウンロード
表紙イメージ
購入 アマゾンで購入する
楽天で購入する

※リンク先によっては、販売ページが用意されていないことがあります。あらかじめご了承ください。

新しいウィンドウで開く 書籍購入のご案内

サポート

サポート情報は以下からご参照下さい。

サポート情報へのリンク

目次

ハードウェア編

1 CPUを自作するということ

2 開発環境を整えるということ

2.1 オリジナルCPUでソフトウェアを動かすためには

2.2 コンパイラとアセンブラの自作?

3 オープンソース・オープンハードウェア

4 本書の狙い

5 本書で扱う決まり事について

5.1 ハードウェア開発の環境と開発ツール

5.2 ハードウェア開発で使用するファイルのダウンロード

5.3 アセンブリ言語のフォーマットについて

5.4 ソフトウェア開発の環境と開発ツール

6 CPUの役割と動作原理

6.1 CPUの役割

6.2 IOの種類

6.3 超単純なCPUコア

6. 3.1 Register File

6. 3.2 PC

6. 3.3 ALU

6. 3.4 Flag Register

6. 3.5 Memory Access

6. 3.6 Writeback

6. 3.7 データの計算

6. 3.8 メモリ・外部デバイスへのLoad/Store

6. 3.9 分岐命令の実現

6. 3.10 条件分岐命令の実現

6.4 割り込みの対応

6. 4.1 割り込みについて

6. 4.2 コアに対する例外について

6. 4.3 割り込みに対応させたCPUコア

6. 4.4 分岐時の挙動

6. 4.5 割り込みのための準備

6. 4.6 割り込み時の挙動

6. 4.7 割り込みと分岐が同時に起きた場合の挙動

6. 4.8 割り込みからの復帰

6.5 命令表記のしかた

6.6 少し複雑な命令表記のしかた

6. 6.1 ディスプレイスメント付き命令

6. 6.2 コンディションコード付き命令

6.7 メモリと命令・データの配置

6.8 高速化の技術

6. 8.1 パイプライン化

6. 8.2 パイプラインフォワーディング

6. 8.3 分岐予測と分岐先予測

6. 8.4 命令・データキャッシュ

6. 8.5 スーパースカラ

6. 8.6 レジスタリネーミング・アウトオブオーダ実行

7 FPGA開発の基礎知識

7.1 回路記述の心得

7.2 組み合わせ回路

7.3 順序回路

7.4 同期回路

7.5 非同期回路

7.6 組み合わせ回路のサイズに要注意

7.7 ブロック図の設計

8 Verilog HDL入門

8.1 基本文法

8. 1.1 モジュール・ポート宣言

8. 1.2 パラメータ宣言

8. 1.3 ワイヤ・レジスタ宣言

8. 1.4 メモリ宣言

8. 1.5 組み合わせ回路

8. 1.6 always文の組み合わせ回路

8. 1.7 always文の順序回路

8. 1.8 function文

8. 1.9 連接演算子とビット抽出

8. 1.10 下位モジュールの接続

8.2 記述スタイル

8. 2.1 ファイルとモジュール定義

8. 2.2 always文の記述

8. 2.3 wire/reg宣言

8. 2.4 下位モジュール接続

8. 2.5 default_nettypeを設定する

9 RTLシミュレーション

9.1 テストベンチ

9.2 4bit加算回路のシミュレーション

9. 2.1 ModelSimのバッチファイル

9. 2.2 シミュレーションの開始

9. 2.3 波形の観測

10 FPGAボードの紹介

10.1 Terasic DE0-CV

10. 1.1 搭載デバイス

10.2 Terasic DE2-115

10. 2.1 搭載デバイス

11 論理合成と実機動作

11.1 プロジェクトの製作

11.2 FPGAのピンとVerilogのポートの対応付け

11.3 タイミング制約の追加

11. 3.1 クロックの制約

11. 3.2 入力ポートの制約

11. 3.3 出力ポートの制約

11. 3.4 タイミング制約の書き出しと設定

11.4 FPGAへ書き込み

11. 4.1 JTAGでの書き込み

11. 4.2 ASでの書き込み

11.5 IPの使用

12 MIST32アーキテクチャ

12.1 MIST32の特徴的な仕組み

12. 1.1 フラグの取り扱いと分岐の実現

12. 1.2 多倍長演算の実現

12.2 コンディションコード

12.3 レジスタ

12. 3.1 GR

12. 3.2 FLAGR

12. 3.3 PCR

12. 3.4 SPR

12. 3.5 PSR

12. 3.6 IDTR

12. 3.7 FI0R

12. 3.8 FRCR

12. 3.9 FRCLR

12. 3.10 FRCHR

12. 3.11 PFLAGR

12. 3.12 PPCR

12. 3.13 PPSR

12.4 メモリアクセス

12. 4.1 エンディアン

12. 4.2 メモリアクセスアライメント

12.5 命令フォーマット

12.6 命令一覧

12.7 割り込み

12. 7.1 割り込み番号

12. 7.2 割り込みディスクリプタ

12. 7.3 割り込みの手順

12.8 ソフトウェアに対する定義

12. 8.1 呼び出し規約

12. 8.2 分岐命令のスタイル

13 MIST32E10FA

13.1 パイプラインの詳細

13.2 ファイルの説明

13.3 信号名の規則

14 命令が実行される過程を確かめる ― MULL命令

14.1 MULL命令について

14.2 Fetchステージ

14.3 Decoderステージ

14.4 Instruction Bufferステージ

14.5 Allocateステージ

14.6 Executeステージ

14.7 Writebackステージ

15 命令が実行される過程を確かめる ― SRPSW命令

15.1 Decoderステージ

15.2 Executeステージ

15.3 Writebackステージ

16 命令が実行される過程を確かめる ― PUSH命令

16.1 Decoderステージ

16.2 Allocateステージ

16.3 Executeステージ

17 命令が実行される過程を確かめる ― B命令

17.1 分岐命令について

17.2 Decoderステージ

17.3 Allocateステージ

17.4 Executeステージ

17.5 Pipeline Control

18 命令が実行される過程を確かめる ― IDTS命令

18.1 Decoderステージ

18.2 Executeステージ

18.3 Pipeline Control

18.4 Interrupt Control

19 命令が実行される過程を確かめる ― 割り込み

19.1 Interrupt Control

19.2 Pipeline Control

19. 2.1 L_PARAM_IRQ_CALLの条件

19. 2.2 L_PARAM_ALU_JUMP_IRQ_CALLの条件

20 命令が実行される過程を確かめる ― 割り込みからの復帰(IB命令)

20.1 Decoderステージ

20.2 Executeステージ

20.3 Pipeline Control

21 実装の詳細について

21.1 インターロック付パイプラインの実装方法

21.2 コアパイプラインの実装

21.3 IBステージ(instruction_buffer.sv)

21.4 IDステージ(decoder.sv)

21.5 コアパラメータ定義ファイル(core.h)

21.6 IFステージ(fetch.sv)

21.7 ALステージ(allocate.sv)

21.8 EXステージ(execute.sv)

21. 8.1 Integer/Logic/Shift命令

21. 8.2 Load/Store命令

21. 8.3 Branch命令

21.9 パイプラインコントロール(pipeline_contro.sv)

21. 9.1 分岐命令実行時(EXステージからの信号)

21. 9.2 IDTS命令の実行時(EXステージからの信号)

21. 9.3 割り込みの開始(割り込みコントローラからの信号)

21. 9.4 割り込みと分岐命令の同時実行(割り込みコントローラ/EXステージからの信号)

21. 9.5 割り込みからの復帰(EXステージからの信号)

21.10 コアパイプラインモジュール(core_pipeline.sv)

21.11 分岐予測と分岐先予測について

22 CPUの検証

22.1 モジュールごとの機能テスト

22.2 基本機能のテスト

22.3 命令レベル検証

22.4 ファンクションレベル検証

22.5 システムレベル検証

23 疑似乱数命令の追加

23.1 追加命令について

23.2 変更箇所

23. 2.1 core.h

23. 2.2 decode_function.sv

23. 2.3 execute_mul.sv

23.3 シミュレーション

24 コンピュータシステムの実装について

24.1 MIST32 Type-E Reference System1

24. 1.1 階層について

24. 1.2 外部デバイス

24. 1.3 搭載メモリ

24. 1.4 外部デバイスの割り込み

24. 1.5 アドレスマップ

24. 1.6 外部デバイスバス

24.2 起動シーケンス

コンピュータシステムの論理合成と使用方法

25.1 論理合成

25.2 プログラムの書き込み

25.3 使用方法

周辺デバイスの開発

参考文献

ソフトウェア編

27 オリジナルCPUでソフトウェアを動かすためには

27.1 コンパイラとアセンブラ

27.2 GNU Compiler CollectionとGNU Binutils

27. 2.1 GNU Compiler Collection(GCC)を選択した理由

27. 2.2 GNU Binutilsを選択した理由

27. 2.3 その他、GCCとBinutilsでできること

27.3 その他に用意するべきツール

27. 3.1 シミュレータ・エミュレータ・デバッガ

27. 3.2 標準ライブラリやOSなど

27. 3.3 ファームウェア(BIOS)

28 GNU Binutilsの移植

28.1 Binutilsの入手

28. 1.1 Webサイトから入手

28. 1.2 Gitリポジトリから入手

28. 1.3 開発ブランチの選択と作成

28.2 Binutilsをコンパイル

28. 2.1 コンパイル前の準備

28. 2.2 configure && make

28. 2.3 コンパイルしたBinutilsの動作確認

28.3 MIST32向けBinutilsの整備

28. 3.1 MIST32向けBinutilsの入手

28. 3.2 MIST32向けBinutilsリポジトリの登録と取り込み

28. 3.3 MIST32向けBinutilsのコンパイル

28.4 Binutilsの構成

28. 4.1 Binutilsの構成要素

28. 4.2 Binary File Descriptor(BFD)ライブラリ

28. 4.3 CGENとは

28. 4.4 MIST32向けターゲット移植の差分

28.5 BFDライブラリとELF

28. 5.1 ELF:Executable and Linkable Format

28. 5.2 セクションとシンボル

28. 5.3 ldを利用したリンク

28. 5.4 リロケーション(再配置)

28. 5.5 リンカスクリプト

28.6 CGENとCPU定義ファイル

28. 6.1 CGENの入手

28. 6.2 CGENによるopcodesライブラリの生成

28. 6.3 CPU定義ファイル (.cpu ファイル)

28. 6.4 .opcファイルについて

28.7 BFDライブラリの移植

28. 7.1 アーキテクチャ情報の追加

28. 7.2 リロケーション情報の追加

28. 7.3 複雑なリロケーション

28. 7.4 リロケーションの対応付け

28. 7.5 その他

28.8 GASの移植

28. 8.1 tc-mist32.cの基本的な構成

28. 8.2 オペランドとリロケーションの対応付け

28.9 その他の追加コード

29 GNU Compiler Collection(GCC)の移植

29.1 GCCの入手

29. 1.1 Webサイトから入手

29. 1.2 Gitリポジトリから入手

29. 1.3 開発ブランチの選択と作成

29.2 GCCをコンパイル

29. 2.1 コンパイル前の準備

29. 2.2 configure && make

29. 2.3 コンパイルしたGCCの動作確認

29.3 MIST32向けGCCの整備

29. 3.1 MIST32向けGCCの入手

29. 3.2 MIST32向けGCCリポジトリの登録と取り込み

29. 3.3 MIST32 向けGCC のコンパイル

29.4 GCCの内部処理の流れ

29. 4.1 Cコンパイル時の処理の流れ

29. 4.2 GCCのオプションによる違い

29. 4.3 cc1内部の処理の流れ

29. 4.4 GENERICとGIMPLE:フロントエンドの中間表現

29. 4.5 RTL:バックエンドの中間表現

29.5 GCCの構成

29. 5.1 GCCの構成要素

29. 5.2 MIST32ターゲット移植実装の差分

29. 5.3 configureとMakefile関連のファイル

29. 5.4 Machine Description

29. 5.5 Target Hooks and Macros

29. 5.6 libgcc関連のファイル

29.6 Machine Description

29. 6.1 Machine Descriptionのファイル構成

29. 6.2 define_insn

29. 6.3 define_expand

29. 6.4 define_split

29. 6.5 条件付きブランチ命令

29. 6.6 関数呼び出し命令

29. 6.7 RTLテンプレートを記述するためのコツ

29. 6.8 Predicatesの定義

29. 6.9 Constraintsの定義

29. 6.10 Pipline Description

29.7 Target Description Macros and Functions

29. 7.1 gcc/config/mist32.h

29. 7.2 gcc/config/mist32.c

29.8 GCCのデバッグとtestsuite

29. 8.1 RTL生成時のエラー

29. 8.2 testsuite

30 ソフトウェア開発

30. 0.1 サンプルコード

30.1 MIST32シミュレータ

30. 1.1 MIST32シミュレータの入手

30. 1.2 MIST32シミュレータのコンパイル

30. 1.3 MIST32シミュレータの使い方

30.2 簡単そうに見えるHello world

30. 2.1 puts相当の関数を作る

30. 2.2 Hello worldを実行してみる

30.3 テトリス

30. 3.1 DISPLAYモジュールの利用

30. 3.2 KEYBOARDモジュールの利用

30. 3.3 ディスプレイとキーボードのテスト

30. 3.4 テトリスの作り方

30. 3.5 テトリスを動かす

30.4 画像スライドショー

30. 4.1 SDモジュール

30. 4.2 割り込み

30. 4.3 画像フォーマットとSDイメージの生成

30. 4.4 動作例

30.5 さいごに

Appendix

A.1 Quartus PrimeとModelSimのダウンロードとインストール

A.2 Cygwinのダウンロードとインストール

PR

秀和システム