Chisel
建国記念日からChiselを初めて、1ヶ月が経ちました。 その間にインチキモジュールを作り続けました笑 そして、Vivadoで合成し、FPGAに乗せて動作確認をしました。 FPGAのテストするための環境も作成してみました。 1ヶ月の中で、Chiselは本当に便利で生産性…
最近、chiselのことが少しわかってきたので、学びが多かったサイトをまとめます。 当たり前かもしれませんが、結局公式サイトが情報が多くわかりやすかったです。 公式サイト URL: Chisel/FIRRTL: Home チートシート URL: https://inst.eecs.berkeley.edu/~c…
Chiselで複数のパッケージを組み合わせ方を調べてみました。 今回はChiselのSoCプロジェクトであるrocket-chipを調べてみました。 rocket-chip/src/main/scala at master · chipsalliance/rocket-chip · GitHub モジュール種毎にディレクトリを分けることが…
先日、Vivadoで合成したら、タイミングMetしませんでした。 そのため、何らかの対策をすることが必要になりました。 それは、パイプライン設計とマルチクロックです。 thira2.hatenablog.com パイプラインは中々に手間なので、マルチクロックにしようと思い…
先日、RISCVを作ったので試しにFPGAで合成してみることにしました。 LUTが5000くらいでFFが1200くらいとなかなかに小型であることはわかりました。 問題はここからで、タイミングがまったくMetしていません。 125MHzで8ns周期なのに、WNSが-5.5nsと惜しくも…
先日、Uartの通信がPCとFPGA間でできるようになったので、 次にFPGAにChiselのMemを置いて書き込めるか確認しようとしました。 他にもGPIO設定できるものや、スイッチの設定値を読める機能もついでに追加しました。 で、テスト用のプログラムを作って、動作…
先日、Chiselでシリアル通信のループバックモジュールを作成しました。 Chiselでテストしようとしたのですが、1データテストするのに1分くらいかかることがわかりました。 UARTの転送bit数は8bitなので、全部テストするのに、256分くらいかかるということで…
先日、chiselでシリアル受信器を作成したので、次に送信器を作ってみました。 以下のようなループバックになるようにしてみました。 シリアル受信器で受診したデータを送信器に送る。 送信器はPCに送り返す。 chiselのテストは送受信で行うので、時間として…
RISCVもできてきたので、次にRISCVに外部から接続する方法を考えてみました。 本来であればRISCVデバッガを作れば良いのですが、以前調べたところ、あまりにも難解なので、今回はskipすることにしました。 となれば、最も簡単なのはUART一択ということで、簡…
先日、Chiselで2 portメモリを作ることが必要になりました。 しかし、どうやって作れば良いかわからなかったので、調べてみると以下公式サイトに記載ありました。 備忘のために記載します。 単純に二つのポートを書けばよかったんですね。 Mem keyword in Ch…
先日、ChiselでRISCVを作っている時に、算術右シフト(負の値のときに上位bitは1詰め)と 論理シフト(なんであれ0詰め)があることがわかりました。 少し戸惑ったので、備忘のために記載します。 Chiselの右シフト Builtin Operators · freechipsproject/chisel…
先日からコツコツRISCVを作ってたんですが、とりあえず spikeとのレジスタチェック、命令トレースチェック環境を構築し、 簡単なMain関数の実行が適切に流れるところまで確認しました!! 以下の設計方針で簡単に作成しただけですが、ある程度早めに良い感じで…
chiselというより、scalaですが、unsigned intの扱いに苦労したので、備忘のために記載します。 RISCVの命令は32bit幅で、命令をtxtファイルに記載して、テストベンチで読み込むことにしました。 scalaでtxtファイルを読み、Unsigned Int(32bit)にして、dut(…
chiselで色々書けるようになってきたので、負荷をかけるために次にDMAを作ることにしました。 以下のとてもシンプルなおもちゃですが、あっさりかけました。 DMAモジュール AXI4 Liteの4byte転送のみ AXI_interface/DMA.scala at master · moamoai/AXI_inter…
DMAを作成する前に、Busモジュールが複数Master/Slaveに対応できないといけないため、 Parameterでマスタ数、スレーブ数を変更できるようにしようしました。 まずは本当にシンプルに以下の仕様で作成しようとしたんです。 Master側のIFモジュールで複数マス…
前回、chiselでinterfaceが良い感じでにかけることがわかりました。 すると、次にレジスタモジュールを良い感じで書きたくなりました。 レジスタを複数書くには、verilogだと、generate文を使えば良いと思います。 では、chiselだと?と思い、調べました!! モ…
chiselの使い方がわかってきたので、よりまともな記述ができるようにリファクタリングしてみました。 チートシートを参考にしたりしました。 chiselチートシート: GitHub - freechipsproject/chisel-cheatsheet: Chisel Cheatsheet ChiselSheet · freechipsp…
chiselのSlaveモジュールらしきものができたので、次にBUSを書いてみることにしました。 あまりにひどいbusですが、ひとまず、interfaceの切替ができて満足しました。 chiselは書きやすく、Interfaceを「<>」で簡単に接続できました。 また、「:=」でInterfa…
chiselの書き方が少しわかってきたので、次にAXI4-LiteのSlaveモジュールを書こうと思いました。 まずは、chisel intefaceの書き方を以下公式ガイドを見て学ぶことにしました。 なんと、class文でかけるだけあって、parityつけることなどが継承で簡単にでき…
年末から年明けまで、何をすべきかで、ずっと塞ぎ込んでました。 正直なところ、脱サラして全く別の道を進むべきなのではないかとすら思いました。いや、むしろ○んだ方が良いのではと。。 そして、先日に酷い下痢になり、ぼんやりした頭で思ったことがありま…
chiselで除算機を書いたので、次にメモリと少し複雑な制御論理を書く練習がしたくなりました。 最近、アレイ型演算機に興味を持っていたので、まずは1次元アレイ、すなわちベクトル演算機を書いてみることにしました。 ベクトル演算機も1命令で多数のデータ…
chiselの手始めに、何十年前かに書いた除算器を書こうとしました。 chisel-examplesにaluあるのに、除算器がなかったので、それならということです笑 まずは本当に単純で、小型なシフト、引き算除算器を書いてみました。 仕様は以下になります。 入力データ…
最近、少しずつchiselを使うようにしているのですが、 chisel/iotesters.PeekPokeTesterで内部信号のモニタのをしようとpeek関数で内部レジスタを選択してみました。(peek(dut.r_quotient )みたいな感じで) すると、「value r_remainder is not a member of …
先日、Chiselというハードウェア 記述言語があるという噂を聞きつけたので、試しに使ってみることにしました。 まずはインストール部分を備忘録として記載していきます。 インストールとチュートリアルは以下を参照しました。 とてもわかりやすいです! https…