ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。BootcampのModule2.3の学習が全て終了した。www.tech-diningyo.info今回は更に学習を進めてModule2.4に入っていく。順序回路モチベーションこれまで同様にモチベーションから引用してくる。ステートなしにはどんな意味のある回路も書けない。ステートなしにはどんな意味のある回路も書けない。ステートなしにはどんな意味のある回路も書けない。??なぜなら中間値を保存することなしにはどこへも行けないからだ。よし、悪い冗談はここまでにしよう。このモジュールではChiselで順序だったパターンを表現するかについて見てもらう。このモジュールが終わる頃には、Chiselでシフトレジスタが書けるようになっているべきだ。大切なことを強調すると、このセクションではあなたに劇的な効果を感じてもらうものでは無いだろう。Chiselのちからは順序回路のパターンにあるわけではなく、むしろデザインをパラメタライズすることにある。その可能性について示す前に、私達はまず、これらの順序回路のパターンについて学ばなければならない。このセクションではChiselで順序回路を書くことがVerilogに似ていることを示してみよう。Chiselの文法だけを学べばいいのだ。レジスタChiselのステートフルな要素はレジスタでRegと表記される。基本的にはVerilogとほぼ同様と考えて良いが、以下の違いが存在する。Chiselにおけるレジスタは以下の特徴を持つ。クロックの立ち上がりエッジが来るまで出力を保持するどのレジスタもデフォルトでは、全て同一のクロックが使用されるこれによって、Chiselで設計する際にはクロックを明示する必要がなくなりコード量を減らすことが出来る。例題:レジスタの使用方法ここからは早速、レジスタの使い方について見ていく。以下の例は入力に対して1.Uを足した値をレジスタに設定する。RegisterModule))早速動かしてみよう。endendmodule生成されたVerilogコードを見ると、ifdefがやたらいっぱい入って入るが、endmodlueの直前にVeirlogのレジスタ推定文があるのがわかるかと思う。ここでレジスタの宣言についてまとめておこう。基本形はReg(tpe)となる。ここでtpeには、実装したいレジスタのエンコーディング設定を設定する。要はビット幅と変数の型で、上記の例では12-bitのUIntになっている。テストに際には、Chiselのテストコードに対して、クロックが入力されて1サイクル時間が経過したことを知らせる必要があるが、それ行うにはstep(n)を呼ぶことで可能だ。(nは所望のサイクル)前回までのテストではstepが呼ばれていなかったが、前回までの回路は全て組み合わせ回路であり、サイクルの経過をテストに考慮する必要がなかったからだ。入力データを即時に対象モジュールに反映する。Verilogの組み合わせ回路の記述やfunction文相当step():Chiselのテストに時間を経過させる。Verilogの順序回路記述や、時間経過ありのtask文相当ということになる。ChiselのRegから生成されるVerilogの仕様は以下のようになる。レジスタは暗黙のクロック(とリセット)をもっており、ユーザーはこのクロックを気にする必要は無い。変数のregisterは期待通りにreg[11:0]として定義されるたくさんあるifdefセクションはシミュレーションスタート時にレジスタの初期値をランダムにするためのものであるregisterはクロックの立ち上がりエッジに同期する宣言時の注意点ひとつRegの宣言時に注意することがある。Chiselは型(UIntとか)とハードウェアのノード(2.UとかRegとか)を別のものとして認識する。Reg(2.U)はエラーとなる。理由は先の型とノードをが別のものとして扱われているからで、2.Uはノードとなるため、引数として設定が出来ないからだ。例題:RegNext次は先程のRegとは別に用意されているRegNextについての例を見てみよう。})println("SUCCESS!!")実行すると以下のようになる。PASSEDSUCCESS!!内容としては先程のRegと変わらないのだが、宣言の際にレジスタのビット幅の指定が不要になって直接レジスタにデータを設定できている部分が異なる。例題:RegInitこちらはなんとなく、名前からも推測できるが初期化機能付きのレジスタになる。これも例をさくっと見てみよう。RegInitModule))実行結果は以下のようになる。endendmoduleレジスタの本体だけを取り出すと以下になる。end上記のコードを見てわかる通り、リセットの際に12'h0で初期化されている。RegInit(0.U(12.W))という初期化の方法が使われていたが、もうひとつ別の方法があって以下のように書くことも可能だ。0.U)これでModule2.4の最初の項目ハードウェアを実装する際に欠かせないレジスタについての勉強がひとまず終了した。次の記事ではレジスタと条件分岐を組み合わせてフローの制御についてを見ていく。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。