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标识符,属于拼写/命名不匹配错误。
修复方案
按以下步骤修改即可正常编译:
- 保留之前的正确修改:删除组件端口列表最后一个端口后的多余分号
- 删除所有architecture内部signal声明语句中的IN/OUT方向关键字,局部信号只需要指定数据类型
- 将激励进程中所有
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
相关产品推荐
相关产品推荐

