top of page
M.R
ソフトウェア開発などについての情報を綴ります
検索
6月29日
[Chisel]Whenの中は必ず評価される
現象 配列がある インデックスを表す変数が配列のサイズ内かをチェックし、サイズ内の場合のみ要素にアクセス というよくあることをやろうとした val array = Seq.fill(ARRAY_SIZE)(...) when(i.U < ARRAY_SIZE){...
6月29日
[Chisel] Queue.enq.valid vs deq.valid
概要 Queueを使ってデータのやり取りをする場合、以下のような操作が可能です。 Queue.io.enq.valid:falseにするとデータを入れない Queue.io.deq.valid:falseにするとデータを取り出さない これらの使い分けについてまとめてみます...
6月29日
[Chisel]ポリモーフィズムは使わない
やりたいこと 類似したユニットが複数ある これらの処理は大部分が共通で一部のみ異なる 条件に応じて適切なユニットを1つ選び、処理を実行させる やろうとしたこと これを実現するために 親クラスを定義し、共通処理はここに記述...
6月29日
[Chisel]繰り返しを途中で抜ける
やりたいこと ★ 同種のモジュールが複数ある これらのうち、所定の条件を満たすものを1つ選択 これを実現するために モジュール一覧を配列で定義 Seq.tabulateでモジュール配列に対してループを回す 1つ1つ条件を満たすかチェック 満たせばそれを選択し、ループ終了...
6月29日
[Chisel]Bundleに接続するのはハードウェア
現象 以下のコードを実行すると、 class Signals extends Bundle{ val pc = UInt((32.W)) ・・・ } val sig = Wire(new Signals) sig.pc := 0.U 以下のエラーが発生...
5月5日
【Chisel/scala】class Module is abstract; cannot be instantiated
現象 以下のchiselのコードで掲題のコンパイルエラーが発生 val parts = new Module(new MyParts()) class Module is abstract; cannot be instantiated 原因と解決策...
5月5日
【Chisel/scala】Bundleのメンバにハードウェアの配列を追加する
やりたいこと 掲題の通りだが、chiselのハードウェアの配列をBundleのメンバにを追加したい。どのような状況かというと、同じ回路を複数用意して並列処理をさせるということをしたい。 UIntの配列ならば簡単なのだが、配列のメンバがハードウェアの場合にかなりてこずった。...
5月1日
【Chisel/scala】overloaded method apply with alternatives
はじめに chiselでコードを書いていると、掲題のコンパイルエラーに時折遭遇する。 これの意味がいまいち分からなかったので調べてみた。 詳細 下記のエラーを例にとって一行ずつ見ていく overloaded method apply with alternatives:...
5月1日
【chisel/scala】Moduleの配列を作成する
やりたいこと 自作したクラス(部品)があり、これはModuleを継承している このクラスのインスタンス(部品)を複数回路内に配置したい 試したこと Vecを使用して配列を作ろうとしたが、上手くいかなかった。 下記のように書いてもコンパイルエラーになる class...
3月9日
[Chisel/Scala]小数点のデータを導入する
やりたいこと 小数点のデータ(ほかの言語でいうところのfloat)を導入したい。 背景としては、自作のCPU回路にパフォーマンスカウンタを設けようとしており、これを整数ではなく小数で表現したい。(例えば「1指令あたりのサイクル数」を測定する場合、1か1.9かで意味は全く異な...
3月9日
[Chisel]Queueに入れたデータを取り出すのが1サイクル遅れる
現象 以下のような設計をしている IDステージがデコード結果の指令をQueueに入れる EXステージがQueueから指令を取り出し、実行 この時、最初の指令を1でQueueに入れて2で取り出すまでの間に1サイクル入ってしまう。...
3月8日
[Chisel]Queueについて
はじめに Chiselでデータの受け渡しにキューを使いたい場合のためにQueueクラス(そのまま)が用意されています。 その使い方について説明します。 基本的な使い方 定義 val buf = Module(new Queue(gen = new UInt, entries...
2月23日
[Chisel]条件分岐について
はじめに chiselを書いていると、条件分岐として以下の文法が使えることを学びます。 if when Mux (MuxCase) これらはどのように使い分けたらいいのでしょうか? ifとwhen/Mux まずこれらは条件判定に用いる変数がscalaのBoolean型かch...
2月23日
[scala/chisel] value >> is not a member of (chisel3.Bool, chisel3.UInt)
現象 以下のコードで掲題のコンパイルエラーが発生 val x = 3.U(16.W) val y = 5.U(16.W) val mul_out := MuxCase(0.U(16.W), Seq( (exe_fun === ALU_MULH) ->...
2月23日
[Chisel]整数型のキャスト
やりたいこと 32bitで定義したchisel.UInt型の変数を64bitに拡張したい できないこと まず、以下はコンパイルエラーになる val x = 1.U(32.W) val y = x.asUInt(64.W)...
2月12日
RISC-VとChiselで学ぶ はじめての自作CPU メモ その3
引き続きです。 26章 ベクトル命令とは 「ベクトルレジスタ長をプログラムから分離できる」とはどういうことか: SIMDの場合はベクトルレジスタ長ごとに命令がある(SSEは128ビットのロード、というように) このため、ハードウェアによってプログラム中で使う命令を変えなけれ...
2月3日
【RISCV/Chisel】Error: unrecognized opcode vsetvli
状況 RISCVのベクトル命令をchiselで実装中。 vsetvli命令を追加すると、掲題のコンパイルエラーが発生。 原因と解決策 コンパイル時の引数が間違っていた。 誤: riscv64-unknown-elf-gcc -march=rv32i 正:...
1月27日
【RISC-V/Chisel】パイプラインのストールで躓いたところ
はじめに 「RISC-VとChiselで学ぶ はじめてのCPU自作」をやっていて少し躓いたところがあるのでまとめておきます。 自分は今までソフトウェア中心にやってきたので回路設計の考え方に慣れないところがあります、、、 概要...
1月4日
[Scala]文法は正しいはずなのに実行時エラーになる
現象 scala + chiselで書いたプロジェクトをビルドして実行すると、 java.lang.IllegalArgumentException: requirement failed: BitPats must be in binary and be prefixed...
2023年12月31日
RISC-VとChiselで学ぶ はじめての自作CPU メモ
「RISC-VとChiselで学ぶ はじめての自作CPU」に取り組んでいます。その過程で躓いたところ、自分なりに追加で考えたところを記しておきます。 RISC-VとChiselで学ぶ はじめてのCPU自作 ――オープンソース命令セットによるカスタムCPU実装への第一歩...
bottom of page