RISC-V 浮点舍入结果 Spike Vs。 RTL 仿真

RISC-V floating-point rounding results Spike Vs. RTL simulation

我是 运行 一个带有浮点和双精度指令的程序,在比较我的 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给出的值相同,略有不同。

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

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

it seems like RTL result is closer to the actual value

不,斯派克更近了。由于 double rounding 和劣质 OP 的 RTL sim double 文本,您的观察是歪斜的。使用更好的库和更高的小数精度来查看。

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 sim50374.144479087680 中的错误可能是由于它的库 double 到文本代码 运行 不正确,而 舍入到最近,与最大震级 (RMM) 相关