如何在ModelSim中查看VHDL内部信号?求通用测试台代码示例
我来给你分享两组实用的代码示例,刚好能解决你在ModelSim中查看内部信号的需求,同时附上让内部信号可见的关键技巧:
示例1:带输入输出端口与内部信号的VHDL设计代码
这是一个带复位、使能控制的递增计数器,包含外部端口和内部计数信号:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity counter_with_internal is Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; -- 低电平复位 enable : in STD_LOGIC; count_out : out STD_LOGIC_VECTOR(3 downto 0) ); end counter_with_internal; architecture Behavioral of counter_with_internal is -- 内部计数信号,这就是你要监控的目标 signal count_int : unsigned(3 downto 0) := (others => '0'); -- 可选:添加keep属性强制ModelSim保留该信号(避免优化) attribute keep : boolean; attribute keep of count_int : signal is true; begin count_process : process(clk, rst_n) begin if rst_n = '0' then count_int <= (others => '0'); elsif rising_edge(clk) then if enable = '1' then count_int <= count_int + 1; end if; end if; end process; -- 内部信号映射到输出端口 count_out <= std_logic_vector(count_int); end Behavioral;
示例2:通用时钟测试台代码
这个测试台可以复用,核心是生成时钟信号,同时提供复位和激励控制:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity tb_generic_clock is end tb_generic_clock; architecture Behavioral of tb_generic_clock is -- 时钟周期常量,可根据需求修改 constant CLK_PERIOD : time := 10 ns; -- 100MHz时钟 -- 例化设计模块需要的信号 signal clk : STD_LOGIC := '0'; signal rst_n : STD_LOGIC := '0'; signal enable : STD_LOGIC := '0'; signal count_out : STD_LOGIC_VECTOR(3 downto 0); -- 例化设计实体 component counter_with_internal Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; enable : in STD_LOGIC; count_out : out STD_LOGIC_VECTOR(3 downto 0) ); end component; begin -- 生成时钟信号:翻转周期的一半 clk_process : process begin clk <= '0'; wait for CLK_PERIOD/2; clk <= '1'; wait for CLK_PERIOD/2; end process; -- 复位与激励流程 stimulus_process : process begin -- 保持复位2个时钟周期 rst_n <= '0'; wait for 2*CLK_PERIOD; -- 释放复位,使能计数器 rst_n <= '1'; enable <= '1'; wait for 20*CLK_PERIOD; -- 让计数器跑20个周期 -- 关闭使能,观察计数器停止 enable <= '0'; wait for 5*CLK_PERIOD; -- 结束仿真 wait; end process; -- 例化设计模块 uut : counter_with_internal Port map ( clk => clk, rst_n => rst_n, enable => enable, count_out => count_out ); end Behavioral;
关键:让ModelSim显示内部信号的技巧
你之前遇到内部信号“未定义”的问题,是因为ModelSim默认会优化掉未被外部端口引用的内部信号。解决方法有三种:
编译时添加优化选项:
在ModelSim的命令行中编译设计文件时,加上-voptargs=+acc参数,比如:vcom -voptargs=+acc counter_with_internal.vhd vcom tb_generic_clock.vhd这个参数会强制保留所有信号的可访问性,避免被优化。
在设计代码中添加keep属性:
就像示例1中实现的那样,给内部信号添加attribute keep,告诉工具不要优化这个信号,这样即使不添加编译参数,也能在仿真中看到它。界面手动添加:
仿真启动后,在ModelSim的Objects窗口中找到你例化的模块(比如uut),展开它就能看到内部信号,直接拖到波形窗口即可。
这样你就能在ModelSim中同时监控端口信号和内部的count_int信号了,后续只需要修改测试台的激励逻辑,就能适配不同的设计需求。
内容的提问来源于stack exchange,提问作者Tyler314
相关产品推荐
相关产品推荐

