ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。Verilogで使える以下のような奴のことを指しています。mem[0:1023]これを調べてみようと思ったのはSCR1というRISC-Vのコアのメモリでこの形にメモリが使われていたから。Mem~最初は何も考えずにChiselのMemを重ねてみたらいいのでは??と思って試してみたのが以下のコード。UInt(8.W)))すでにご存じの方もいるとは思うが、上記はそもそも文法エラーになってしまう。その理由はMemの実装追いかけていくとわかる。}}Chiselで通常のお作法でMemを宣言するとオブジェクトが呼ばれ上記のapplyが実行される。その際にマクロ展開によりdo_applyが呼ばれるのだが、その中でMemクラスをnewでインスタンスされるようになっている。このMemクラスの実装はどうなっているかを見てみよう。{上記はMemの宣言を追っていったものなのだが、Memのスーパークラスで継承しているのがHasIdになっている。このHasIdはChiselの型の大元に近いものでChiselのDataクラスもこのHasIdを継承したものになっている。DataにはMemは含まれていないので、文法エラーが発生したということになる。試してみたことその2~じゃあBundleでくるんでみよう~上記の話を踏まえて、じゃあDataにしたものに化かしてみようということでMemをBundleでくるんでみる。m(io.addr).col(0))}これは文法エラーにはならずにRTL自体は生成可能だ。所望の機能は実現できず、何を書いても0が読める。14:02:42でなんでこうなるんだろう??ってエラボレート後のFIRRTLを見てみたら以下のようになっていた。43:14]メモリの変数mの中が何もない。そりゃ書けないわーーー。試してみたことその3~それならVecにしてみよう~最終的にはVecをMemに入れることにした。注:2019/05/02の記事を書いている際に気づいたので訂正してます。気づいたため修正しました。見ての通りで今度はうまくいった。mの中身にちゃんとUInt<8>[4]が入っていた。38:14]RTL最後にRTLにどう変換されるのかについても確認しておこう。長いけどほぼ丸々載せます。見てもらうとわかる通りでVecの要素がm_col_0~m_col_3にマッピングされる形となった。気になるのが各メモリ配列に対して4つの書き込み処理が実装されていること。これも各メモリ配列ごとに有効な書き込みは4つのうち1つになっているみたいなので、合成時には最適化で消えるはず。当初想定していた形にはなっていないけど、まあこれはこれでいいかな、という気もする。Verilog-HDLの範囲だと多次元配列がサポートされていないので、これ以外の方法が無かったですね。endendmoduleMemBaseにマスク付きのライトタスクが用意されているので、ひょっとするとそっちを使うと何か変化が起きるのかもしれないので別途試してみようと思う。いうことで平成最後の記事でした。令和になっても相変わらずChiselネタを投稿すると思いますので興味がある方はお付き合いください。15:03Chiselで2次元メモリっぽいのを作る(1)Tweet関連記事2019-05-04Chiselで3次元メモリっぽいのを作る今回もChiselのMemについての話。元ネタは自分の以下のツイー...2019-05-02Chiselで2次元メモリっぽいのを作る(2)令和になって最初の投稿。ほんとは昨日上げたかったんだけど。今日は久しぶりにChisel-Bootcamp。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。