2020-01-01から1年間の記事一覧

チゼルの一ヶ月

建国記念日からChiselを初めて、1ヶ月が経ちました。 その間にインチキモジュールを作り続けました笑 そして、Vivadoで合成し、FPGAに乗せて動作確認をしました。 FPGAのテストするための環境も作成してみました。 1ヶ月の中で、Chiselは本当に便利で生産性…

わかりやすかったchiselの入門サイトについて

最近、chiselのことが少しわかってきたので、学びが多かったサイトをまとめます。 当たり前かもしれませんが、結局公式サイトが情報が多くわかりやすかったです。 公式サイト URL: Chisel/FIRRTL: Home チートシート URL: https://inst.eecs.berkeley.edu/~c…

Chiselで複数のパッケージを組み合わせる方法を調べました

Chiselで複数のパッケージを組み合わせ方を調べてみました。 今回はChiselのSoCプロジェクトであるrocket-chipを調べてみました。 rocket-chip/src/main/scala at master · chipsalliance/rocket-chip · GitHub モジュール種毎にディレクトリを分けることが…

RiscVの内部動作モニタに、Python cmdライブラリを使ってみました話

最近、RISCVとuartが使えるようになったので、RiscVの内部挙動を確認できるように、モニタを作ってみることにしました。 ひとまず、以下をモニタ可能にしてみました。 PCとして命令アドレス 内部レジスタダンプ で、ハード的にモニタ可能にしたあとは、ター…

Chiselで分周クロックを作って、RISCVの合成をTiming Metさせました!

先日、Vivadoで合成したら、タイミングMetしませんでした。 そのため、何らかの対策をすることが必要になりました。 それは、パイプライン設計とマルチクロックです。 thira2.hatenablog.com パイプラインは中々に手間なので、マルチクロックにしようと思い…

chiselで適当に書いたRISCVをVivadoで合成したら、Timing割れしまくって困っている話

先日、RISCVを作ったので試しにFPGAで合成してみることにしました。 LUTが5000くらいでFFが1200くらいとなかなかに小型であることはわかりました。 問題はここからで、タイミングがまったくMetしていません。 125MHzで8ns周期なのに、WNSが-5.5nsと惜しくも…

シリアル怪奇現象の正体見たり、「使用しているライブラリの仕様には注意」

先日、FPGAにシリアル接続すると、データが化けるという怪奇現象が発生することがわかりました。 thira2.hatenablog.com 原因が不明でオシロスコープやロジアナでみないといけない(持ってないですが)と思ったのですが、 識者の方からのコメントではボーレー…

Vivadoの制約ファイル(xdc)について

最近、Vivadoを触るようになってきたので備忘のために、制約をまとめていきます。 まずは最も簡単なPIN設定、クロック制約の記載例です。 とりあえず、簡単なデザインであればこれだけあればひとまず動きます笑 今回クロックは125MHzと高速に思えるのですが…

シリアルの怪奇現象を追っている話

先日、Uartの通信がPCとFPGA間でできるようになったので、 次にFPGAにChiselのMemを置いて書き込めるか確認しようとしました。 他にもGPIO設定できるものや、スイッチの設定値を読める機能もついでに追加しました。 で、テスト用のプログラムを作って、動作…

FPGAとシリアル通信しました

先日、Chiselでシリアル通信のループバックモジュールを作成しました。 Chiselでテストしようとしたのですが、1データテストするのに1分くらいかかることがわかりました。 UARTの転送bit数は8bitなので、全部テストするのに、256分くらいかかるということで…

Chiselでシリアル送信器のテストしていたら、OutOfMemoryError: Java heap spaceが発生した話

先日、chiselでシリアル受信器を作成したので、次に送信器を作ってみました。 以下のようなループバックになるようにしてみました。 シリアル受信器で受診したデータを送信器に送る。 送信器はPCに送り返す。 chiselのテストは送受信で行うので、時間として…

Vivadoを使ってChiselで作ったシリアル受信器をFPGA上で動作確認しました

先日、Uart受信器を作ったので、試しにFPGAで動かしてみることにしました。 FPGAは、大昔に購入しずっと眠っていてホコリをかぶっていた、Digilent Zybo Zynq-7000を使ってみることにしました。 以下ボードなんですが、数万ゲートは対応できそうなので、RISC…

Chiselで簡単なUART受信機を作ってみました

RISCVもできてきたので、次にRISCVに外部から接続する方法を考えてみました。 本来であればRISCVデバッガを作れば良いのですが、以前調べたところ、あまりにも難解なので、今回はskipすることにしました。 となれば、最も簡単なのはUART一択ということで、簡…

Chiselで2 portメモリの作り方

先日、Chiselで2 portメモリを作ることが必要になりました。 しかし、どうやって作れば良いかわからなかったので、調べてみると以下公式サイトに記載ありました。 備忘のために記載します。 単純に二つのポートを書けばよかったんですね。 Mem keyword in Ch…

Chisel/Verilogの右シフトについて

先日、ChiselでRISCVを作っている時に、算術右シフト(負の値のときに上位bitは1詰め)と 論理シフト(なんであれ0詰め)があることがわかりました。 少し戸惑ったので、備忘のために記載します。 Chiselの右シフト Builtin Operators · freechipsproject/chisel…

