以前の投稿で書いたように、GSoC-2016での私のプロジェクトの名前は「ParallellaのRISC-Vポート」であり、最初にやらなければならなかったのはRISC-Vエコシステムを知ることでした。 これを行う最良の方法の1つは、YouTubeでの最初のRISC-Vワークショップのプレゼンテーションのビデオを見ることです。 最も重要な概念を理解するために、次のプレゼンテーションをお勧めします。
- はじめに(KrsteAsanović) ビデオ スライド
- ツールチェーンRISC-V(Andrew Waterman) ビデオ スライド
- RISC-V SoCジェネレーター「ロケットチップ」チゼル(Yunsup Lee)のビデオ スライド
- RISC-Vソフトウェアスタック構造(Sagar Karandikar) ビデオ スライド
- RISC-V(Albert Ou) ビデオ スライドのデバッグ
- OpenEmbedded(Martin Maas) ビデオ スライドを使用した新しいRISC-Vコードの移植
- RISC-Vテスト環境(Stephen Twigg) ビデオ スライド
RISC-Vカーネルの現在のハードウェア実装を記述するために使用されるScalaベースの言語であるChisel(Rocketカーネルにはインオーダーパイプラインがあり、BOOMにはアウトオブオーダーがある)および将来の実装に興味がある場合の別の
リンク 。
Chisel(Jonathan Bachrach)
ビデオ スライドのクイックガイド
Rocket Chipと連携し、拡張機能、ASICインフラストラクチャ、およびFPGA(Colin Schmidt)
ビデオ スライドを追加します
RISC-Vとコミュニティ開発に深く興味がある場合は、
ワークショップに参加することをお勧めします。

ParallellaのRISC-Vポートは、ChiseのソースからRocket Chipを使用して生成された完全に標準的なカーネルを使用します(
記事で非常に良い紹介が与えられてい
ます )。 最終結果はVerilog RTL(読み取り不可、Chiselのソースのみ読み取り可能)になり
、 Parallella OH(オープンハードウェア)
リポジトリで利用可能なParallellaのFPGAプロジェクトに含めることができ
ます 。 ただし、ここでは詳しく説明しません。これについては、以下の投稿で説明します。
このカーネル用のソフトウェアをコンパイルするには、RISC-V GNUツールチェーンを使用でき
ます 。これは
ここから入手でき
ます 。 コンパイルオプションは2つあります。
プロキシカーネル (プロキシカーネル、pk)で実行されるプログラムに使用されるNewlib Cライブラリを使用するか、LinuxおよびLinuxプログラムをコンパイルするGNU Cライブラリ(glibc)を使用してコンパイルします。 添付の手順を使用して両方のバージョン(
Linuxカーネル 、リリース4.1)をコンパイルしましたが、RISC-V ISAリファレンスシミュレーターである
Spikeでシミュレートすると、期待どおりに機能しました。
メインのRocket Chip
リポジトリは、ソース(主にChisel)を含むすべてのリポジトリとGitサブモジュールを使用して接続されます。これらのソースは、src / main / scala /にあるラッパーファイルを使用した適切な生成に必要です。 各サブモジュールは特定のコミットに関連付けられており、明らかに動作しています。その結果、アセンブリは安定しています。 個人的には、デフォルトのRV64Gカーネルの生成時にエラーは発生しませんでした(64ビット、[I] nteger、[M] ultiply / Division、[A] tomic、[F] Single Floating、[D] ouble Floating)。 (一般)、命令とデータのL1キャッシュ、外部世界との通信用のMemIOおよびHostIOインターフェイスを備えたTLBおよびFPUが含まれます。
典型的なFPGAシステム(Rocket ChipのY.Lee
プレゼンテーションの図に示されている)では、これら2つのインターフェイスがメインメモリにアクセスし、RISC-Vカーネル(ブートストラップ)をロードするために必要です。 後者は、CSR(制御ステータスレジスタ)を制御し、ターゲットマシン(プロキシカーネルまたはLinuxカーネルを実行する)からホストマシン(つまり、デュアルコアARMプロセッサ)へのシステムコール(I / O操作用)をサポートするために使用されますZynq FPGA)、
riscv-fesvr (フロントエンドサーバー)インスタンスを実行して、システムコールをオペレーティングシステム(つまり、ARM Linux)にディスパッチします。
カーネルを構成するために、
Config.scalaファイル内の値を変更することもでき
ます 。 このファイルには、さまざまなアプリケーション(C ++モデル、レギュラーサイズFPGA、小型FPGA、VLSIなど)の構成セットが含まれています。 CONFIG = XXX変数(つまり、DefaultFPGAConfig)を受け入れるスクリプトは、C ++シミュレーターまたはFPGAまたはVLSI向けのVerilog RTLを構築するために必要な構成を設定します。 これは、利用可能なさまざまなオプションを試し、ソフトウェアまたはハードウェアですばやく生成およびテストする場合に非常に便利です。
C ++シミュレーターまたはSynopsys VCSを使用してカーネルを検証するテストをコンパイルおよび実行する必要があるため、カーネルを生成する前にツールチェーンを(Newlibで最適に)コンパイルすることをお勧めします。 残念ながら、最初のものだけを使用できましたが、最後のものは使用できませんでした。 テストベンチではDirectC関数(Verilogテストベンチと任意のC / C ++コードのリンク)が使用されるため、Verilogシミュレーター(Verilator、Icarus Verilog、Modelsim、QuestSimなど)は使用できません。 幸いなことに、C ++シミュレーターはVCD出力を提供し、GTKWaveを使用して、生成されたテストタイミングチャートを表示することができました。

また、RISC-Vツールチェーンを構築し、FPGA用のRV64Gコアを生成するために必要な簡単なコマンドのセッションを追加しました。 これらのコマンドは最終的なコンパイルスクリプトに追加され、Parallella Zynqチップ内でRISC-Vコアを動作させるために必要なすべてを完全に自動化するために開発しています。
次の投稿では、生成されたRV64GカーネルからIPブロックを取得し、ZedboardでのテストやParallellaでの大規模プロジェクトでの使用のために、プロジェクトに簡単に接続できるようにする方法を検討します。