在 IEEE.numeric_std 中使用“*”运算符时处理溢出

Dealing with overflows when using the '*' operator in IEEE.numeric_std

我正在 Xilinx Vivado 上测试自定义协处理器 IP。在使用*运算符对2个32位向量进行无符号乘法时,我发现当结果占用超过32位时,并没有体现在更高的32位,即高位32 位全为 0,低 32 位显示其部分结果。

16449 * 4171239345 gives 613432305

我阅读了 numeric_std 库,它显示:

  -- Id: A.15
  function "*" (L, R: UNSIGNED) return UNSIGNED;
  -- Result subtype: UNSIGNED((L'LENGTH+R'LENGTH-1) downto 0).
  -- Result: Performs the multiplication operation on two UNSIGNED vectors
  -- that may possibly be of different lengths.

*运算符不适合大于32位的乘法吗?

提前致谢!

您显示的乘法似乎是 整数 的乘法。整数在 vhdl 中被限制为 32 位,并且通常是有符号的。所以你的第二个数字太大而无法表示(十六进制:0xf8a00fb1)。如果没有任何特定的代码示例,我会假设即使是这个值也不会被您的模拟器正确解释。

Numeric_std的unsigned值不限于任何宽度。为每个值使用 unsigned 类型将避免任何混淆。例如。如果您需要在信号上完成此操作,请声明:

signal a: unsigned(31 downto 0);
signal b: unsigned(31 downto 0);
signal y: unsigned(63 downto 0);

正文:

a <= x"00004041";
b <= x"f8a00fb1";
y <= a*b;