以前にBunldeで構造化したデータを使ってレジスタをインスタンスする方法を紹介したのだがその記事を書いたときにもう一つコレ出来たらいいなっと思いながら出来なかったことがあった。 それは”Bundleを使ってレジスタ郡を作る際に、各フィールド毎に任意の値で初期化出来ないか?”というものだった。 んでやっとそのやり方が分かったので、今日はそのやり方についてまとめようと思う。 Bundleをインスタンスして作るRegInitで各フィールドを任意の値で初期化する方法 おさらい:Bundle + RegInitで作るレジスタを"0"で初期化する方法 MyBundleで作ったレジスタを0.Uで初期化するソースコード 生成されたRTL 各々をフィールドを任意の値で初期化する方法 RegInitの実装 MyBundleのインスタンスをRegInitに設定 MyBundleのインスタンスをハードウェア要素
Verilogでは、同一モジュールを複数インスタンスするときは以下のようにgenerate forが使える。 for (genvar i=1; i<=10; i=i+1) begin subblock u_subblock( .clk(clk), .reset_n(reset_n), .a(a[i]), .b(b[i]), .out(out[i]) ); end これと同様に、Chiselでもfor文を用いた同一モジュールの複数インスタンス化が行える。書き方は単純だ。 class multi_module (width: Int) extends Module() { val io = IO(new Bundle { val in0 = Input(Vec(width, UInt(32.W))) val in1 = Input(Vec(width, UInt(32.W))) val out
ハードウェア記述言語ChiselはScalaをベースにした言語であり、Scalaの言語単位をベースにして設計してある。 それでは、ハードウェアの配線や変数を表すためにどのような型が用意してあるかというと、例えば、以下のような型が用意されている。 UInt : 任意の幅を定義できる符号なしの整数を格納するための型 SInt : 任意の幅を定義できる符号ありの整数を格納するための型 Bool : 1ビットのTrue/Falseを格納するための型 例えば、配線とレジスタを定義するためには以下のようにして宣言する。WireやRegというクラスに型の情報を与え、実体化させるという訳だ。 val w_a = Wire(UInt(32.W)) val r_a = Reg(Bool()) ところで、Chiselの型の中で主に使うのは上記の3つくらいしかない。しかし、System Verilogにはtype
はじめに Chiselとはハードウェア記述言語(HDL)の一種です。最近ではRISC-Vというオープンソースのプロセッサの実装に使われることが多く、SystemVerilog/VHDLに次ぐ第3のHDLとしてメジャーになりつつあるようです。 Chiselは言語としてはScalaの内部DSLとして実装されています。つまりソースコードはScalaのソースコードであり、Scalaの豊富な言語機能やエコシステムを全て使うことができます。それによってこれまでのHDLでは難しかった抽象度の高い記述やツールサポートが実現されています。 というわけで「古臭いSystemVerilog/VHDLは捨てて、Chiselに移行しよう」と言いたいところですが、現状のChiselにはいくつか問題点も感じています。数年前にChiselのコードを触っていたので、そこで気付いた点をまとめておきます。 当時やっていたのは「
Chiselによりインタフェースのパラメタライズの検討を行う。例えば、汎用インタフェースを使用してバスのマルチプレクサを構成することを考える。 インタフェースとしては以下のものを使う。以下のGenBundleはTで汎用化されている。valid, sideband, dataの信号線が用意されており、dataは一般化されており、任意のデータ型を渡すことが可能である。 class GenBundle[T <: Data](dataType: T) extends Bundle { override def cloneType: this.type = new GenBundle(dataType).asInstanceOf[this.type] val valid = Output(Bool()) val sideband = Output(UInt(10.W)) val data = Out
はじめに 技術部のcpcと申します。FPGA等での回路設計や所謂IoTセキュリティをしています。 さて、FPGAへ実装を行う場合、最終的にはどこかのベンダの製品を使う訳でベンダ依存になるのは当たり前の事ではありますが、ベンダIPが密結合していない部分等で可搬性が高い構成にしたいことは多いです。 そこで今回はオープンソースツールを使ったベンダフリーな検証について書きたいと思います。 有り体に言ってしまえば「 UVM, Verilogシミュレータ, 波形ビューワ…この世にはもっと良いベンダ実装が有ったほうが良い物が沢山あります。それらをOSSのパワーでフォローします。」という事ですね。 なおVerilog系、特に断りがない場合はverilog-2005とSystemVerilog-2012に対応しているツールだけを紹介します。また、本稿でVerilogと書いた場合Verilog-HDLだけでは
5/4にChiselの3.3.0が正式にリリースされた。今回はリリースノートをざっと確認したのでその内容についてまとめておく。 なお今回の記事はリリースノートのひとくちメモという感じで、中身についてはそこまで深くは追求していない。 気になった機能については動作を確認して、別の記事で紹介予定。 Chisel-3.3.0 長いので先にまとめ API Modification (#1201) Don't use MuxLookup default for full mapping (#1315) Emit FIRRTL andr, orr for Bits.{andR, orR} (#1359) Cleanup aspects (#1384) No more compile internal Fix (#1136) Make Queue.irrevocable work properly in
Chiselでは、以下のようなビット列の一部に対する部分代入が許されない。 ハードウェア記述言語としてみると非常に不便だが、もともとChiselがソフトウェア記述言語Scalaがベースであるということを考えると何となく想像がつく。 val res = Wire(UInt(32.W)) res(idx) := true.B ではこれ以外に部分代入を実現する方法は無いのか? bitSetを使う bitSetはある信号の特定の1ビットを0/1に設定して結果を返す。特定の1ビットのみを更新する場合に使用できる。 例えばこんな感じ。 class BitSet (WIDTH: Int) extends Module { val io = IO(new Bundle { val in = Input(UInt(WIDTH.W)) val valid = Input(Bool()) val idx = I
自作CPUの構成をマルチコアに変更したので、いくつか問題が表面化してしまっている。例えばメモリは1サイクルでアクセスできる仮定にしていたのを、いくつかValid & Readyの方式に実装し直さなければならない。このためには、とりあえずTileLinkにDelayerを挿入したうえで1コアに絞ってデバッグした方がなにかとやりやすい。という訳でコアの数をConfigurableにする。 まずはコア数はTestHarnessでnumCoresとして宣言する。 class TestHarness()(implicit p: Parameters) extends Module { val rv_conf = new RV64IConfig val numCores = 2 これをcore_complexにパラメータとして伝える。 val ldut = LazyModule(new core_co
記事の概要 Chiselの入門書「Digital Design with Chisel」の6章の勉強記録です。 本文の概要を備忘録として整理し、また実際に行った演習を紹介します。 本のpdfデータとプログラム一式は無料で以下から入手できます。 https://raw.githubusercontent.com/wiki/schoeberl/chisel-book/chisel-book.pdf https://github.com/schoeberl/chisel-book 6.1 Registers レジスタ レジスタは、Dフリップフロップの集合です。 Dフリップフロップは、クロックの立ち上がりエッジでの入力値を取り込み、出力値として保存します。 Chiselでは、入力dと出力qを持つレジスタは次のように定義されます。
いきなりタイトルと関係なさそうな話題からスタートしますが、今週1番のトピックは、なんと言ってもEdge TPUがオフィシャルに発売されたことでしょう。 しかもUSB接続のアクセラレータがたった80ドル弱ですよ。日本だとMouserで8800円ほど。 こいつをいち早く入手できたIdein社内でのお試し結果がこちら。 Edge TPU(USB版) Mobilenet v2 1.0 224x224 ImageNet Raspberry Pi 3 Model B v1.2 で10msちょっとでした pic.twitter.com/BOfSAgUewJ— Koichi Nakamura (@9_ties) 2019年3月5日 10msってことはあと6ms程度別の処理に充てても高精度カメラのフレームレート60fpsに間に合っちゃうってことで、これはくそっ速い。 僕は去年夏にEdge TPUがアナウンス
MNISTを、ハードウェアアクセラレータを使って高速化したい。 前回はChiselで初期実装を行った。シミュレーションをして、短いテストプログラムで動作確認をして、結構うまく動作するようにになったのでいよいよFPGAに書き込んで確認したい。 やってみよう。 関連記事 目次 RISC-V ISS Spike を使ってMNISTのハードウェアアクセラレーションをシミュレーションしたい RISC-V ISS Spike を使ってMNISTのハードウェアアクセラレーションを実装する Chiselを使ってMNISTハードウェアアクセラレータを実装(実装中) Chiselを使ってMNISTハードウェアアクセラレータを実装(FPGAで確認) Chisel でDot Product Acceleratorを実装する 結局以下のような実装になり、シミュレーションを実行したところ正しく動作しているようだった。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く