VHDL-1 rem 4返回3,为什么?

VHDL-1 rem 4返回3,为什么?,vhdl,arithmetic-expressions,Vhdl,Arithmetic Expressions,采用以下VHDL代码: to_signed(-1, 32) rem to_signed(4, 32) 据我从各种来源了解,这应该会产生结果-1,但它返回3,就像mod。为什么? 谢谢大家! 哦,不,不 作为MCVE: library ieee; use ieee.numeric_std.all; entity rem_tb is end rem_tb; architecture arch of rem_tb is begin assert false report "Result

采用以下VHDL代码:

to_signed(-1, 32) rem to_signed(4, 32)
据我从各种来源了解,这应该会产生结果-1,但它返回3,就像
mod
。为什么?

谢谢大家!

哦,不,不

作为MCVE:

library ieee;
use ieee.numeric_std.all;

entity rem_tb is
end rem_tb;

architecture arch of rem_tb is
begin
    assert false report "Result : " & integer'image(to_integer(to_signed(-1, 32) 
                                    rem to_signed(4, 32))) severity NOTE;
end arch;
使用ghdl编译:

ghdl -a rem_tb.vhd
ghdl -e rem_tb
ghdl -r rem_tb
它回答说

rem_tb.vhd:11:1:@0ms:(assertion note): Result : -1

所以。。。你在用哪个模拟器?该模拟器对MCVE做了什么?

将其作为包含库/使用子句中的断言或报告。它会生成结果-1:。请按照布赖恩的要求去做。谢谢,我会的。谢谢!我正在使用Vivado 2016.4和实际的硬件。ieee.numeric_std中的“rem”函数确实产生了正确的值。我将深入挖掘。ug901 v2016.4,Vivado Design Suite用户指南综合,第4章VHDL支持,表4-10,VHDL构造和支持状态,VHDL运算符,rem“如果正确的操作数为2的常数幂,则支持”A演示这个问题听起来很有道理。通过查看Matthew Taylor的链接和使用mod的附加断言修改Brian的代码,我们看到mod结果是3。那么你从哪里得到一个不产生-1的rem操作符呢?在上面的例子中,函数调用或二进制操作符形式都应该调用相同的函数并产生相同的结果。现在还不清楚你到底在做什么,为什么你会看到一些不同的东西。除了一个警铃。。。“和实际的硬件”。坦白地说,如果你没有先模拟这个并得到正确的结果,合成可以利用你的代码中其他地方的错误来生成硬件,这些硬件可以做任何事情,也可以什么都不做。