>>527-528 ,525
符号拡張の記述は 具体的に どうやってますか?
Verilog1995でも $signed(12'h805) * $signed(12'h002)で可みたいですが、
他の方法でしょうか。
そういえば、$signed( )の値って 32bitになるのかな?
いかん、仕様を知らないまま使っている… (爆)

>>530
符号拡張するビット数が足りないと、合わない罠。
たとえば (- 0x7FB) * (- 0x7FB) = 0x3FB019 の場合、
32bitまで拡張してから unsigned の乗算なら、
 FFFFF805 * FFFFF805 = FFFFF00A 003FB019 で、下位32(24)ビットを取れば正解。
16bitまでしか拡張しないと、
 F805 * F805 = F049 B019 なので下位16bitは合ってるけど[31:16]はNG。
Win付属の電卓でも叩いて 試してみなはれ。
(表示/関数電卓、16進、QWORDの指定をお忘れなく)

((2^16) - A) * ((2^16) - B) を展開して、
 = (2^32) - (2^16)*(A+B) + (A*B) と考えると、わかりやすいかな?