RISCVデバッグ仕様について眺めてみました。

先日、RV32Iもどきを作ったので、次に何を作ろうかと思いました。 そんな気分で、ricvの公式サイトをぼんやり眺めていると、なんとRISCVにはデバッグ仕様が存在することが判明しました。 そんなわけで、RISCVのデバッガを作ろうとしました。 Debug Specifica…

chiselで簡単なRV32Iもどきを作りました

先日からコツコツRISCVを作ってたんですが、とりあえず spikeとのレジスタチェック、命令トレースチェック環境を構築し、 簡単なMain関数の実行が適切に流れるところまで確認しました!! 以下の設計方針で簡単に作成しただけですが、ある程度早めに良い感じで…

chisel/scalaでunsigned intの扱いに苦労した話

chiselというより、scalaですが、unsigned intの扱いに苦労したので、備忘のために記載します。 RISCVの命令は32bit幅で、命令をtxtファイルに記載して、テストベンチで読み込むことにしました。 scalaでtxtファイルを読み、Unsigned Int(32bit)にして、dut(…

参加すべき大切な会に行かなかった話

先日、血縁者の集まり?のような参加すべき大切な会がありました。 もう長年会話していないような関係ではあったのですが、周りからは行くべきと言われてました。 会の1ヶ月前から行かないと行っていたのですが、間際になるにつれて、行くべきなんじゃないか…

spikeで簡単なプログラムを流して、レジスタダンプを取得できることがわかった話

chiselでRISC-Vを作ろうとしたのですが、まずプログラム開発環境を揃えることにしました。 spikeで簡単なプログラムを流す(0x0000番地の罠) RISC-Vモデルはspikeにすることにしました。 公式から出ているシミュレータなので安心感があります。 spikeを使って…

chiselでDMA書いてみました

chiselで色々書けるようになってきたので、負荷をかけるために次にDMAを作ることにしました。 以下のとてもシンプルなおもちゃですが、あっさりかけました。 DMAモジュール AXI4 Liteの4byte転送のみ AXI_interface/DMA.scala at master · moamoai/AXI_inter…

ChiselでbundleのWire接続に詰まった話

DMAを作成する前に、Busモジュールが複数Master/Slaveに対応できないといけないため、 Parameterでマスタ数、スレーブ数を変更できるようにしようしました。 まずは本当にシンプルに以下の仕様で作成しようとしたんです。 Master側のIFモジュールで複数マス…

魔法使いになれるなら使いたい呪文について

先日、ふと魔法使いになったら、何を使いたいか考えてみました。 ドラクエの魔法がまず頭をよぎりました。 マダンテは力使い尽くしそうでヤバそうです。 メラは弱めです。 ルーラが無難ですね。 ザラキは危険ですね。 ザオリクやベホマが使えたら、安泰な気…

続chiselでリファクタリングしてみました(for/vec/reduce)

前回、chiselでinterfaceが良い感じでにかけることがわかりました。 すると、次にレジスタモジュールを良い感じで書きたくなりました。 レジスタを複数書くには、verilogだと、generate文を使えば良いと思います。 では、chiselだと?と思い、調べました!! モ…

chiselでリファクタリングしてみました

chiselの使い方がわかってきたので、よりまともな記述ができるようにリファクタリングしてみました。 チートシートを参考にしたりしました。 chiselチートシート: GitHub - freechipsproject/chisel-cheatsheet: Chisel Cheatsheet ChiselSheet · freechipsp…

Chiselで簡単なaxi4-lite busを書いてみました

chiselのSlaveモジュールらしきものができたので、次にBUSを書いてみることにしました。 あまりにひどいbusですが、ひとまず、interfaceの切替ができて満足しました。 chiselは書きやすく、Interfaceを「<>」で簡単に接続できました。 また、「:=」でInterfa…

chiselで簡単なAXI4-Liteのレジスタを書いてみました

chiselの書き方が少しわかってきたので、次にAXI4-LiteのSlaveモジュールを書こうと思いました。 まずは、chisel intefaceの書き方を以下公式ガイドを見て学ぶことにしました。 なんと、class文でかけるだけあって、parityつけることなどが継承で簡単にでき…

とんかつにはまっている話

最近、異様にとんかつにはまっています。 衣に包まれた豚肉は本当に美味しいんです。 おいしいとんかつを食べると依存症のごとく、体が欲してしまうくらいです笑 とんかつは、高いお店が多いイメージもってましたが、都内には意外と? とてもお手頃な価格のお…

高位合成に興味が出てきた話

最近、高位合成に今度は興味が出てきました。 といいますか、chiselにハマってたんですが、chiselもアルゴリズムをそのまま合成できるわけでないので、使い勝手が結局verilogと同じ気がしてきたんです。 要はあまり使いやすくないんです。 もっと使いやすい…

RISC-VのVector命令を動かしてみました

最近ベクトル演算機に興味を持っていて、調べているんですが、 Vector命令の仕様がオープンなものは、RISC-V Vector命令しかないようでした。 なので、まずは仕様が明確なRISC-VのVector命令の動かし方について、調べてみました。 まずは、通常のrisc-vtool…