Open13

「RISC-VとChiselで学ぶ はじめてのCUP自作」の読書メモ

yuji38kwmtyuji38kwmt

https://gihyo.jp/book/2021/978-4-297-12305-5

https://github.com/chadyuu/riscv-chisel-book

1章

  • 組み合わせ論理
  • 順序論理
  • CMOSはNAND,NOR,NOTの3回路が基本
  • ラッチ回路:1bitの情報を保持できる
  • クロック信号によって順序論理回路の状態を更新している
    • 立ち上がりエッジ、下がりエッジ
  • Dラッチ回路
  • DFF回路(Delayed Flip-Flop回路)
    • 立ち上がりエッジのみ状態を更新する

感想

  • Dラッチ回路、DFF回路から理解が怪しくなってきた
  • クロック信号を初めて正しく理解できた気がする。
yuji38kwmtyuji38kwmt

2章

Instruction Decode

  • RISC-V
    • レジスタの本数は32本
    • opcodeは共通
    • immは即値
  • 昔はCISCが好まれていた。
    • RISCはパイプライン処理を得意とする
    • intelはマイクロオペレーション実施
  • RISC型はレジスターレジスタ形式
yuji38kwmtyuji38kwmt

4章

  • ISAの開発方式
    • インクリメンタル型
    • モジュール型
      • RISC-V

疑問

  • 私のコンピュータのレジスタはどうなっているのか?
yuji38kwmtyuji38kwmt

6章

$ docker run -it -v ~/Documents/riscv-chisel-book:/src riscv/mycpu 


root@1b04419c9a5a:/src/chisel-template# sbt "testOnly fetch.HexTest"
[info] Loading settings for project chisel-template-build from plugins.sbt ...
[info] Loading project definition from /src/chisel-template/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to %NAME% (in build file:/src/chisel-template/)
Elaborating design...
Done elaborating.
pc_reg : 0x00000000
inst   : 0x14131211
---------
pc_reg : 0x00000004
inst   : 0x24232221
---------
pc_reg : 0x00000008
inst   : 0x34333231
---------tch.HexTest 3s
test Top Success: 0 tests passed in 4 cycles in 0.057379 seconds 69.71 Hz
[info] HexTest:
[info] mycpu
[info] - should work through hex
[info] Run completed in 3 seconds, 464 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 6 s, completed Mar 5, 2023, 2:35:36 AM
root@1b04419c9a5a:/src/chisel-template# 

yuji38kwmtyuji38kwmt

7章

  • =/= : 非等価
root@e67065479d89:/src/chisel-template# sbt "testOnly decode.HexTest"
[info] Loading settings for project chisel-template-build from plugins.sbt ...
[info] Loading project definition from /src/chisel-template/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to %NAME% (in build file:/src/chisel-template/)
Elaborating design...
Done elaborating.
pc_reg   : 0x00000000
inst     : 0x14131211
rs1_addr :   6
rs2_addr :   1
wb_addr  :   4
rs1_data : 0x00000000
rs2_data : 0x00000000 2s
---------
pc_reg   : 0x00000004
inst     : 0x24232221
rs1_addr :   6
rs2_addr :   2
wb_addr  :   4
rs1_data : 0x00000000
rs2_data : 0x00000000
---------
pc_reg   : 0x00000008
inst     : 0x34333231
rs1_addr :   6
rs2_addr :   3
wb_addr  :   4
rs1_data : 0x00000000
rs2_data : 0x00000000
---------
test Top Success: 0 tests passed in 4 cycles in 0.047788 seconds 83.70 Hz
[info] HexTest:
[info] mycpu
[info] - should work through hex
[info] Run completed in 2 seconds, 922 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 5 s, completed Mar 6, 2023, 2:08:37 PM

yuji38kwmtyuji38kwmt

8章

  • lw : load word
  • sext : sign extension(符号拡張)
  • imm_i : 即値
  • LW命令はI形式
  • alu : Arithmetic Logic Unit
  • RISC-Vではハードウェアではなくソフトウェア側でオーバフローに対応する
  • lw.hexの意味が分からなかった。

つまり、この機会語はメモリアドレス8のデータを6番レジスタへロードする命令だと解読できます。
???
メモリアドレス8はどこで決まった?

