Skip to content

Keio-CSG/CPU-experiment

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ae3fc5e · Nov 24, 2022

History

62 Commits
Nov 15, 2021
Nov 18, 2021
Nov 18, 2021
Nov 25, 2021
Nov 25, 2021
Nov 25, 2021
Nov 25, 2021
Nov 26, 2021
Nov 26, 2021
Nov 26, 2021
Nov 24, 2022
Nov 26, 2021
Nov 18, 2021
Nov 15, 2021
Nov 1, 2022
Nov 18, 2021
Nov 15, 2021

Repository files navigation

Table of Contents

CSG-CPU-experiment

ver

  • 2022/11/1 2022年度のTA用に改定

TODO: 学生配布用のrepoを作成した方が良い。作成する回路は空白にしておかないと正解が書いてあるので面白くない。

前準備

  • Slack開設

  • Githubアカウント作成

  • VSCodeインストール+Verilogシンタックス登録(すると便利、ないとキツイ。これは当日フォローしたほうが良い。)

実験目的

  • シングルサイクルCPUで四則演算を行うこと

具体的には提示された簡易命令セットで最小構成のマイCPUを作り、CPUの基本を作って理解する。

身につく技術

  • SystemVerilogの扱い、シミュレーション

  • 論理回路の理解

  • CPU、コンピュータ・アーキテクチャに関する理解

1日目

自己紹介

  • 吉岡、TAの自己紹介

  • みんなの自己紹介

ペアを作成(結局各自で作った)

このセミナー開始にあたって

この授業の目的は研究体験であると解釈しています。まず研究と授業は全然違います。授業は基本的に受け身でよく、最悪授業に出席し言われた通りの範囲を勉強しレポートやテストに望めばOKです。

一方で研究は最先端の更にその先を目指す行為です。そのため教員もまだ知らないことも勉強する必要があり、研究遂行に必要な知識やスキルを教員が全て丁寧に教えることはありません(というか無理です)。もちろんベースとなる技術や論文、教科書を最初に提示しますし、輪講などで基本は教えます(それは教員の義務です)が卒論・修論を書くには自分で情報を調べることがかなり重要となります。

これは会社に入っても同様であり、今はどの会社でも新人研修よりもOJTで仕事スキルを付けることが多いかと思います。OJTというと聞こえは良いのですが、メンターは自分の仕事をしながらあなたの指導をするので大学の授業のように懇切丁寧に教えてくれるわけではなく、要点を絞って自分で調べてもわからない範囲で質問をする必要があります。なので研究における姿勢と仕事の姿勢はちょっと似ていますね。

環境設定

  • Slack、github、VSCodeの設定をフォロー

シミュレータ(Modelsim)の準備

Windowsの人

ModelSimをインストールします。インストール方法についてはリンクを参照してください。

Windows、Linux使用の方はリンクからModelSimをダウンロードし、インストールしてください。

ModelSimは記述したハードウェアコード(Verilog)のコンパイラ+シミュレータとなっています。ハードウェアでは波形表示で結果を見ることが多く、GUIソフトが必要となり結果としてファイルサイズなども大きくなってしまいます。ModelSimはフリーの古いソフトですが、今回の実験に必要な結果は得られるはずです。Xilinx社のVivadoの方が高性能ですが有料だったため今回は見送りました。

MACの人

https://qiita.com/RotaryKer/items/d8f6d218962c213b0577

Brewでシミュレータ(IcarusVerilog, WaveGen)が入ります。試してみてください。(当方MAC持っていないため未確認です) (去年MACの人はインストール上手くできず結局MACで開発、Win機にデータ移してmodelsim回しました。)

シミュレータ動作確認+最初の設計

テキスト

本セミナーでは**ディジタル回路設計とコンピュータアーキテクチャ[ARM版]**をベースに勉強します。この本はCPUの作り方まで勉強できる上、比較的わかりやすく書かれています。

3章までは必修のディジタル・アナログ回路の復習ですがデジタル回路は後半なのでまだ履修していないかもですね。

最初から読んでいきましょう、そして4章以降は新たに学ぶ内容です。

まず今日は4章の途中まで読むことを目標としましょう。

そして4章に書いてある例題をいくつかVerilogで記述し動作を確認してみましょう。

1日目終了後課題

設計してテストベンチを書き、動作を確認してみましょう。

  1. 入力a,bを与えられてa>bならば1を、a≦bならば0を出力する比較器を設計してください。
  2. 入力aを入力bでビットシフト(2^b倍する)回路を設計してください。
  3. a*bを行う掛け算回路を設計してください。
  4. 組み合わせ回路と順序回路の違いを説明してください。
  5. 2.8章の2:1マルチプレクサを実装してください。
  6. 4:1マルチプレクサを実装してください。
  7. 2:4デコーダを実装してください。
  8. (チャレンジ課題)テキスト1.4章にある通り、与えられた加算器は符号付き2の補数を用いたものでした(Verilogでは特に宣言をしないと2の補数で実装されます)符号なし表現を用いた(uintと呼ばれます)加算器を作ってみてください。
  9. Dフリップフロップはとても重要な回路です。回路動作を説明できるようにしてください。

詰まったら4章を見てみると実装が載っています。確認してみて下さい。

2日目

メモ:去年はこの日は吉岡がずっと会議だったため、学生に自習してもらいました。各自教科書を読み進めていたのですが、あまり進捗は良くなかったのでもう少しアクティビティぽくした方がよいかも。

教科書の: ・4.1-4.4, 4.9を読む。

5.1-5.2, 5.4を読む。(CPU設計にそこまで関係ないので流し読みで良いです)

・6章はCPU設計の本質です。6.1-6.4を本気で読みましょう。

Slackで送った課題が終わっていない方は課題にチャレンジしてみよう。

2日目課題

  1. カウンタ回路を設計してください。0から255までの値を数えられるように設計し、テストベンチで確認してください。 (カウンタ回路はクロックが入るたびに出力が1増える回路です。 リセット信号をもたせ、リセットが1の時は出力は0になり、リセットが0の時はカウンタ動作するようにしてください)

  2. 足し算、引き算、掛け算の機能を切り替えられる演算器(ALU)を設計してください。 入力はa, bそれぞれ32bitで出力も32bitとしてください。 2bitのsel(セレクタ)信号を受け取り、000の時は足し算、001の時は引き算、010の時は掛け算となるように設計してください。

3日目

3日目課題

  1. 教科書図7.2のレジスタファイルを作成する。 (参考:L22 https://github.com/kentaroy47/CPU-experiment/blob/main/99_cpuexample_verilog/MEMORY.v)
  2. 教科書図7.2のデータメモリを作成する。 addrは10bitでデータ数は1024とする。 WEとclkで書き込み機能を加え、各データはレジスタと同様32bitとしてください。
  3. 各種演算器を作成し、下記命令セットのR型、L型、W型を実装する。
  4. python 09_complier/compiler.pyを実行して出てくる命令コードをCPUに与え、命令どおりの計算ができることを確認する。

単純命令セット

命令セット

  • R型 [7:0]opcode, [12:8]rd1, [17:13]rd2, [22:18] rw, [31:23] 空き (計算に使う命令)
  • L型 [7:0]opcode==4, [17:8]memory, [22:18] r, [31:23]空き (データメモリからレジスタにデータ書き込みする命令)
  • W型 [7:0]opcode==5, [17:8]memory, [22:18] r, [31:23]空き (レジスタからデータメモリにデータ書き込みする命令)

単純にR型は

  • opcode==0: 足し算
  • opcode==1: 引き算
  • opcode==2: 掛け算
  • opcode==3: 割り算 としましょう。