# CPU+コンパイラ自作ゼミ 応募課題 「CPU+コンパイラ自作ゼミ」の応募課題は、4問の必須課題と1問の任意課題から成ります。必須課題は当ゼミに応募する方は全員回答してください。回答は、ソースコードを除いた全文(5問合計)が4096字に収まるようにしてください。英数字や記号、空白文字なども1文字とカウントします。 当ゼミは選考にあたり皆さんの熱意を重視します。応募課題を見た時点で知識が足りなかったとしても、応募期間中に資料を調べ、手を動かし、そして熱意が伝わる回答を作っていただければと思います。回答作成にあたり文献やWebページを利用した場合は、適切に出典や引用元を明記してください。 回答は加点方式で評価します。間違ったことが書いてあっても減点されませんので、安心して回答を作ってください。(ただし、間違ったことが書かれているとその分は文字数を圧迫しますので、間違いがない方がお得です) ## A: 【必須課題】応募の理由 CPU+コンパイラ自作ゼミに応募した理由を教えてください。作ってみたいCPUやコンパイラの設計があるのでしょうか?ゼミで学びたいことや修了後に挑戦したいことがあるのでしょうか?いろいろな理由があると思います。重視する理由を1つ以上回答してください。回答にはその理由の発端となったエピソードも添えてください。例えば、作ってみたいCPUの設計があるという場合、そもそもCPUを設計してみたいと思ったきっかけや、自分だけで進めるのではなく当ゼミに応募したきっかけなどです。 ## B: 【必須課題】プログラムが動く仕組み プログラム作成~実行の流れを説明してください。パソコン上のテキストエディタでソースを作成し、コンパイルして機械語になり、それがCPU上で実行されるというようなことです。この流れをさらに詳しく説明してください。アーキテクチャはあなたが好きな(あるいは慣れている)ものを1つ指定して回答してください。アーキテクチャの例(これらに限りません):x86 CPUを搭載したPC、Raspberry Pi Pico、TD4 ## C: 【必須課題】好きな命令とプログラミング言語 あなたが好きな「CPU命令」と「プログラミング言語の特徴」をそれぞれ1つ選び、熱く語ってください。回答には以下の情報を含めてください。 - CPU命令について - CPU名、あるいはマイコンの型番など、CPUの種類を特定できる情報 - 選んだ命令の動作(何をする命令なのか) - その命令が好きな理由 - プログラミング言語の特徴について - プログラミング言語の名前やGitHubリポジトリ名など、プログラミング言語を特定できる情報 - 選んだ特徴の概要 - その特徴が好きな理由 ※「プログラミング言語の特徴」とは、例えば「C言語のgoto文」のような構文要素や、「Rustの静的解析能力」のような言語全体の機能、「アセンブラの何でも出来るところ」のような言語の性質などです。あまり「特徴」という言葉に拘らなくて大丈夫です。言語全体ではなく側面を切り出して語って欲しいという意味です。言語全体としては好きじゃないけどこの部分だけは好き、というようなものでもOKです。 ## D: 【必須課題】Verilogによるプログラミング VerilogかSystem Verilogを用いて、以下に指定する仕様の加算器を作成し、ソースコードを回答してください。加算器を作る際は、算術演算子(+、-、*、/など)を使用しないでください。その代わりに、ビット演算子(~、&、|、^など)を組み合わせて回路を作ってください。 また、ソースコードには適宜、コメントを記載してください。コメントは、そのコードが「何をするか」ではなく、「何を意図しているのか」を書くと、良いコメントになりやすいです。 加算器の仕様: - `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です。