Git Product home page Git Product logo

b4smt's Introduction

scala-CI

B4SMT

RISC-V OoO SMTプロセッサ

Chiselで実装されています

作者

  • @pineapplehunter
  • @michiya-kato

準備

これらのソフトウェアをインストールしておく必要があります。

プロセッサの生成・テストコードの生成

NixについてはNixの公式サイトやZero to Nixを参考にしてみてください。

開発

テスト

  • Verilator
  • Icarus Verilog

プロセッサの生成

次のコマンドで./processorにSystem Verilogのソースが出力されます。

$ make processor

テストコードの生成

次のコマンドで./programsにいくつかテスト用のプログラムとriscv-testsのコンパイル結果が出力されます。

$ make programs

テスト用のプログラムの生成

テスト用プログラムはnixを使って管理しています。

テスト方法

いくつかの時間のかかるテストを除いたテストは次のように行います。

$ sbt "testOnly * -- -l org.scalatest.tags.Slow"

すべてのテストを実行するには次のコマンドを実行します。(とても時間がかかります)

$ sbt test

細かく実行するテストを決めたい場合はIntellij IDEAでプロジェクトを開き、各テストを実行してください。

トラブルシューティング

依存関係周りを編集したらプロセッサが生成できない

コンパイル中に依存関係周りで問題が発生していれば、Nixの依存関係のキャッシュに問題がある場合があります。 その場合は./flake.nixを次のように編集します。

diff --git a/flake.nix b/flake.nix
index 726feaa..478b09e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,7 +37,7 @@
             ];
           };
           buildInputs = with pkgs; [ circt ];
---        depsSha256 = "sha256-W1Kgoc58kruhLW0CDzvuUgAjuRZbT4QqStJLAAnPuhc=";
+++        depsSha256 = "";
           buildPhase = ''
             sbt "runMain b4processor.B4Processor"
           '';

また一度makeすると次のエラーメッセージが出てきます。

error: hash mismatch in fixed-output derivation '/nix/store/01ghymlaf8f1r9ssqvdhn4j5kz3gk153-B4Processor-sbt-dependencies.tar.zst.drv':
         specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
            got:    sha256-W1Kgoc58kruhLW0CDzvuUgAjuRZbT4QqStJLAAnPuhc=

ここで出てきたハッシュ(例:sha256-W1Kgoc58kruhLW0CDzvuUgAjuRZbT4QqStJLAAnPuhc=)に置き換えてmakeするとうまくビルドされると思います。

b4smt's People

Contributors

pineapplehunter avatar scala-steward avatar michiya-kato avatar hidetarotanaka avatar

Watchers

D.Teru avatar  avatar

b4smt's Issues

P拡張用の動作検証 Tracking Issue

Verilatorを使用する前提で進める
検証にはriscofを使用その際にシミュレータのバイナリ化が必要

  • Verilatorの使用方法を調査
  • シミュレータのバイナリ化
    • SVファイルの出力
    • Verilatorでラップ
    • 引数から実行ファイルを指定しのコンテンツをメモリに展開(理想的にはRISC-V debug拡張だがこれは時間がかかるので避ける)
    • IOを用意することで実行中の結果を確認可能にする(B4Processor側対応済み)
  • riscofでP拡張を含めた全体テスト

クリティカルパスを短くする

What

現在の実装ではステージ数が少ないことにより、FPGA上での動作周波数がとても遅くなっている。(Nexys 4で10MHz。)そこで、クリティカルパスを短くする。

How

クリティカルパスはVivadoのImplementationのTiming画面で確認することができる。

  • フェッチとデコードの間に1ステージ追加する(Vidvadoで最長のパスとされている)
  • 更にクリティカルパスが存在するようであればステージの追加

Problems

修正内容が難しく、テストを増やさないといけない

LSQ

What

LSQの実装

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

64bit以外のアクセス幅でのバーストのサポート

What

8, 16, 32bit幅でのバーストのサポート

How

SimpleAXIMemoryWithSimulationIO.scalaでのreadAddrの計算が8Byteごとにインクリメントされているため,readならばここを修正するべき?

    when(!readState.empty) {
      when(readState.output.bits.address === memAddrMask) {
        readAddr := readState.output.bits
          .address(63, 3) + readBurstLen + (axi.read.ready && readDone).asUInt

Problems

  • 命令フェッチ時のバースト転送はどうなっているか
  • 8, 16, 32bit幅のアクセス時の仕様の確認

Execute Unit

What

実行ユニットの実装

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

Top

What

すべてのモジュールをまとめて一つのCPUとして動かせるもの

Todo

  • Topモジュールの作成
  • 関連するモジュールの完成
    • LSQ
    • データメモリ
    • 実行ユニット
  • テスト
    • RISC-V tests #12 これは完成後にまた別枠として取り組む
    • 分岐テスト
    • フィボナッチ数列
    • 関数呼び出し
    • OoO
    • ストア・ロード

Data Memory

What

データメモリの実装

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

Data Cache

What

データキャッシュ部分の記述

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

投機的実行

What

投機的な実行
現時点の実装では分岐が来るとすべて停止するような設計になっているので投機的な実行ができるようにする

How

Fetch部分の改善

Problems

他のモジュールへの影響が大きい。
実装が難しい

CSR

What

CSRの実装

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

Instruction Cache

What

命令キャッシュ部分の実装

Todo

  • モジュールの記述
  • テストの記述
  • 単位モジュールでのバグ修繕

RISC-V Test

What

RISC-Vテストの実行

Todo

  • テストの記述
  • バグ修繕

メモリのAXI接続

What

メモリ接続をAXIに対応させると、Vivado上でBRAMを作って接続ができるようになるので実機でのテストがよりかんたんになる。

How

AXIの仕様を読み込んでインターフェイスを実装する。

Problems

AXIはかなり複雑な規格なので、まずはAXI Liteに対応させることから始めると良いかもしれない。

Fetch

What

命令フェッチ部分の実装

##Todo

  • モジュールの記述 #16
  • テストの記述
  • 単位モジュールでのバグ修繕

miroのデータパスを更新

What

モジュールを作成していく中で変更された箇所をmiroで直す

Tasks

  • デコーダ
  • リオーダバッファ
  • レジスタファイル
  • フェッチ
  • LSQ
  • データメモリ
  • 命令メモリ
  • 実行ユニット
  • リザベーションステーション

メモリアクセスを統一

What

命令メモリ、データメモリを統一してお互いのアドレスにアクセスできるようにする。
できそうであればこのモジュールから他のメモリマップドIOにアクセスできるようにする。

How

単一のメモリアクセス用のモジュールを作成し、BRAMもしくはDRAMに接続するようにする。

Problems

ChiselのMemではなく、AXI経由で接続できる方が他のIOを接続できるので拡張性が高いが、実装が難しくなる。

例外処理

What

例外処理系の命令(ecall、ebreak)に対応させる

How

例外命令が来た際にはリオーダバッファの動作を例外まで進めてから停止して、例外処理を行うようにする。

Problems

#11 が必要になるかもしれない。

ドキュメンテーション追加

What

各種ドキュメントを追加する

Tasks

  • テストケースのドキュメント
  • Verilogファイルの生成方法
  • テスト方法
  • Vivadoでの使い方
  • FPGAに乗せる方法

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.