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)被工具当成了黑盒,没有加载综合后的网表,自然无法正确执行逻辑,导致输出始终不变。
具体问题点
- 仿真流程配置错误:你可能直接从源文件启动了功能仿真,而非基于综合后的网表运行。综合后功能仿真需要使用综合生成的结构网表,而非原VHDL代码。
- 仿真工程未关联综合产物:测试平台所在的仿真集合没有包含
g_register的综合网表,工具找不到绑定的实体,只能用黑盒替代。
解决步骤
- 正确启动仿真流程:在Vivado的Flow Navigator中,先完成综合(Run Synthesis),然后选择
Run Post-Synthesis Functional Simulation启动仿真,确保工具使用综合后的网表。 - 检查仿真设置:打开
Simulation Settings,确认Simulation Source Set选择的是包含综合网表的集合(而非仅源文件集合)。 - 优化测试平台(可选但建议):
- 将
generic map(8)改为generic map(N => 8),写法更规范,避免潜在的参数匹配问题; - 在测试平台的最后一个
wait for 20 ns后添加wait;,让仿真持续运行,便于观察后续时钟沿的输出变化。
- 将
补充说明
你的寄存器逻辑代码本身没有问题,行为仿真的正常结果已经验证了逻辑正确性,所有问题都出在Vivado的仿真流程配置上,黑盒警告已经明确提示了问题根源。
内容的提问来源于stack exchange,提问作者Manchineel
相关产品推荐
相关产品推荐

