はじめに
こんにちは,Latte72 です.
この度,セキュリティキャンプ2026全国大会の 開発L2ゼミ に参加してきました.
自分は特に日記などを取ったりしていないにもかかわらず,参加してから一週間も経ってから執筆をしているので,記憶があいまいな部分も多く,写真が多めになってしまっていますが,ご了承ください.
応募課題晒しも投稿したので是非こちらもご覧ください.
L2 『プロセッサゼミ』 について
概要
日常的に使用するスマートフォンやパソコンにおいて、プログラムの実行速度はユーザー体験を左右する最も重要な要素です。プログラムを高速かつ高効率に処理するためには、コンピュータがどのように構成されて動いているか(コンピュータアーキテクチャ)の理解が不可欠です。
本ゼミでは、コンピュータの主要な部品である「プロセッサ」について、ハードウェアとソフトウェアの両面から実践的に学びます。
(公式サイトより引用)
L2 はプロセッサについて扱うゼミで,HDL でCPU を自作するCPU自作班と,NPU 上で動作するプログラムを作成するNPUプログラミング班に分かれています.
私はCPU自作班に応募しました.
理由としては,これまでCコンパイラ LaCC やRISC-V をターゲットとしたOS を自作してきた経験から,自分で設計した CPU の上で自分が設計した OS を動かしたい と思ったからです.
詳しい経緯などは応募課題の方に書いてあります.
メンバー
CPU自作班のメンバーは以下の通りでした.
講師:kanataso さん
チューター:クレイジーピエロ さん
受講生:Ryoga.exe さん,atree さん,Latte72 (自分)
事前学習
講師と受講生三人が都合のいい日を都度話し合って日時を決定しました.
6/12(金)
NPU プログラミング班と合同で顔合わせがありました.
他の二人は過去にある程度CPU自作をしたことがあるそうで,自分はほとんど経験がなかったので,頑張らなければと感じました.
自分とRyoga.exe さんは Veryl というVerilogにRustの記法を合わせたようなモダンな言語で開発を行いました.
講師が作ったCPUの名前がbluecore だったので,自分も適当な色の名前を付けようということで beigecore というリポジトリを作り,開発を進めました.
私のハンドルネームがカフェラテとかのラテからきているのでベージュでいいかなーという感じです.
(ちなみに,beige はフランス語ですが,latte はイタリア語なんですよね...同じ意味のフランス語はカフェオレとかの lait です.)
一方で atree さんは Clash というHaskell ベースの尖った言語でCPUを設計されていました.
6/29(月)
初めての事前学習では分岐予測とは何かの概要を習いました.
応募課題についての雑談などもありました.
7/6(月)
引き続き分岐予測について習いました.
静的分岐予測のBTFNTでもかなりの確率であたるよという説明があり結構驚きました.
動的分岐予測のbimodal, gshare, gskew, TAGE の仕組みについて扱いました.
この週の自分の進捗はこんな感じでした.
進捗の共有です
M拡張の実装の効率化をしてみました.
元々は mul, div 共に1 clockで1 bitの演算でした.
(今よりもクリティカルパスが長くなるようにしてもよかったのですが,とりあえずは今までのパスの長さに収まる範囲で1 clockでの演算量を増やすことを考えました.)
まず,forを用いて愚直に1 clockでの演算量を増やそうと思いましたが,mul, div共に2bitほどで今の長さを超えてしまいました.
これは128bitの演算(和)を繰り返しているからであることがわかりました.
mul に関しては 桁上げ保存加算器(Carry-save adder) を取り入れることで32bit (乗算1命令で2clock)まで伸ばすことができました.
(おそらく64bitでもそこまで伸びないですが,現状は放置してます)
divに関しては簡潔に実装する方法がわからなかったので1 clock で 2bit (除算1命令で32 clock)にしてます.
7/17(金)
ページング(Sv32) について習いました.
事務局から Tang Nano 9K が到着しましたが,この時点では放置...
Tang Nano 9K は秋月電子で4000円くらいで買える手軽なFPGAです.
7/23(木)
Out-of-Order 実行について習いました.
Out-of-Order 実行について簡潔に説明します.
CPU は1命令を 1サイクルで複数サイクルに分けて実行するのですが,
7/31(金)
最後の事前学習回でした.
引き続き Out-of-Order 実行について習いました.
この週の自分の進捗はこんな感じでした.
良い報告と悪い報告が...
ReorderBufferを実装することによってデータハザードが起こらないようにしたうえで,メモリアクセスなどがない命令のMEMステージのスキップと,WBステージからEXステージへのフォワーディングを実装しました
従来の969835 cyclesから 731904 cycles へ約25%の削減ができました(遅延も約25%の増加ではありますが...)
キリが良かったのでTangNano9Kように合成しようとしたら回路面積が足りませんでした... (20880/8640)
放置していた Tang Nano 9K にCPUを載せることを試みたのですが,すでに回路が大きくなりすぎていて載らなかったです...
とりあえず,M拡張を入れる前のコードに戻して FPGA 上で動作することを確認できました.
1日目 (8/10)
到着まで
駅からLINK FOREST に向かっている間に,同じサークル (KCS) のメンバーである ストーンチョコ さん,MSK, nonicaなどと偶然遭遇し,合流しました.
共通講義 K1
K1では記者の須藤さんから過去に取材した少年の話がありました.
どこまで書いていいのかよくわからないので内容には触れないでおきますが,しっかり言葉を聞いて自分を導いてくれる人が大切だなと感じました.
共通講義 K2
K2では三名の方から法律に関する講義がありました.
こちらもどこまで書いていいのかよくわからないので内容には触れないでおきますが,実際のエンジニアリングに結び付けたディスカッションなどもあり,法律についても考えながら行動したいと感じました.
ホテルの部屋
その後,5日間泊まる部屋に行って荷物を置く時間がありました.
部屋はとても広くて快適でした.
夕食
あまり記憶がないのですが,夕食はL2ゼミの方々と食べた気がします...
交流会
たくさんの方と名刺交換をさせていただきました.
交換のための時間がしっかり用意されているので,来年以降参加される方も絶対に用意しておきましょう.
開発パート(深夜)
CPUの実装を進めたいという思いが強く,23時就寝,1時30分起床,6時30分就寝,7時30分起床というあり得ない睡眠スケジュールで開発を行いました.
この謎の時間では,Konata への対応と,BTFNTの静的分岐予測を実装しました.
Konata は,kanataso さんが所属している研究室の教授が製作されたパイプライン可視化ツールです!
紫,青,緑,赤,黄の順番に Instruction Fetch Stage, Instruction Decode Stage, Execution Stage, Memory Access Stage, Register Write Back Stage を表しています.
また,灰色になってしまっている部分は分岐などでフラッシュされてしまった処理を表しています.
これを見てこの時点ですでに深夜3時を回っていたと思うのですが,フラッシュが多いなと思い,分岐予測を入れてみたかったので,気合でBTFNT を実装しました.
BTFNT は Backward Taken, Forward Not Taken の略で,ジャンプ先がその分岐命令よりも後方(PCが進む方向と逆方向)ならジャンプすると判定し,前方(PCが進む方向と同じ方向)ならジャンプしないと判定する方式です.
なぜこのような予測をするのかというと,ループはジャンプ先がその分岐命令よりも後方であり,ループのブランチ命令は最後の抜けるとき以外は Taken です.
j .L2
.L3:
lw a5,-20(s0)
addiw a5,a5,1
sw a5,-20(s0)
.L2:
lw a5,-20(s0)
sext.w a4,a5
li a5,9
ble a4,a5,.L3 ; ← これがループのブランチ命令
一方で,if のブランチ命令はelseに飛ぶよりもifが実行される可能性の方が高いです.(これは私も本当にそうなのか疑問ですが,そういうことにしておきましょう.)
そして,if ではジャンプ先がその分岐命令よりも前方にあります.
私のCPUの実装では,命令をデコード後にそれが分岐命令であればジャンプ先を確認して,次にフェッチするアドレスを変更するという実装をしました.
一般的には実行中に自身の命令列を書き換えないので,そのアドレスに置いてある命令が分岐命令であるかどうかや,分岐先のアドレスなどを予想することができる.
そのため,実際に使われる分岐予測では,次にフェッチする命令が決まった段階で,それが分岐命令であるのかと,
CoreMark というベンチマークを実行するサイクル数の比較をした結果,BTFNT実装前は864951 サイクルだったのに対して,実装後には771958 サイクルになり,約10% 削減できました.
2日目 (8/11)
朝食
写真を撮り忘れましたが,7時45分くらいから朝食を取りました.
開発パート(午前)
机は長机で,反対側にはNPUプログラミング班の方々がいらっしゃいました.
また,隣の小さな机でプロデューサーの Nimda さんがすごく小型なパソコンとVRグラスを使用して作業をされていました.
Lゼミには自分が大学で所属しているサークル KCS のメンバーである MSK と nonica もおり,とてもat home な雰囲気でした.
全員で顔合わせをし,雑談を交えつつキャンプ終了までの目標を設定しました.
なぜか受講生3人の自作CPUのリポジトリが写されている図です.
昼食
昼食は全日 3種類から選べるようになっており,この日はうどんを選びました.

