Verilog中的浮点乘法问题

Posted

技术标签:

【中文标题】Verilog中的浮点乘法问题【英文标题】:floating point multiply problem in verilog 【发布时间】:2020-01-25 07:18:59 【问题描述】:

对于一个给定的项目,我在 verilog 中遇到了 浮点乘法。所以我在 ISE 14.7 中使用了 Xilinx 的 IP 内核 具有以下浮点 IP 内核 GUI 配置:

相乘 单个(指数宽度:8 位,小数宽度:24) 没有使用(在家庭优化中) 最大延迟(此处为 8 个时钟周期)

所以当我以 ieee 754 格式给出以下输入时

A = 0_0111111_000000000000000000000000 (which is one)

B = 0_0111111_000000000000000000000000 

8 个时钟周期后的结果是:

0_0111110_100000000000000000000000

我的问题是为什么结果不是 ieee 754 格式的? 谁错了?

【问题讨论】:

您断言A1 是不正确的。它实际上是0.5。结果解码为0.25,这是正确的答案。详情见下文。 【参考方案1】:

这是您的第一个数字的解码方式:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111110 00000000000000000000000
             Hex: 3F00 0000
       Precision: SP
            Sign: Positive
        Exponent: -1 (Stored: 126, Bias: 127)
       Hex-float: +0x1p-1
           Value: +0.5 (NORMAL)

所以,它的值是0.5,而不是您声称的1

这是产品的解码方式:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111101 00000000000000000000000
             Hex: 3E80 0000
       Precision: SP
            Sign: Positive
        Exponent: -2 (Stored: 125, Bias: 127)
       Hex-float: +0x1p-2
           Value: +0.25 (NORMAL)

所以,它是0.25。这是正确的,因为0.5 * 0.5 = 0.25 确实如此。

如果您想测试乘法 1 * 1 = 1,请使用以下编码:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 01111111 00000000000000000000000
             Hex: 3F80 0000
       Precision: SP
            Sign: Positive
        Exponent: 0 (Stored: 127, Bias: 127)
       Hex-float: +0x1p0
           Value: +1.0 (NORMAL)

即,0_01111111_00000000000000000000000,这就是数字 1.0 编码为 32 位单精度 IEEE754 浮点值的方式。请特别注意,指数是 8 位,这似乎是您的原始编码中有 7 位的问题的根源。

【讨论】:

以上是关于Verilog中的浮点乘法问题的主要内容,如果未能解决你的问题,请参考以下文章

verilog 为啥乘法器写的那么复杂? 不是这样写也可以吗 assign c = a * b;

verilog中signed的使用

verilog乘法器的设计

在System Verilog中计算浮点值的e ^ x?

Verilog -- 有符号与无符号运算

verilog HDL 实现十六路彩灯的控制 谢谢大神