整数输出在合成 ISE 中变为二进制

Integer output turns to binary in synthesize ISE

我有一个 VHDL BCD 计数器,它的输出是一个整数值(数字)。

但是当我在 Xilinx ISE 中模拟代码时,它以二进制值显示代码的波形。该代码有效,但输出应该是整数,但事实并非如此。我已经在 Modelsim 中测试了这段代码,输出是正确的,并且是整数值。这个问题也出现在代码综合中,并且值是二进制的。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity bcdcnt is
    Port ( clk : in  STD_LOGIC;
           digit : out  INTEGER RANGE 0 TO 9);
end bcdcnt;

architecture Behavioral of bcdcnt is

begin   
count: PROCESS(clk)
    VARIABLE temp : INTEGER RANGE 0 TO 10;
    BEGIN 
        IF (clk'EVENT AND clk = '1') THEN 
            temp := temp + 1;
            IF (temp = 10) THEN temp := 0;
            END IF;
        END IF;
        digit <= temp;
    END PROCESS count;
end Behavioral;

这就是合成的作用。

这就是综合必须做的事情:它将您的高级设计转换为 FPGA 或 ASIC 中的二进制资源。那么,这里有什么问题?

如果您需要模拟 post-synth 结果,通常的方法是创建一个采用正确端口类型的包装器实体,并在这些实体和 post-synthesis 网表之间进行转换组件。

然后,模拟应该与原始实体或此包装器实体一起使用,它们都具有整数端口。

更好的是,您可以重复使用同一个实体,并将包装器添加为第二个架构,从而保证它使用相同的接口(端口)。

(您甚至可以在测试台的包装器中实例化原始和 post-synth,并在它们的输出上并行比较器,以查看它们都做同样的事情。但请注意会有是它们之间的门级延迟;通常您只检查时钟边沿上的输出,因此这些无关紧要。)


另一种方法是将设计顶层的端口类型限制为二进制类型,如 std_logic_vector。这对于设计糟糕的工具来说效果更好,比如 ISE,其中自动生成的测试平台将具有二进制端口类型,(我通常将它们编辑回正确的类型;从头开始编写 TB 几乎更容易)。

但它限制你使用晦涩复杂的设计风格,而不是像整数这样的更高层次的抽象。

如此广泛地教授和鼓励这种方法,这很糟糕——真的很糟糕。但它是,有时你只需要忍受它。 (即使在这种方法中,也没有理由避免 FPGA 内部的适当抽象,只要综合工具理解它们)。


第三种方法 - 粗略地说,“信任,但要验证” - 是相信综合工具是经过精心编写的 - 这通常是正确的 - 而忘记 post-综合模拟。

只需在仿真中的行为级别彻底验证设计,然后对其进行综合,并在实时 FPGA 中进行测试。

99% 的时间(除非你写 really weird VHDL),合成器和 P&R 都做了正确的事情,你看到的任何差异都是由于前面提到的 I/O 时间(门I/O 引脚处的延迟)。然后在测试台 and/or 包装器中对它们进行建模,直到您在两者中看到相同的行为(修复任何需要修复的东西,然后重新综合)。

在这种方法中,如果您需要追踪可疑的综合工具错误,您只需要费心(慢得多)post-synth 和 post-PAR 模拟。

这确实发生了:我在四分之一个世纪里见过两次。

大多数时候我只使用第三种方法。