日記
投稿日:2025年01月19日 最終更新日:2025年08月14日
2025-08-13
前回更新からかなり時間が経ちました。日記だけでも定期的に更新するようにしたいと思います。
最近は、仕事でCPUのキャッシュメモリの設計に携わっており、人生で初めての論理合成に挑戦中です。自分が作成したRTLが初めて論理回路に変換されるのを目の当たりにし、大きな感動を覚えました。普段から上司に言われていた「生成される論理回路を意識しながらRTLを書くことが重要」という言葉の意味を、この結果を通じて初めて理解することができました。
例えば、N bitのコンパレーターの 論理回路は、「N bit × 1段のXOR → log2(N)段のリダクションOR」という構成になります。XORは各ビットが等しければ0を、異なれば1を出力し、これをリダクションORによって全てのビットを集約して最終出力とします。
また、プライマリエンコーダという回路があります。これは、N bitの入力から最上位ビットの位置を出力する回路で、N bitのvalid信号から一つを選択する際に、よく使用されます。例えば、以下のようなRTLはプライマリエンコーダとなります。
always_comb begin
for (int i = 0; i < N; i++) begin
if (valid[i]) begin
output = i;
break;
end
end
end
しかし、この回路には重要な問題があります。for文のインデックス間に依存関係が生じることです。i = mが選ばれるかどうかは、0 ≤ i ≤ m-1のビットがすべて0であるかどうかに依存します。そのため、プライマリエンコーダは1 + (N/2) + log2(N)段の論理回路で実装されることになります。
これはvalidのビットのうち複数のビットが1になる場面では有効な機構ですが、validのビットのうち一つのビットのみが1になる場合(One hot)には、この依存関係は不要です。
キャッシュメモリのTagのhit/miss判定など、One hot のエンコーディング では、ANDとORを組み合わせてセレクターを実装するべきです。例えば、以下のような書き方になります。
always_comb begin
for (int i = 0; i < N; i++) begin
if (valid[i]) begin
output |= i;
end
end
end
この回路の優れた点は、for文のインデックス間に依存関係がなく、並列処理が可能なことです。つまり、この回路は最大でも1 + log2(N)段の論理回路で実装することができます。プライマリエンコーダと比較すると、16 wayのTagArrayでは8段の削減が実現できます。
このように、論理合成の結果はRTLの書き方によって大きく変わります。論理合成後にタイミングチャートを確認して問題箇所を発見し、一つ一つ修正していくのは非常に手間がかかります。そのため、RTLの開発時点で論理回路を意識して記述することが重要です。
今日は、このような重要な気づきを得ることができて良かったです。
明日は、無駄なプライマリエンコーダが実装されていないか、RTL全体を見直して、必要に応じて修正したいと思います。
また、別の話ですが、CursorやVS CodeでSSH接続に失敗して接続できなくなる現象が多発しました。さらに、SystemVerilog用の拡張機能であるDVTの動作が極端に遅くなる現象も発生しました。この二つの問題により、作業が思うように進みませんでした。
SSH接続に失敗する現象は、SSHのForwarding設定が原因でした。詳しい原因は特定できていませんが、一度接続できた後にネットワークを切り替えたり画面をリロードしたりして再接続しようとすると、接続が全くできなくなるという現象でした。これは、SSHのForwarding設定を削除することで解決しました。
DVTの動作が遅くなる現象は、まだ原因が特定できていませんが、特定のファイルの編集時のみ発生することが分かりました。そのファイルは4000行程度(パッケージも含めると5000行程度)あり、ファイルサイズが原因ではないかと考えています。ただし、20MBのファイルを扱っている人もいるらしく、詳しい原因は不明です。今後は、一つのファイルは2000行程度に収めることを心がけたいと思います。
以上です。いつかこの内容は、ハードウェアカテゴリの記事としてまとめたいと思います。
2025-04-22
本日は、ECC の実装方法について記事にまとめ始めました。理屈を理解することで、必要bit数や計算方法を簡単に覚えることができます。
まとめ終えるには時間がかかりそうです。少しずつ更新します。
また、先週末は、人生で初めてヨセミテ国立公園に行きました!サンタクララからは車で4時間程度の距離でした。岩も滝も木もかなり大きく、圧倒されました。
妻と二人で旅行したのですが、景色良すぎて写真をとりすぎた結果、撮影枚数は1000枚を超えました。笑 2泊3日の日程だったのですが、すべてのポイントを回りきることができませんでした。近い将来にまた訪問して、Glacier Point や、Mist lake、キャンプ場に行きたいです。
以下、訪問したなかで特に印象に残った場所です。
-
Yosemite Falls
-
1時間程度のtrailを歩いた奥に、ヨセミテで最も有名な滝、ヨセミテ滝があります。ヨセミテ滝は上下に分かれていて、二つの滝を同時に観られるポイントもありますし、近くによれば水しぶきでびちゃびちゃになるほどの迫力を楽しむこともできます。
-
-
Tunnel View
-
Tunnel Viewは、ヨセミテ国立公園の中でも特に有名な展望台です。ヨセミテグッズにもここからの景色がよく描かれています。El Capitan や Half Dome などの有名な岩山が一望できます。絶対に訪れるべき場所です。
-
-
Half Dome
-
Half Domeは、ヨセミテ国立公園のシンボル的な存在です。山の形が半分に切れたような形をしていることからこの名前がついています。今回は、下から眺めるだけにしました。
-
2025-04-15
本日は、ホームページの見た目を少し変更しました。
CSSの変更は Edgeの開発者モードを使用するとかなり楽になりますね。各要素のフォントや色がどのCSSで指定されているか一目でわかります。
最近は相変わらず仕事が忙しく、記事の更新ができていませんが、最近は自作CPU関連で、キャッシュメモリのコヒーレンシ―について勉強しているので、それについてまとめたいと思っています。
また、最近、自作CPUの検証方法について調べているのですが、 risc-v test を用いた簡易テストの他に risc-v dv という方法もあることを知りました。
UVMを活用した検証フレームワークで、自作CPUの検証によい環境なのではと思っています。ただ、READMEに記載されているように、市販のシミュレーター(Synopsys VCS)などが必要なようです。Verilatorなどの無料シミュレーターでは動作しないとのことです。
Verilator は Antmicro がUVM への対応を検討しているようですが、現時点ではまだ必要な処理が実装されていないようです。(2年前から開発が止まっている。。。)
よい検証環境であれば使用したかったのですが、現時点では難しそうですね。
2025-04-02
本日は、riscv-tests のビルド方法について調べました。ビルド自体はREADMEに従って進めれば問題ないのですが、ビルド前に必要なツールセットをビルドする必要があります。
riscv-gnu-toolchain のビルドは RISC-V Spike のインストール を参照してください。注意点として、ビルド時のコマンドは、 make linux
ではなく、 make
を実行してください。さもないと必要なコンパイラがビルドされません。
2025-03-27
本日も記事を更新しました。本日は、RISC-V ISA シミュレーターの spike 周りのインストール方法について記載しました。ただし、ほぼ参考ページ通りの手順なので、特に新しい情報はありません。
次回以降に、この環境を用いたriscv-testsの実行方法について記載したいと思います。これが完了したら、改めて自作CPUの検証環境の検討に移りたいと思います。
2025-03-26
また更新が止まってしまいました。本日妻と日課を頑張る宣言をしたので、なるべく続けたいです。ただ、仕事が四月までは忙しそうです。
本日は、Minecraft の サーバー を Rasbian を搭載した Raspberry Pi 5 に立てる方法を記事にしました。Raspberry Pi 5 は、最新の Raspberry Pi です。Rasbian は、Debian 12.8 がベースの OS です。Minecraft サーバーのバージョンは 1.21.4 です。Java は 21.0.6 を使用しています。
Rasbian の apt でインストールできる Java のバージョンが古いため、別途インストールする必要があります。記事では、BellSoft の OpenJDK ビルドである、Standard JRE をインストールする方法を記載しています。
最近は妻と一緒にマイクラをすることが多く、楽しいです。妻は初心者なので探り探りプレイしており、そんな妻を見ていると中学生の頃の自分を思い出します。
RISC-V CPUの自作についてはぼちぼちスタートしました。まずはどのように検証するかを考えています。今のところ、riscv-tests を用いた検証方法と、spike を用いた検証方法の二つを考えています。
2025-03-16
久々の更新です。最近は仕事とモンスター狩りが忙しくてなかなか更新できませんでした。
今後の記事の内容ですが、Verilatorを用いて、System Verilogのテストベンチを作成する方法についてまとめたいと思います。特に、DPI-Cを用いて、C言語のテストベンチ・モデルとSystemVerilogを接続する方法について記事にします。そのあとは、RISC-V CPU の自作の話に移りたいと考えています。
また、Git の初心者向けの記事もまとめたいです。インターネットには、Git初心者のためのまとめ記事がたくさんありますが、どの記事も Git のコマンドの使い方を最初に述べて、Gitでできることをボトムアップに説明していく記事ばかりで、Gitの全体像、つまり、Gitを使うメリットがわかりにくい記事ばかりだと思います。本記事では、なるべくCUIを使わずに、VScodeのみでGitでやりたいことを完結する方法を述べたいと思います。
2025-01-27
今日は "noindex" tagをindex.htmlから削除することにしました。そのためのpythonスクリプトを作成しました。 Pythonの役に立つtipsも今後紹介できればと思います。
2025-01-26
今日は人生で初めてサンフランシスコに行きました。サンフランシスコはサンタクララから車で1時間程度の場所にあります。詳細はまた記事にまとめたいと思います。とても充実して楽しかったです。
内容は以下を考えています。
-
Fisherman’s Wharf (pier 39)
-
pier39 駐車場
-
船着場とアザラシ
-
boudin Bakery
-
Hard Rock Cafe
-
Waymo 自動運転
-
101高速
-
Golden Gate Bridge
-
お土産やさん
-
Lotusカフェ
-
路上ミュージシャン
-
Pier market seafood
ところで、別の話なのですが、このホームページがGoogleにインデックスされていないことに気がつきました。サーチコンソールによると、noindexタグによって除外されているようです。。。そんなもの指定した覚えがありません。
とりあえずルートページ以外見つかっていないようなので、サイトマップを公開しようと思います。Antoraで作ったサイトは、Antoraが自動でサイトマップを作成してくれます。方法は、Playbookにsite urlの行を追加して、そこにホームページの絶対URLを記載するだけです。これでルートディレクトリにサイトマップが作成されます。作成できたら、Google サーチコンソールにURLを登録します。これも詳しくは今度まとめたいと思います。
これでインデックスされるといいなぁ、、、
2025-01-22
少し日が開きました。最近は本業が忙しいです。上司からのスケジュールが厳しいため、残業が増えています。
本日は、Antora で作成したページをカスタマイズし、左側に表示されているナビゲーションバーを常に展開して表示する方法について記事にまとめました。
Antora Default UI を変更すればなんでもできそうです。Antora は本当に便利ですね。
2025-01-20
本日はverilatorの使い方の記事を作成しました。VerilatorはVersion5.0からタイミングシミュレーションに対応したので、テストベンチをSystemVeriligで作成できるようになりました。 これにより、System Verilogのみで設計からテストまで行うことができ、利便性が増しました。もちろんC言語との接続も引き続き可能なため、複雑なテストベンチはC言語側に任せることも可能です。
記事はこちらです。よければご覧ください。
2025-01-19
今日は土曜日です。妻とお出かけしました。まずは、去年の11月に渡米して以後、初めて美容院にいきました。美容院は、日本人が経営しているところを選んだのですが、内容は髪を切る、シャンプーする、おしゃべりするなど、日本の美容院とほぼ変わらなかったです。(ただ、髪型の仕上がりは、若干アジア人のような髪型になりました(笑))美容師さんが日本人の方だったので、日本人目線で近くの美味しいお店や、観光地情報などを入手することができました。
次にクパチーノのApple パークに行きました。アップルの本社(円形の建物で、宇宙船のような形をしていることで有名)があります。しかし、現地につくまで知らなかったのですが、appleパークには、関係者以外入ることはできませんでした!笑 appleパークの駐車場に入ろうとしたところ門が閉まっていて、そこで初めて気が付きました。。。
その代わりに近くにappleビジターセンターという施設があります。内装はほぼ日本のappleストアと同じで、アップル製品を購入することができます。ここでしか買えない記念品も売られています。私は、記念品のTシャツとカードを買いました。建物がきれいで少し時間をつぶすにはよい場所だと思います。
2025-01-17
去年の11月よりアメリカに住んでいます。アメリカは車社会で、車がないと生活が困難です。アメリカの車は当然左ハンドルなのですが、これについては、運転して1週間程度ですぐ慣れました。ただし、今でも時々困ることがあります。それはウインカーとヘッドライトの位置です。左ハンドルの車は、ウインカーが左についています。つまり、ウインカーとヘッドライトの操作スイッチが、どちらも左レバーについているのです。これが原因となり、ウインカーを操作したときに、誤ってライトを消してしまうことがあります。夜間にこれが起きると、突然目の前が真っ暗になり、かなり焦ります。
アメリカ人はこの操作に慣れているのでしょうか、、、不思議です。アメリカの道は街灯が少なく、夜になるとかなり暗くなります。ヘッドライトなしで走ることのできる道は少ないです。気を付けて運転したいと思います。
2025-01-16
本日は、Verilatorを使ってVCDファイルをダンプする方法を確認しました。VCDファイルは、シミュレーションの波形を記録したファイルです。これを使って、シミュレーションの結果を確認できます。
こちらのページを参考にしました。https://jp-seemore.com/iot/12095/
Verilator 5.0以降はタイミングのシミュレーションができるようになったため、テストベンチをSystem Verilogのみで完結させることができます。これはかなり便利です。詳細については、後日記事にまとめたいと思います。
また、Verilator インストール方法を修正しました。以下のリンクからアクセスできます。
使用するOSをUbuntu24.04に変更しました。タイミングシミュレーションを行うためにCpp20が必要だからです。C++20自体は、古いOSでも利用できますが、他に必要なライブラリもあるため、特に理由がなければ、最新のUbuntuを使用することをお勧めします。
2025-01-15
本日はホームページの見た目を更新しました。タイトルの字の大きさを、画面サイズから自動調整するようにしました。これにより、スマートフォンからも見やすくなりました。
以下のページを参考にさせていただきました。今の時代、こういった情報にすぐアクセスできるのはありがたいですね。このホームページでもこのような情報を提供できるようにしたいです。
2025-01-14
日記をつけはじました。目標は1週間に1記事投稿です。
本日はVerilatorのインストール方法を記事にしました。VerilatorはオープンソースのEDAツールです。世の中にあるほとんどのEDAツールは有料で高価ですが、Verilatorは無料です。個人開発者としてはとてもありがたいですね。ただし、GUIがないため、コマンドラインでの操作が必要です。
記事は、以下のリンクからアクセスできます。
ほとんどが公式ページの引用です。特に問題なく進められるはずです。
次は、System Verilog で書いたテストベンチをコンパイルして、DUTのシミュレーションを行う方法をまとめたいと思います。