Verilog にゅうもん続き。にわかな奴ほど語りたがる法則に従い、今が (このページ上での) 旬である。芸がないと思いつつも RISC-V RV32I を実装してみた。さいきん入門した人の 2/3 くらいは自分の実装を持っていそう。
正直なところ素朴な実装から新しく学べることは少ない。パイプラインの実装くらいまではやってみないと意味ないか…。ただ、たとえばレジスタとマルチプレクサと加算器の規模感を肌で感じられるのは良い。はまったこと:
Icarus (iverilog -g2012
) でモジュールレベルの logic foo = bar
が continuous assignment にならない。それが正しい仕様の可能性もあるが、 Verilator では (ちょっと試したかぎりでは) continuous assignment になる (追記: これは私の間違い。おそらく仕様的にも Icarus の動作は正しい)。まあバグか否かは別にして、 SystemVerilog でもメタ言語の const 宣言として uwire を使うのは依然として良い慣例な気がする。
yosys
は interface
のコンパイルを通すが実装は不完全。
算術右シフトは x >>> y
ではだめで、 signed'(x) >>> y
でもだめで、 signed'(x >>> y)
もだめ。 signed'(signed'(x) >>> y)
だと動く。逆向きの型推論があるの? 謎。
ところで、いまさら初めて知ったことに自分でも驚くが、 C 言語のシフト演算で負の右辺値は未定義らしい。逆方向のシフトになると思っていた…ような気がする。今まで明確に認識していなかったということは、そういう挙動が必要になる場面は少ないのかな。意外。
yosys + nextpnr のサポートがいい iCE40 という FPGA を購入しようと思ったが、評価ボードが異常に高い。本来は廉価な製品ぽいのだが、状況がよく分からない。
Gowin / SiPeed Tang Nano シリーズが良さそう。
Backlinks: [202415500]
.