FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

2020-02-01から1ヶ月間の記事一覧

RustのパーサジェネレータLALRPOPに入門する(3. ASTを作る)

パーサジェネレータの続き。 ASTを作る 次は四則演算を作るASTを作り上げる。文法自体はRustのマクロを使って実装されているので、RustのEnumなどを使ってASTを作り上げることができる。 rust/calculator4/src/ast.rs pub enum Expr { Number(i32), Op(Box<Expr>, </expr>…

RustのパーサジェネレータLALRPOPに入門する(2. 電卓を作る)

パーサジェネレータの続き。 電卓を作る lalrpop.github.io 次はパーサを使って電卓を作ってみる。電卓は四則演算を行うことができ、*, /の優先度が+, -よりも高い。calculator3.lalrpopは以下のようになる。 calculator3.lalrpop use std::str::FromStr; gr…

RustのパーサジェネレータLALRPOPに入門する(1. チュートリアルを読む)

パーサジェネレータについて調べていると、以下のようなGitHubリポジトリを見つけた。 LALRPOPという、Rust向けのパーサジェネレータらしい。結構☆が付いているのでかなり使い物になりそうな気がする。試してみよう。 github.com チュートリアルは以下のペー…

RustでRISC-V命令セットシミュレータを作ろう (13. RV32仮想アドレスモードの実装)

Rustで作る自作命令セットシミュレータの続き。RV32のテストは動くようになってきたので、次はRV32の仮想アドレスモードの対応について考える。 これも昔作ったC++のRISC-Vシミュレータですでに対応しているので簡単なのだが、いくつかRV32とRV64で切り替え…

RustでRISC-V命令セットシミュレータを作ろう (12. RV32機能の実装)

Rustで自作命令セットシミュレータを作っているが、RV64のテストパタンはある程度Passできるようになっている。 RV32についてだが、これまではRV32とRV64を別のクラスとして実装していた。しかしどうもこれでは冗長なコードがあってたまらないので、統一して…

Diplomacyを使ってOCPバスを作成する (9. Xbarの作成)

Diplomacyを使ってOCPバスを作成するプロジェクト、次はクロスバーを作成してみよう。クロスバーは2つ以上のスレーブノードを接続してバスをスプリットする。 val ram0 = LazyModule(new OCPRAM(AddressSet(0x000, 0x3ff))) val ram1 = LazyModule(new OCPRA…

Coqをベースとしたハードウェア表現および生成プラットフォーム"Kami"を試す

MITのプログラム言語を研究しているグループの検証プラットフォーム「Kami」の論文を読んでいる。 KamiとはCoqをベースとしたDSLで、ハードウェアを表現するための言語およびそのプラットフォーム。KamiはCoqのハードウェア記述から検証、ハードウェア生成ま…

Diplomacyを使ってOCPバスを作成する (8. PatternPusherの改良)

前回はDiplomacyを使ったOCPバスの作成で、Bundleを作成してValid/Readyの信号をCmd/Readyに変換した。次はこれに基づいてテスト環境を構築する。テスト環境ではまずはPatternPusherを使ってコマンドを挿入する。まずはPatternPusherを改造しなければ始まら…

【供養】2019年 CQ出版インターフェースでのRISC-V特集時にボツとなった原稿を無料公開します

2019年 にCQ出版さんのインターフェースで、RISC-V特集時に原稿を書かせていただいていました。 msyksphinz.hatenablog.com そのときにには7本の原稿を提出していましたが、実は雑誌に掲載されていたのは5本でした。 残りの2本は紙面の関係上掲載は見送りと…

Diplomacyを使ってOCPバスを作成する(7. Bundleの改善)

これまでDiplomacyを使ってOCPバスを作ってきたが、まだ改善したいところがある。まずは OCPバスなのにコマンドチャネルにValid信号がある。 各種コマンドをサポートしていきたい。 特にValid信号は大きな問題だ。OCPはCommand ⇔ Ready信号のハンドシェーク…

RustでRISC-V命令セットシミュレータを作ろう (11. 命令デコーダの実装)

Rust製自作命令セットシミュレータ、命令デコーダの実装を少しずつ改造している。 与えられた機械語から、命令をデコードして意味を解析する。 RISC-Vの機械語は非常に単純なので、命令デコーダの設計は簡単だ。 単純にcase文を並べていくだけで完成する。こ…

RustでRISC-V命令セットシミュレータを作ろう (10. Rustでテストケースを作成する)

Cargoのテスト環境を使ってリグレッションテストを作る Rustで作った命令セットシミュレータについて、テストの方法を考え直した。 現在はMakefileで管理をしているが、Cargoの機能を使ってテスト環境を構築した方が良さそうだ。 そこでRustのmain()を直接呼…

RustでRISC-V命令セットシミュレータを作ろう (9. 命令のディスアセンブル機能を実装する)

Rustを使ったRISC-Vシミュレータの調整を行っている。デバッグ・トレース機能の調整を行った。 もうひとつの機能は、命令の機械語からニーモニックを出力する機能だ。 実はこの機能は必須の機能ではない。 spike-dasmというriscv-toolsを使えば、逆アセンブ…

RustでRISC-V命令セットシミュレータを作ろう (8. デバッグ・トレース機能の整理)

Rustを使ったRISC-Vシミュレータの調整を行っている。デバッグ・トレース機能の調整を行った。 ISSを使ってテストプログラムをデバッグする場合、いくつかの情報を出力してプログラムの動作を監視する必要がある。例えば、ISSからは以下の情報が出てくると役…

Diplomacyを使ってOCPバスを作成する(6. Delayerの実装)

Diplomacyを使ってOCPバスを作成している。OCP SRAMの動作を確認しつつ、OCPのDelayerを実装しようと思う。DelayerというのはバスのReady信号を遅らせて、信号を遅らせてバスの問題を検出するための機能だ。 TileLinkのDelayerはすでに実装されている。これ…

Diplomacyを使ってOCPバスを作成する(5. OCP SRAMのデバッグ)

Diplomacyを使ってOCPバスを作成している。OCP SRAMの動作を確認しているが、どうも上手く動いていないようだ。Diplomacyの構成を確認している。SRAMは1サイクル後にReadデータが出てくるので、それに合わせてパイプを調整した。 val d_raw_data = Wire(Vec(…

OCP Pattern PusherのデバッグとOCP コマンド発行のためのクラスの確認

OCP Pattern Pusherのデバッグをしながら、Diplomacyの構築に必要なクラスの構成について見ていこう。 OCP Pattern PusherではDiplomacyのノードが定義され、出力ノードに対してコマンドが発行されている。 TileLinkのDiplomacyノード構成 上記の図ではTileL…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (2. 全ベクトル命令のデコーダ生成)

ベクトル命令の全命令をリストアップしたので、次はいよいよベクトル命令のデコーダ生成に入る。デコーダの生成を人力で頑張る必要はなく、私のRISC-Vシミュレータはすべて自動的にデコーダを吐き出す仕組みが搭載されている。したがって、ひたすらベクトル…

RISC-Vのベクトル命令のエンコーディングをまとめる

RISC-Vのベクトル命令について勉強している。ベクトル拡張の仕様はv0.8をベースにしている。命令のエンコーディングについて調べているが、理解に時間がかかっているのでまとめてみる。 公式の仕様書には、以下のようなエンコーディングのリストが載っている…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討

RISC-V Vector命令の仕様がかなり固まってきた。いつの間にかVer 0.8が公開され、命令のニーモニックも安定しつつある。 RISC-V "V" Vector Extension Version 0.8-draft-20191117 https://riscv.github.io/documents/riscv-v-spec/riscv-v-spec.pdf ついで…

Diplomacyを使ってOCPバスを作成する方法の検討(4. OCP Pusherの生成)

前回、せっかくOCP PusherとOCP SRAMを作って接続してみたのだがなぜかOCP SRAMが途中で消されてしまいきちんとシミュレーションすることができていなかった。 FIR上ではマスターもスレーブも生成されているようなので最適化で消されている。最適化で消され…

Diplomacyを使ってOCPバスを作成する方法の検討(3. OCP SRAMを作る)

Diplomacyを使ってOCPのバスを作成するプロジェクト。PatternPusherウィジェットの次はSRAMを作成する。SRAMを定義することでクライアントとマネージャの両方を定義することで、やっと回路を構築することができるようになる。OCPのSRAMを定義してみよう。 SR…

Diplomacyを使ってOCPバスを作成する方法の検討(2. PatternPusherを作る)

Diplomacyを使ってOCPのバスを作成するプロジェクト。 バスの定義があってもまずはウィジェットが無いと始まらない。 OCPウィジェットのPatternPusherを作成する。 PatternPusherはOCPのマスター(OCPClientNode)として働く。TileLinkにもPatternPusherがある…

Diplomacyを使ってOCPバスを作成する方法の検討

DiplomacyにはTileLinkのウィジェット、AMBA(AXI4, APB, AHB)のウィジェットがあり、これらを自由に組み合わせてタイルを構成することができる。これがDiplomacyのメリットであり、これらの部品を使ってアジャイルにSoCバスを構成することができる。 これま…

Diplomacyを使ってAXI4スレーブを接続する回路を作成する

Diplomacyのマスターとスレーブを作れるようになったので、次はAXI4を使ってみる。Diplomacyの部品にはAXI4の部品もそろっており、それ以外にもAHB、APBのDiplomacyの部品も用意されている。 rocketchip/src/main/scala ├── amba │ ├── ahb │ ├── apb │ └── …

Diplomacyを使って独自のTileLinkマスターノードを作成してみる

Diplomacyのスレーブノードに続いて、今度はマスターノードを作成してみる。マスターノードには以下の機能を持たせようと思う。 アドレスをインクリメントさせながら特定のデータを16回書き込むリクエストを発行する。 アドレスを元に戻す。 アドレスをイン…

Diplomacyを使って独自のTileLinkスレーブノードを作成してみる

ここらで、Diplomacyを使った独自のTileLinkスレーブノードを作成してみよう。作成するのはTileLinkのスレーブノードで、書き込みを行うとそのデータの分だけ加算するレジスタを持つ。とりあえずRTLを生成できるように持って行きたい。 作成するノード形態と…

TileLinkのDiplomacyデザインの解析 (2. TileLinkのSourceIdの計算方法について)

Diplomacyを使ったデザインでは、クロスバーを使って自由にバスを構成することができる。この場合のバスのIDは自動的に計算されるようになっている。例えば、クロスバーに対して4つのマスターが接続される場合、そしてそのマスターのIDのビット幅が最大で3ビ…

RISC-V Bit-Manipulation命令を自作RISC-Vシミュレータに実装解説 (2. 命令のツールセットをビルド)

RISC-V Bit-Manipulationの環境については、GitHubでツールセットやテストパタンが公開されている。ここには、Imperasのシミュレータ、コンプライアンステスト、ツールセット、Verilogモデルなどが含まれている。自作RISC-Vシミュレータに実装するにあたりこ…