何らかの理由で、これに答える決定的なリソースやスタックオーバーフローの質問を見つけることができませんでした:
Verilogは、符号付き数値を乗算するときに入力次元と出力次元を処理しますか?
具体的には、符号付き32ビットと符号付き64ビットの数値を乗算するとどうなりますか?だから私が持っている場合:
reg signed [31:0] a = -5;
reg signed [63:0] b = 5;
wire signed [63:0] c;
assign c = a*b;
Cは-25に等しくなりますか(64ビット2の補数スキーム)?
Cを32ビット数として宣言した場合はどうなりますか?それでも-25(32ビット2の補数スキーム)になりますか?
ありがとう!
i)Verilogの乗算演算子は、いわゆるコンテキスト決定式につながります。自己決定式の算術演算に使用される幅は、オペランドの幅と結果によって異なります。と
assign c = a*b;
乗算に使用される幅は、a
、b
、およびc
の中で最も広いものになります。あなたの場合、b
は64ビットで最も幅が広いので、64ビット演算が使用されます乗算。
次に、結果を32ビット幅のwire
-c
に割り当てます。したがって、64ビットの結果は32ビットに切り捨てられます。 MSBが失われ、奇妙な結果につながる可能性があります。例:
reg signed [3:0] a = 3;
reg signed [7:0] b = 63;
wire signed [3:0] c;
assign c = a*b;
http://www.edaplayground.com/x/f3b
乗算は8ビット(最も広いc
、a
、およびb
)を使用して行われ、符号付き演算が使用されるため(c
とa
の両方が符号付きであるため)、b
に-3
の値を指定します。これは、4ビットの符号付き数値に切り捨てられると-3になります。
したがって、予想されるオペランドの範囲に適した幅を使用するのはあなた次第です。
ii)Verilogでは、符号なしオペランドと符号付きオペランドを混在させると、符号なし演算が使用されます。したがって、あなたの場合、両方のオペランドが符号付きであるため、符号付き演算が使用されます。 (結果が署名されていないか署名されているかは関係ありません。)