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

如何在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默认会优化掉未被外部端口引用的内部信号。解决方法有三种:

  1. 编译时添加优化选项:
    在ModelSim的命令行中编译设计文件时,加上-voptargs=+acc参数,比如:

    vcom -voptargs=+acc counter_with_internal.vhd
    vcom tb_generic_clock.vhd
    

    这个参数会强制保留所有信号的可访问性,避免被优化。

  2. 在设计代码中添加keep属性:
    就像示例1中实现的那样,给内部信号添加attribute keep,告诉工具不要优化这个信号,这样即使不添加编译参数,也能在仿真中看到它。

  3. 界面手动添加:
    仿真启动后,在ModelSim的Objects窗口中找到你例化的模块(比如uut),展开它就能看到内部信号,直接拖到波形窗口即可。

这样你就能在ModelSim中同时监控端口信号和内部的count_int信号了,后续只需要修改测试台的激励逻辑,就能适配不同的设计需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:28:31