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

ModelSim编译VHDL时钟分频测试台报vcom-1576错误排查修复

VHDL时钟分频器测试台编译错误排查

编写ClockDivider(时钟分频器)测试台时使用的初始代码如下:

library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_STD.all;

entity CLOCKDIVIDER_TB is
end entity CLOCKDIVIDER_TB;

architecture BENCH of CLOCKDIVIDER_TB is

--declare component
component ClockDivider
    Port(
        CLK            : IN STD_LOGIC;   
        RST            : IN STD_LOGIC;
        CLK_OUT_DIV_01 : OUT STD_LOGIC;
        CLK_OUT_DIV_02 : OUT STD_LOGIC;
        CLK_OUT_DIV_03 : OUT STD_LOGIC;
        CLK_OUT_DIV_04 : OUT STD_LOGIC;
    );
end component;

--inputs
signal CLK            : IN STD_LOGIC := '0';   
signal RST            : IN STD_LOGIC := '0';

--outputs   
signal CLK_OUT_DIV_01 : OUT STD_LOGIC;
signal CLK_OUT_DIV_02 : OUT STD_LOGIC;
signal CLK_OUT_DIV_03 : OUT STD_LOGIC;
signal CLK_OUT_DIV_04 : OUT STD_LOGIC;

--clock period
constant clk_t : time := 20 ns;

BEGIN

--uut instance
uut: ClockDivider PORT MAP (
    CLK  => CLK,
    RST  => RST,
    CLK_OUT_DIV_01 => CLK_OUT_DIV_01,
    CLK_OUT_DIV_02 => CLK_OUT_DIV_02,
    CLK_OUT_DIV_03 => CLK_OUT_DIV_03,
    CLK_OUT_DIV_04 => CLK_OUT_DIV_04
);

  -- Clock definition.
clk_process: process
begin
    CLK <= '0';
    wait for clk_t / 2;
    CLK <= '1';
    wait for clk_t / 2;
end process;

-- Processing.
stim_proc: process
begin
    wait for 100 ns;
    reset <= '1'; -- Up
    wait for 100 ns;
    reset <= '0'; -- Down
        wait;
end process;


end architecture BENCH;

初始编译得到如下错误:

** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(27): near ")": (vcom-1576) expecting IDENTIFIER.

尝试通过删除组件声明端口列表中最后一个端口后的分号修复错误,修改后的组件声明代码如下:

--declare component
component ClockDivider
    Port(
        CLK            : IN STD_LOGIC;   
        RST            : IN STD_LOGIC;
        CLK_OUT_DIV_01 : OUT STD_LOGIC;
        CLK_OUT_DIV_02 : OUT STD_LOGIC;
        CLK_OUT_DIV_03 : OUT STD_LOGIC;
        CLK_OUT_DIV_04 : OUT STD_LOGIC
    );

修改后编译触发更多报错,错误信息如下:

** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(31): near "IN": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(32): near "IN": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(35): near "OUT": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(36): near "OUT": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(37): near "OUT": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(38): near "OUT": (vcom-1576) expecting STRING or IDENTIFIER or << or '('.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(47): (vcom-1136) Unknown identifier "CLK".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(48): (vcom-1136) Unknown identifier "RST".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(49): (vcom-1136) Unknown identifier "CLK_OUT_DIV_01".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(50): (vcom-1136) Unknown identifier "CLK_OUT_DIV_02".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(51): (vcom-1136) Unknown identifier "CLK_OUT_DIV_03".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(52): (vcom-1136) Unknown identifier "CLK_OUT_DIV_04".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(58): Illegal target for signal assignment.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(58): (vcom-1136) Unknown identifier "CLK".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(60): Illegal target for signal assignment.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(60): (vcom-1136) Unknown identifier "CLK".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(68): Illegal target for signal assignment.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(68): (vcom-1136) Unknown identifier "reset".
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(70): Illegal target for signal assignment.
** Error: D:\modelsim\week 2\ClockDivider_tb.vhd(70): (vcom-1136) Unknown identifier "reset". 

错误原因分析

删除第一个分号的操作本身是正确的,后续大量报错不是该修改导致的,而是代码中原本存在的其他语法错误,在第一个语法阻塞点被打通后全部暴露,具体问题点如下:

  • 初始的第27行报错:组件声明的端口列表中,最后一个端口CLK_OUT_DIV_04后多余的分号违反VHDL语法,端口列表内的端口声明用分号分隔,最后一个端口后不能加分号。
  • 信号声明处的IN/OUT相关报错:只有entity对外端口、component端口声明时才需要指定IN/OUT方向,architecture内部定义的signal是局部信号,没有方向属性,添加IN/OUT关键字属于非法语法,直接导致编译器无法正确识别这些信号定义。
  • 连锁的Unknown identifier报错:由于前面的信号声明语法非法,编译器没有成功注册CLK、RST、各分频输出信号,后续所有引用这些信号的位置都会报找不到标识符。
  • reset相关报错:代码中声明的复位信号名为RST,激励进程中错误使用了未定义的reset标识符,属于拼写/命名不匹配错误。

修复方案

按以下步骤修改即可正常编译:

  1. 保留之前的正确修改:删除组件端口列表最后一个端口后的多余分号
  2. 删除所有architecture内部signal声明语句中的IN/OUT方向关键字,局部信号只需要指定数据类型
  3. 将激励进程中所有reset替换为已定义的RST

修复后的完整可编译代码如下:

library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_STD.all;

entity CLOCKDIVIDER_TB is
end entity CLOCKDIVIDER_TB;

architecture BENCH of CLOCKDIVIDER_TB is

--declare component
component ClockDivider
    Port(
        CLK            : IN STD_LOGIC;   
        RST            : IN STD_LOGIC;
        CLK_OUT_DIV_01 : OUT STD_LOGIC;
        CLK_OUT_DIV_02 : OUT STD_LOGIC;
        CLK_OUT_DIV_03 : OUT STD_LOGIC;
        CLK_OUT_DIV_04 : OUT STD_LOGIC
    );
end component;

--inputs 局部信号不需要加方向
signal CLK            : STD_LOGIC := '0';   
signal RST            : STD_LOGIC := '0';

--outputs 局部信号不需要加方向  
signal CLK_OUT_DIV_01 : STD_LOGIC;
signal CLK_OUT_DIV_02 : STD_LOGIC;
signal CLK_OUT_DIV_03 : STD_LOGIC;
signal CLK_OUT_DIV_04 : STD_LOGIC;

--clock period
constant clk_t : time := 20 ns;

BEGIN

--uut instance
uut: ClockDivider PORT MAP (
    CLK  => CLK,
    RST  => RST,
    CLK_OUT_DIV_01 => CLK_OUT_DIV_01,
    CLK_OUT_DIV_02 => CLK_OUT_DIV_02,
    CLK_OUT_DIV_03 => CLK_OUT_DIV_03,
    CLK_OUT_DIV_04 => CLK_OUT_DIV_04
);

  -- Clock definition.
clk_process: process
begin
    CLK <= '0';
    wait for clk_t / 2;
    CLK <= '1';
    wait for clk_t / 2;
end process;

-- Processing.
stim_proc: process
begin
    wait for 100 ns;
    RST <= '1'; -- 修正信号名
    wait for 100 ns;
    RST <= '0'; -- 修正信号名
    wait;
end process;

end architecture BENCH;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:39:20