为什么我的 RISC-V FCVT.W.D RTL 实现对于输入 0xC1E0000000000000 返回 0x00000000,而不是 0x80000000?(这是一个极端情况)

问题描述 投票:0回答:1

我正在调试 RISC-V FCVT.W.D(IEEE 754 格式下的双精度到有符号整型转换)指令的 RTL 实现与其在参考模型 (Spike) 中的行为之间的差异。 具体来说,对于双精度浮点输入 0xC1E0000000000000(次正规、负、幅度很小),模型返回 0x80000000,而 RTL 输出 0x00000000。 观察

  • 模型行为:参考模型(Spike)遵循 IEEE 754 并正确地将此值转换为饱和整数结果 0x80000000,因为它是一个极端情况,但不是溢出条件(根据此参考 IEEE 754 ).
  • RTL 行为:RTL 在内部生成两个结果: int_result:产生0x00000000,被选为最终输出。 special_int_result:产生0x80000000,但由于后端逻辑,未选择此结果。 这是在 RTL 中启用特殊结果选择的代码块
assign int_result_is_special = info_q.is_nan | info_q.is_inf |
                               of_before_round | ~info_q.is_boxed |
                               (input_sign_q & op_mod_q2 & ~rounded_int_res_zero);

目标: 我正在寻找:

深入了解如何使 RTL 行为与模型保持一致。 澄清 IEEE 754 标准如何处理此类情况。 改进 RTL 逻辑以正确处理这种情况和类似边缘情况的建议。

floating-point system-verilog ieee-754 register-transfer-level riscv32
1个回答
0
投票

您可以使用 float-toy 来可视化浮点值,这根本不是一个极端情况。

0xC1E0000000000000 简单地等于饱和整数上的 -2147483648 或 80000000,因此尖峰是正确的。

因此,在这种情况下,如果您认为 0x8000_0000 不为 0(即您已饱和),则 float 只是 sint 中可表示的最大值

© www.soinside.com 2019 - 2024. All rights reserved.