食堂がある階には NOC のボードがあり,アクセス元の端末やパケットの数などが表示されています.
(ところで,よく見ると気温やドル円まで表示されているのですが,なぜ...?)
開発パート(午後)
L2 の隣の机にはL1 のCVMビルド&スクラップゼミの方々がいて,「助けて」と叫んだり,水の入ったペットボトルを頭の上に乗せながらコーディングをしたりと,奇行に走っていました.
(当人曰くペットボトルを頭に乗せながらコーディングをすることにより,姿勢が良くなるらしいです...)
午後には講師がCodexを用いて,我々のCPUのスコアボードを作成してくださいました.
リポジトリが更新されると講師の端末上でベンチマークが走り,スピードアップすると派手に表示されます.
(ちなみに,スピードダウンの表示もあります...)
夕食
夕食はL2ゼミの方々と食べました.
講師やチューターと大学院進学についての話をしたり,研究の話をしたりしました.
LT会
ここでLT会がありました.
てまり さんの「手頃なpowerPCマシン」は,発表時ありがちな機材トラブルに見舞われていましたが,Minix FS がバグる様子を実演で見られて面白かったです.
mikit さんの「AI脆弱性報告を眺める会」では,数々のくだらないバグ報告の紹介があり,LLM が生成した質の低い脆弱性報告を投げないように気を付けようと改めて思いました.
atree さんと define さんの「【内部告発】東大システムプログラミング実験の実態」では,東大の授業の様子が知れてよかったです.
やはり,慶應の授業より質が高そう...
kanataso さんの「Out-of-Order」では,Out-of-Order実行をする理由や実装の方法などが触れられていました.
自分のCPUにもOoOを実装したいです.
Ryoga.exe さんの「ドイツの脆弱な電話機は簡単に root が取れる」は,電話機を買ってroot をとる話でした.
筑波の人たちはみんな家にrootが取れる電話機があるそうで.すごいな~(小並感)という感じでした.
3日目 (8/12)
開発パート(早朝)
2日目の朝に静的分岐予測を入れたばかりですが,せっかくならば動的分岐予測を実装したいという思いから,bimodal という動的分岐予測を導入しました.
bimodal は,命令アドレスの一部分のハッシュを取って,それをインデックスとしたテーブルを使用することにより実装します.
bimodal という名前の通り,2 bit の飽和カウンタを用いて計算します.
インデックスを 12 bit くらいにしても,たった24 bit のテーブルだけでできてすごいです.
朝食
朝食はビュッフェ形式になっていました.
(ごめんなさい,何日目に誰と話したのか,この記事を書いているときには記憶が消滅しており...)
開発パート(午前)
開発ゼミの部屋にシールコーナーが爆誕しました~
横にはお菓子コーナーもありました.
昼食
昼食は L2 ゼミの方々と食べました.
例のごとく3種類からの選択制で,自分は冷しゃぶを選びました.
開発パート(午後)
実装がだいぶ進んできました.
夕食
夕食もL2の方々と食べました.
共通講義 K3
K3 では,FFRI の鵜飼社長から起業をするときの心持ちなどについての話がありました.
自分は今まで起業についてあまり考えたことがなかったのですが,実際に起業した人の考えを知ることができてよかったです.
夕食後
wasabi 本を持参して hikalium さんにサインしていただきました!!!
4日目 (8/13)
朝食
朝食です.
開発パート(午前)
高速化手法を入れたら逆にクリティカルパスが伸びてしまってスコアが悪化したり,最適化オプションの変更でスコアが大幅に変動したり(えぇ...)してせめぎ合いが起こっていました.
毎日「こんなCPUは嫌だ」という落書きを毎日していました.
半分くらいは某大手ベンダーの悪口になっており...
4日目は提出用のスライドも作成しなければならず,5日目までにはどうしても自作OS on 自作CPU をしたかったので,昼食は一人で急いで食べました.
その後片付けもあり,バタバタしていたので食事の写真を撮り忘れました.
CTF大会
5日目 (8/14)
開発パート(早朝)
朝はかなり早起きをして(たしか3時くらい)自作OSと自作CPUの実装を進めていました.
なんとかS-modeのCSRと簡易的なUARTまで実装したのですが,OSの起動中のretで変な番地に飛んでしまい起動しないバグに悩まされていました...
その後,何とかバグを取ることができ,自作CPUのシミュレータ上で自作OSを動かすことができました.
OSに関しては,CPU上で動作するように急ごしらえで調整したのであまり納得がいっていないのですが...
(具体的には,すでにOS側にページングを実装していたのにも関わらず,CPU側でページングに対応する実装が間に合わなかったため,強引にOSからページングの実装を削除するなど)
一応,協調的マルチタスキングやプロセススイッチなどが実装されています.
ちなみに,CPU側にsystem controller を実装していないのでSBIがシャットダウンした後にシミュレーターが終了しないです...
成果発表会
成果発表会では,他のゼミの方々がどのようなことを学んでいたのかを知ることができてよかったです.
特にジュニアの子たちの発表では,若いのにとても優秀だなと感じました.
ところで,一部の発表スライドで,フォントがNoto Sans JPではなく,Noto Sans KRになってしまっていました.
特にGoogle Slideでは,フォントが海外のものになってしまいがちなので,利用する機会があれば注意してみてください.
閉会式
閉会式で無事修了証書を受け取ることができました.
協議会主催イベント
協議会主催イベントでは,協賛企業の方々から企業紹介がありました.
自分はアンケートに答え忘れてしまい,ランダムな企業が割り当てられましたが,自分から調べることがあまりないような企業のことを知ることができ,良かったです.
6日目 (8/15)
午前
最終日はさすがに疲れがたまっていたそうで,7時45分くらいまで寝ていました.
その後,朝ご飯を食べたらすぐにチェックアウトの時間になりました.
エントランスで他の参加者の方々にお別れの挨拶をしつつ,一緒に秋葉原に行く人を募りました.
電車で秋葉原に向かい,別の電車で向かっていた人たちとも合流しました.
まず,秋月電子に向かったのですが,夏季休業中で開いていませんでした...
(実は自分はセキュキャンの始まる全日にも秋月に行っていたので,あまり支障はなかったのです)
しょうがないので,同じ通りにある千石電商でいろいろな電子部品を見て時間をつぶしました.
その後は,ジュニアの子たちと中古のラップトップを見て回ったり,ハードオフに電子辞書を探しに行ったりしました.
残念ながら,お目当ての Brain は売っていなかったです.
その後,sik くんとつじ田に行き,つけ麺を頂きました.
午後
自分が HHKB を使っていて,布教したかったので ちまき くんと遊舎工房に行っていろいろなキーボードを眺めました.
その後,後から来たチューターの方々と合流し,本日二度目のハードオフ巡りをしました.
Lゼミチューターの 山田ハヤオ さんが解析用に謎のデバイスを購入していました.
(会議用デバイスらしい...?)
引き続きチューターの方々と,ゴンチャに行ってタピオカを飲みました.
最後に残った数名ではま寿司に行ってお寿司を食べ,解散しました.
おわりに
他の方々の参加記に比べると五月雨で日記のような内容になってしまいましたが,最後まで読んでいただきありがとうございました.
2ヶ月間指導してくださった講師の kanataso さん,チューターのクレイジーピエロさん,セキュリティ・キャンプを支えてくださった協議会,IPA,協賛企業の皆様,ありがとうございました.
キャンプ中に関わった受講生の皆さんともいろいろなお話ができて楽しかったです.
また会う機会があれば,よろしくお願いします.






















