verilog中的浮点数

floating point in verilog

我在verilog中有浮点数,我想把它右移做IEEE标准,但我不知道点在哪里,了解它是否标准(停止移动).

我能做什么?

第二个问题: 如果我像这样移动浮点数:10001.11 向右移动在 verilog 中会发生什么? 0100.111 或 0100.11 ?

IEEE standard

IEEE 1800-2012 最新的 SystemVerilog 规范指出:

5.7.2 Real literal constants

The real literal constant numbers shall be represented as described by IEEE Std 754, an IEEE standard for double-precision floating-point numbers.

...

6.12 Real, shortreal, and realtime data types
The real* data type is the same as a C double. The shortreal data type is the same as a C float. The realtime declarations shall be treated synonymously with real declarations and can be used interchangeably. Variables of these three types are collectively referred to as real variables

* The real and shortreal types are represented as described by IEEE Std 754.

Wikipedia IEEE 754

需要确定的一件事是您处理的是否是 floating point number, or a fixed-point 号码。它们在实践中的存储方式非常不同,定点数更容易处理。

  • 定点数的存储方式与任何其他整数相同。不同之处在于,当它们被解释时,小数点被添加到位位置。例如,您可以存储一个 16 位数字,但说最后 4 位在小数点之后。这有时称为 12.4,请确保注释代码以明确说明。您还需要跟踪该数字是纯正值还是 2 的补码值。

    • 浮点数使用尾数和指数存储。它们可以表示范围更广的值,但操作起来更复杂。

对于你的第二个问题,我假设你使用的是定点算法。小数点是固定的,不会移动。所以对于你的例子:

10001.11 >> 1 = 11000.11

请注意,如果您的号码是带符号的 2 的补码,则 MSB 将从移位前号码的 MSB 复制(这会保持移位前后的符号)。

你讲一下定点操作。移位运算不适用于浮点数。

Verilog 具有浮点类型 - 实数,但此类型不用于综合且不支持运算 >> (shift)

对于浮点数,shift 在所有语言中都未定义。

但是如果你想乘数,你必须使用指数和尾数部分

使其成为 IEEE 标准。您需要遵循 IEEE-754 格式来表示浮点数。标准中有不同类型的浮点表示。

  1. 半精度(或 FP16),其中 1 位用于符号,5 位用于指数,10 位用于尾数。

  2. 全精度(或 FP32),其中 1 位用于符号,8 位用于指数,23 位用于尾数 等等。

您可以使用 FP16 和 FP32 表示执行任何类型的运算,例如加法、减法、乘法等。