首页 > 解决方案 > RISC-V 浮点舍入结果 Spike Vs。RTL 模拟

问题描述

我正在运行一个带有 float 和 double 指令的程序,并且在比较我的 RTL 模拟和 Spike 时,我观察到这些指令的回写值不匹配。

例如:

fsqrt.d fa3, fa3 
Instruction in hex: 0x5a06c6d3

指令的输入参数值为

0x41e2e80040000000 = 2537554432.0
sqrt(2537554432.0) = 50374.1444790876820703394273903...

根据 RISC-V 规范和解码指令,该指令的舍入模式为Round to Nearest,与 Max Magnitude (RMM) 相关。我从 Spike 和 RTL sim 获得以下回写值。

Spike   = 0x40e898c49f929b92 (in hex) = 50374.144479087685 (in decimal)
RTL sim = 0x40e898c49f929b91 (in hex) = 50374.144479087680 (in decimal)

查看实际的十进制值,似乎 RTL 结果更接近实际值,因此给出了正确的结果,但 Spike 和 dromajo 给出的值相同,但略有不同。

我想确认哪个结果是正确的,以及这种不匹配是否可以被认为是浮点运算中的错误行为。

请让我知道任何有助于解决我疑问的信息。

标签: floating-pointriscv

解决方案


似乎 RTL 结果更接近实际值

不,斯派克更近了。由于双舍入和劣质 OP 的 RTL sim doubleto text,您的观察结果是歪斜的。使用更好的库和更多的小数精度来查看。

Spike (OP)   = 0x40e898c49f929b92     50374.144479087 685 (in decimal)
Spike        =  0x1.898c49f929b92p+15 50374.144479087 684886               +0028
sqrt(2537554432.0)                    50374.144479087 6820703394273903...
RTL sim      =  0x1.898c49f929b91p+15 50374.144479087 677610               -0044
RTL sim (OP) = 0x40e898c49f929b91     50374.144479087 680 (in decimal)

我怀疑RTL simwith中的错误50374.144479087680可能是由于它的库double文本代码在Round to Nearest 中运行不正确,与 Max Magnitude (RMM) 相关


推荐阅读