You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vivado:行为仿真与综合后功能仿真行为不一致问题排查

通用多比特寄存器综合后功能仿真失效问题

我实现了一个带复位、写入使能的N位通用寄存器,行为仿真完全正常,但综合后功能仿真时功能失效。

寄存器源码(g_register.vhd)

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.numeric_std.all;

entity g_register is
    generic (
        N : integer := 8
    );
    port (
        rst      : in std_logic;
        clk      : in std_logic;
        en       : in std_logic;
        data_in  : in std_logic_vector(N - 1 downto 0);
        data_out : out std_logic_vector(N - 1 downto 0)
    );
end g_register;

architecture Behavioral of g_register is
begin
    process (rst, clk) is
    begin
        if rst = '1' then
            data_out <= (others => '0');
        elsif rising_edge(clk) then
            if en = '1' then
                data_out <= data_in;
            end if;
        end if;
    end process;
end Behavioral;

测试平台代码(g_register_testcases.vhd)

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity g_register_testcases is
end g_register_testcases;

architecture Behavioral of g_register_testcases is
    signal clock    : std_logic                    := '0';
    signal reset    : std_logic                    := '0';
    signal enable   : std_logic                    := '0';
    signal data_in  : std_logic_vector(7 downto 0) := "00000000";
    signal data_out : std_logic_vector(7 downto 0) := "00000000";

    component g_register is
        generic (
            N : integer := 8
        );
        port (
            rst      : in std_logic;
            clk      : in std_logic;
            en       : in std_logic;
            data_in  : in std_logic_vector(N - 1 downto 0);
            data_out : out std_logic_vector(N - 1 downto 0)
        );
    end component;
begin
    clock <= not clock after 10 ns;

    UUT : g_register
    generic map(8)
    port map(
        rst      => reset,
        clk      => clock,
        en       => enable,
        data_in  => data_in,
        data_out => data_out
    );

    process is
    begin
        reset <= '1';

        wait for 20 ns;

        reset   <= '0';
        enable  <= '1';
        data_in <= "11111111";

        wait for 20 ns;
    end process;

end Behavioral;

仿真结果

行为仿真

行为仿真波形

综合后功能仿真

综合后功能仿真波形

疑问

我认为这段代码应该能被正确综合成带使能的触发器,但综合后功能仿真中,即使enable信号为高,输出值也没有变化。问题出在哪里?

另外,我收到以下警告信息,是否和当前问题相关?

[VRFC 10-4940] 'g_register' remains a black box since it has no binding entity ["~/project/project.srcs/sim_1/new/g_register_testcases.vhd":29]

我使用的是Vivado 2024.2版本。


问题分析与解决

那个警告是核心原因——综合后功能仿真时,被测单元(UUT)被工具当成了黑盒,没有加载综合后的网表,自然无法正确执行逻辑,导致输出始终不变。

具体问题点

  1. 仿真流程配置错误:你可能直接从源文件启动了功能仿真,而非基于综合后的网表运行。综合后功能仿真需要使用综合生成的结构网表,而非原VHDL代码。
  2. 仿真工程未关联综合产物:测试平台所在的仿真集合没有包含g_register的综合网表,工具找不到绑定的实体,只能用黑盒替代。

解决步骤

  1. 正确启动仿真流程:在Vivado的Flow Navigator中,先完成综合(Run Synthesis),然后选择Run Post-Synthesis Functional Simulation启动仿真,确保工具使用综合后的网表。
  2. 检查仿真设置:打开Simulation Settings,确认Simulation Source Set选择的是包含综合网表的集合(而非仅源文件集合)。
  3. 优化测试平台(可选但建议):
    • 将generic map(8)改为generic map(N => 8),写法更规范,避免潜在的参数匹配问题;
    • 在测试平台的最后一个wait for 20 ns后添加wait;,让仿真持续运行,便于观察后续时钟沿的输出变化。

补充说明

你的寄存器逻辑代码本身没有问题,行为仿真的正常结果已经验证了逻辑正确性,所有问题都出在Vivado的仿真流程配置上,黑盒警告已经明确提示了问题根源。


内容的提问来源于stack exchange,提问作者Manchineel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:44:51