# 課題 ## 概要 回答の文字数が多いほど評価するということはありませんので、回答はできるだけ短く簡潔に記述してください。 問4の課題に関しては、どのように考えたかを見たいので、テストをパスできていなくても書いてみてください。 ## 問1 RISC-Vの特徴の一つとして、命令セットアーキテクチャ (ISA) がロイヤリティフリーなため、RISC-Vの命令セットに対して独自の命令を追加したCPUを設計しても、ISAのライセンスとして問題がないという点があります。このため、RISC-Vを推進している様々な組織が命令セットを提案し、有用なものは拡張命令セットとして規格化されています。 例えば最近、規格化された拡張命令の一覧は以下のページに記載されています。 https://wiki.riscv.org/display/HOME/RISC-V+Specification+Status これらの中で興味深いと思うものがあるならば、その理由とともに説明してください。 これらの中に特に興味深いと思うものが無いのであれば、あなたがRISC-Vに命令を追加する場合、どのような命令(群)を追加してみたいかを、その命令の仕様 (ニーモニック、フォーマット、動作) とともに説明してください。 既に規格化・提案されているものと重複していても構いません 逆に命令が多すぎるのでサブセットでも良いのでは?と思う場合は、RV32Iをベースとしてどの命令を減らすのかとともに、減らすことによる利点・欠点を説明してください。 ## 問2 今までに使ったことがあるCPUの命令セット (x86_64, Arm, PIC, AVR, RL78, RX, RISC-V, etc... なんでもOK) について自由に記述してください。 ## 問3 本講義では、基本的なRISC-V CPUコアをFPGAに実装して動作を確認したのち、余裕があれば受講者の実装したい機能を実装する時間を設ける予定です。 RISC-V CPUの内部、もしくは外部に実装してみたい機能・回路について説明してください。 ## 問4 ### 問4-A 以下のポート定義を持つ、0 から 65535 の 範囲 ( 0 および 65535 を含む) の値を順に、下位ビット側からバイト単位で出力するモジュール `mem_read` を作成してください。 値は 0 から 65535 の16ビットの範囲の値なので、出力するには2サイクル必要になります。例えば、 `1022` は16進数で `0x03fe` なので、下位バイト `0xfe` を先に出力し、次のサイクルで上位バイト `0x03` を出力します。値を出力する2サイクルの間は `out_valid` に `1` を出力して、値が有効であることを表してください。 また、値一つ分、つまり2バイト分を出力し終えた次のサイクルは 1サイクルの間 `out_valid` に `0` を出力して、値が無効とし、値の出力を行わないでください。 記述内容としては、付属のテストを使ってIcarus Verilogでテストをパスすることを目標とします。 (どういう考え方をしたか評価しますので、テストをパスしない内容でもご応募いただければと思います) 逆にテストが足りないと思ったり、付属のテストベンチが使いにくいと思ったのであれば、追加していただいても構いません。 使用可能なSystemVerilogの言語機能はIcarus Verilogでシミュレーションが可能な範囲 (`-g2012` オプションを指定して使えるSystemVerilog 2012のサブセット) とします。 また、記述したコードの動作について日本語で説明してください。 信号のタイミング例はテストベンチに同梱の mem_read/waveform.png を参考にしてください。 ```systemverilog `default_nettype none module mem_read ( input wire clock, // クロック入力 input wire reset, // Active Highの同期リセット入力 output logic out_valid, // 出力VALID output logic [7:0] out_data // 出力データ ); endmodule `default_nettype wire ``` ### 問4-B 4-Aで作成したモジュールに、モジュールの出力を受け取れるかどうかを表す1ビットの信号 `out_ready` を追加してください。 `out_valid` かつ `out_ready` が `1` のサイクルのみ、 `out_data` の出力が更新されます。 ただし、4-Aと違い `out_valid` を `1` にするサイクルは4サイクルに1度にする必要はありません。 信号のタイミング例はテストベンチに同梱の mem_read_ready/waveform.png を参考にしてください。 ```systemverilog `default_nettype none module mem_read ( input wire clock, // クロック入力 input wire reset, // Active Highの同期リセット入力 output logic out_valid, // 出力VALID input wire out_ready, // 出力READY output logic [7:0] out_data // 出力データ ); endmodule `default_nettype wire ``` ## 問5 本講義を受講するにあたってアピールしておきたいことがあれば自由に記述してください。