root@e67065479d89:/src/chisel-template# sbt "testOnly lw.HexTest"
[info] Loading settings for project chisel-template-build from plugins.sbt ...
[info] Loading project definition from /src/chisel-template/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to %NAME% (in build file:/src/chisel-template/)
Elaborating design...
Done elaborating.
pc_reg    : 0x00000000
inst      : 0x00802303
rs1_addr  :   0
rs2_addr  :   8
wb_addr   :   6
rs1_data  : 0x00000000
rs2_data  : 0x00000000
wb_data   : 0x22222222
dmem.addr :           8
---------
pc_reg    : 0x00000004
inst      : 0x14131211
rs1_addr  :   6
rs2_addr  :   1
wb_addr   :   4
rs1_data  : 0x22222222
rs2_data  : 0x00000000
wb_data   : 0x00802303
dmem.addr :           0
---------
test Top Success: 0 tests passed in 3 cycles in 0.045815 seconds 65.48 Hz
[info] HexTest:
[info] mycpu
[info] - should work through hex
[info] Run completed in 3 seconds, 290 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 6 s, completed Mar 6, 2023, 2:49:49 PM

感想

  • なんとか理解できたけど、難しい。何度も読み返している。
  • LW命令の定義もメモリにあるし、LW命令で読み込むデータもメモリにある、というのが理解するのに時間がかかった。
yuji38kwmtyuji38kwmt

9章: SW命令

  • SW命令はS形式
root@e67065479d89:/src/chisel-template# sbt "testOnly sw.HexTest"
[info] Loading settings for project chisel-template-build from plugins.sbt ...
[info] Loading project definition from /src/chisel-template/project
[info] Loading settings for project root from build.sbt ...
[info] Set current project to %NAME% (in build file:/src/chisel-template/)
Elaborating design...
Done elaborating.
pc_reg     : 0x00000000
inst       : 0x00802303
rs1_addr   :   0
rs2_addr   :   8
wb_addr    :   6
rs1_data   : 0x00000000
rs2_data   : 0x00000000 compileIncremental 0s
wb_data    : 0x22222222
dmem.addr  :           8
dmem.wen   :  0
dmem.wdata : 0x00000000
---------
pc_reg     : 0x00000004
inst       : 0x00602823
rs1_addr   :   0
rs2_addr   :   6
wb_addr    :  16
rs1_data   : 0x00000000
rs2_data   : 0x22222222
wb_data    : 0x00000000
dmem.addr  :          16
dmem.wen   :  1
dmem.wdata : 0x22222222
---------
test Top Success: 0 tests passed in 3 cycles in 0.078820 seconds 38.06 Hz
[info] HexTest:
[info] mycpu
[info] - should work through hex
[info] Run completed in 6 seconds, 76 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 8 s, completed Mar 6, 2023, 3:26:25 PM

メモ

  • メモリは8bit単位で割り当てる
yuji38kwmtyuji38kwmt

12章: デコーダーの強化

  • やっていることは命令デコード(instの判定)を1回だけにして、その結果を変数にマッピングしている
    • → コードの見通しはよくなったが、回路の見通しもよくなっているのか?なんとなくinstを判定するのは回路が複雑になりそうだが、本当に回路の見通しも良くなっているのかは分からなかった。
yuji38kwmtyuji38kwmt

13章: シフト演算

  • シフト量は5bit.
  • 左シフトではオーバフローに対処している
yuji38kwmtyuji38kwmt

14章: 比較演算の実装

  • SLT, SLTUでは<のみ。>=は否定で対応できるからか。

15章: 条件分岐

  • プログラムカウンタ(PC) : 次の命令があるメモリのアドレス
  • 分岐命令はB形式
  • B形式は即値12bitを表現できるが、上位11bitのみ規定して、下位0bitは常に0。即値は常に2の倍数。できるだけ遠いアドレスへジャンプできるようにするため。
  • RISC-Vは一般命令は32bitだが、圧縮拡張命令は16bit。PCは2の倍数
  • B形式は即値の順番が揃っていない。命令形式が異なっても、即値の各桁ができるだけ同じbitになるようにしたたため。回路が効率化される。
    • → 理解するのに時間がかかった。しかしおもしろい。
yuji38kwmtyuji38kwmt

16章

  • JAL命令:B形式同様、即値の最下位bitは常に0
  • JALR命令:&~1で最下位bitを常に0にしている
    • RISC-V命令長が2byteなため
    • ジャンプ可能な幅を大きくするため
  • rdレジスタにはジャンプしなかった場合の後続命令アドレスに相当するアドレスを格納。関数から戻ったときよう
    *
yuji38kwmtyuji38kwmt

17章 即値ロード

  • LUI(Load Upper Immediate)
    • 12bit左シフト
    • 即値が31~12bit目に入っているから12bit左シフト。
  • AUIPC(Add Upper Immediate to PC)
    • PC相対アドレス
    • migi
    • 「AUIPC命令とJALR命令を組み合わせると32bit範囲内で任意の相対アドレスにジャンプできる」という部分がよく分からなかった。