セキュリティ・キャンプ全国大会2023 開発コース Y4【CPU+コンパイラ自作ゼミ】応募課題 # CPU+コンパイラ自作ゼミ 応募課題 「CPU+コンパイラ自作ゼミ」の応募課題は、4問の必須課題と1問の任意課題から成ります。必須課題は当ゼミに応募する方は全員回答してください。回答は、ソースコードを除いた全文が4096字に収まるようにしてください。英数字や記号、空白文字なども1文字とカウントします。 当ゼミは選考にあたり皆さんの熱意を重視します。応募課題を見た時点で知識が足りなかったとしても、応募期間中に資料を調べ、手を動かし、そして熱意が伝わる回答を作っていただければと思います。回答作成にあたり文献やWebページを利用した場合は、適切に出典や引用元を明記してください。 回答は加点方式で評価します。間違ったことが書いてあっても減点されませんので、安心して回答を作ってください。(ただし、間違ったことが書かれているとその分は文字数を圧迫しますので、間違いがない方がお得です) ## A: 【必須課題】挑戦したいこと CPU+コンパイラ自作ゼミで挑戦したいことや達成したいことを教えてください。作ろうと思っているCPUやコンパイラの設計、ゼミで学びたいこと、あるいはそれらを学んだ上で挑戦したいことなど、いろいろな観点があると思います。重視する観点をいくつか設定し、回答してください。なぜそれらに挑戦したいと思っているのか、理由も添えてください。 ## B: 【必須課題】プログラムが作られてから実行されるまで プログラム作成~実行の流れを、一般的なものと独創的なものの2種類に分けて説明してください。一般的なものとは、パソコン上のテキストエディタでソースを作成し、コンパイルして機械語になり、それがCPU上で実行されるというようなことです。この流れをさらに詳しく説明してください。独創的なものとは、先の一般的な流れとは異なるプログラム実行のされ方です。過去に考案されたものの現代では(ほとんど)使われていない技術でもいいですし、あなたが独自に考えた、まだ現実にはなっていない技術でも構いません。 ## C: 【必須課題】好きな命令 あなたが好きなCPU命令を1つ選び、熱く語ってください。その命令を説明するために他の命令を登場させる必要があれば、それらの命令についても記述してください。回答には以下の情報を含めてください。 - CPU名、あるいはマイコンの型番など、CPUの種類を特定できる情報 - 選んだ命令の動作(何をする命令なのか) - その命令が好きな理由 ## D: 【必須課題】Verilogによるプログラミング VerilogかSystem Verilogを用いて、以下に指定する仕様の加算器を作成し、ソースコードを回答してください。加算器を作る際は、算術演算子(+、-、*、/など)を使用しないでください。その代わりに、ビット演算子(~、&、|、^など)を組み合わせて回路を作ってください。 また、ソースコードには適宜、コメントを記載してください。コード1行1行に対してコードの動作をコメントする必要はありません。数行などのまとまりに対して、コードが何を意図しているのかを書くと、良いコメントになりやすいです。 加算器の仕様: - `module adder` として作成する。 - 入力 - リセット信号(信号名はrst) - クロック(信号名はclk) - 4ビット整数2つ(信号名はaとb) - 出力 - 4ビット整数1つ(信号名はs) - キャリー信号(信号名はc) - 回路動作はクロックによる同期式とする。 - クロックの立ち上がりで入力を取り込み、すぐに出力を変化させる。 - あるクロックで入力を取り込んだ後、次のクロックまでの間に入力が変化しても出力が変化しないこと。 - リセット信号が1の間は、いかなる入力に対してもsとcを0とする。 回答にはIcarus Verilogで動作するテストベンチも含めてください。テストベンチとは、作成した加算器(`module adder`)を実体化し、テスト入力を与えて出力の正しさを検証するプログラムのことです。つまり、全体としては次のようなコードの構造になっている必要があります。 module adder 《加算器の実装》 endmodule module adder_tb 《テストベンチの実装》 endmodule ## E: 【任意課題】自己アピール その他、何かあれば自由に書いてください。これまでにあなたが行ってきた自作CPUや自作コンパイラなどの取り組みの説明、関連するリポジトリや記事のリンク、技術的な壁にぶち当たったときにどうやって壁を乗り越えたかのエピソードなど、なんでもOKです。