XST 相当可靠。
我在 XST 中看到的唯一真正的错误硬件错误与作为 OUT 参数传递给进程中的过程的信号有关……信号是使用变量赋值(立即赋值)语义分配的!
在 ISE14 中,此错误仍然存在 - 在针对 Spartan-3 和较旧设备时,但在针对 Spartan-6 和较新设备时不存在。事实证明,XST 有两种不同的 VHDL 解析器,新的似乎更好。
因此,您可以使用其他解析器重试(通过更改目标系列,或“use_new_parser”设置或命令行选项) - 有关详细信息,请参阅 Xilinx 文档。
您还可以将合成后网表插入您的测试平台并重现(或不重现!)仿真中的错误。(IMO 后合成器和后 PAR 仿真的唯一实际用途是确认或消除可能的工具错误!)
而且 - 正如菲利普所说 - 分而治之,直到你有一个小型演示器 - 或者找出真正的问题是什么!
编辑 :
添加以演示几点...
给定 l,n 的正确整数值,我们可以更详细地描述这个问题......从上面的断言,我们可以推断出 n=8,l=3。
library IEEE;
use ieee.math_real.all;
entity count is
end count;
architecture Behavioral of count is
constant n : integer := 8;
constant l : integer := 3;
begin
report "n: " & integer'image(8) severity Note;
assert false report "r: " & real'image(8.0) severity Note;
report "Border a: " & real'image(real(n) + ( real(n) mod 2.0)) severity Note;
report "Border b: " & real'image(2.0**(real(l+1) - 1.0)) severity Note;
report "Border a/b: " & real'image((real(n) + ( real(n) mod 2.0))/(2.00 ** (real(l+1) - 1.0))) severity Note;
report "Ceil a/b: " & real'image(ceil((real(n) + ( real(n) mod 2.0))/(2.00 ** (real(l+1) - 1.0)))) severity Note;
report "Residual a/b: " & real'image((real(n) + ( real(n) mod 2.0))/(2.00 ** (real(l+1) - 1.0)) - 1.0 ) severity Note;
end Behavioral;
1)“断言错误”不是必需的(自 1993 年以来)
2) 与流行的神话相反,只要条件是静态可确定的,就可以合成断言。因此在上面的代码中,其中 l,n 是常数,XST 综合,报告......
以 Spartan-3 为目标,我们得到:
INFO:Xst:1749 - "count.vhd" line 15: note: n: 8
INFO:Xst:1749 - "count.vhd" line 16: note: r: 0
所以使用旧的解析器,在综合中使用 Math.Real 并没有得到很好的支持。具体来说,real'image 返回 0!
以 Spartan-6 为目标,
Elaborating entity <count> (architecture <Behavioral>) from library <work>.
Note: "n: 8"
Note: "r: 8.0"
Note: "Border a: 8.0"
Note: "Border b: 8.0"
Note: "Border a/b: 1.0"
Note: "Ceil a/b: 2.0"
Note: "Residual a/b: 2.22044604925031E-16"
所以我们重现了“错误”。但至关重要的是,如果我从表达式中减去 1.0 而不是取其上限,我们可以看到残差(通过四舍五入引入)。我们可以看到,虽然它很小,但它是积极的。
因此 Ceil() 在返回 2.0 时表现正确,这绝对不是综合工具错误。
在模拟中尝试相同的方法,您可能会发现一个类似的小但负数,因此它也是正确的......
请参阅Kahan 教授关于浮点的这篇论文和其他论文——这不是工具问题,甚至不是 VHDL 问题,而是更大的蠕虫罐......
所以最后一句话是:如果你能找到任何方法来完成整数运算中的相同任务,那将是一个更好的解决方案。