結論
以下のように書けばよい。
重要な点は、signed
と>>>
である。
何をどう勘違いしていたのか
算術右シフトをVerilog-HDLで書けるのか調べていたところ、以下の記事にぶつかった。
この記事では、>>>
を使用すれば、算術シフト、>>
を使用すれば論理シフトになるかのように読み取れる。
しかし、>>>
を使用しても、私の手元では算術シフトにならず、論理シフトとして扱われていた。
当初、私はこれをエミュレータのバグではないかと疑っていた(icarus-verilogを使っていたため)。
しかし、Quartus付属のModelSimでも同様の動作であったため、これは根本的にコードが間違っているということに気づいた。
そして、以下のような記事を発見した。
FPGAの部屋 Verilog HDL で unsigned, signed の演算をする1
やはりいつも最後にはmarseeさんの情報にたどり着く。この記事には、算術右シフトのことについては触れられていなかったが、もしかしてと思ってsignedとつけたら、うまく動作した。
結論
- Verilog-HDLでは標準で符号なしなので、符号ありとして扱いたい場合はsignedをつける
- 符号なしの値に対して
>>>
を使ったら警告くらい出してくれてもいいのに…(気づかなかっただけか?)
- 符号なしの値に対して
- 私は無知すぎる
- エミュレーターを疑う前に自分の頭を疑うべき
- やはり http://marsee101.blog19.fc2.com/ の情報は有用なのでもっと読むべき