我在SR FF的测试平台中发现了这个错误。 当我在终端中使用GHDL编译它时,它显示错误
;预期而不是''
我只是一个初学者,所以我找不到错误。 谁能帮帮我吗?
library ieee;
use ieee.std_logic_1164.all;
entity SR_tb is
end SR_tb;
architecture behavioral of SR_FF is
component SR_FF is
port (S,R,CLOCK:in std_logic;
Q,QBAR:out std_logic);
end component;
signal clock,s,r,q,qbar: std_logic;
constant clock_period : time := 10 ns;
begin
port_map:SR_FF port map (clock=>CLOCK,s=>S,r=>R,q=>Q,qbar=>QBAR);
clock_process:process
begin
clock <='0';
wait for clock_period/2;
clock <= '1';
wait for clock period/2;
end process;
stim_proc:process
begin
s<= '0';
r<= '0';
wait for 50 ns;
s<= '0';
r<= '1';
wait for 50 ns;
s<= '1';
r<= '0';
wait for 50 ns;
s<= '1';
r<= '1';
wait for 50 ns;
assert false report "reached end of test";
wait;
end process;
end behavioral;
您的代码中有两个初始错误,它们在语法分析期间发生:
ghdl -a sr_tb.vhdl sr_tb.vhdl:22:22:错误:缺少“;”在声明结束时 sr_tb.vhdl:22:28:错误:“<=”或“:=”预期而不是'/' ghdl:错误:编译错误
第22行是clock_process进程中的最后一个wait语句:
wait for clock period/2;
常量被声明为clock_period
,你把它变成了两个独立的标识符,clock
和period
。在wait语句的语法中没有连续标识符的期望(请注意错误语句中的差异,这是ghdl-0.36的预发布,当多个原因发生语法错误时,他们倾向于在他们不知道时进行推广)覆盖所有事件)。假设在clock
之后缺少一个分号来终止等待语句。 period
语法上将成为以下声明的一部分。
修复最后一个等待语句:
wait for clock_period/2; -- WAS clock period/2;
揭示了一个额外的语义问题:
ghdl -a sr_tb.vhdl sr_tb.vhdl:7:14:错误:未分析实体'sr_ff'
出现此错误是因为您没有提供sr_ff
实体。如果它已经被分析到目标库中,那么由于架构中的实体名称错误,错误会更加广泛:
architecture behavioral of SR_FF is
错误:
ghdl -a sr_tb.vhdl sr_tb.vhdl:12:8:错误:标识符“clock”已用于声明 sr_ff.vhdl:5:16:错误:上一个声明:端口“时钟” sr_tb.vhdl:12:14:错误:标识符“s”已用于声明 sr_ff.vhdl:5:12:错误:上一个声明:port“s” sr_tb.vhdl:12:16:错误:标识符“r”已用于声明 sr_ff.vhdl:5:14:错误:上一个声明:端口“r” sr_tb.vhdl:12:18:错误:标识符“q”已用于声明 sr_ff.vhdl:6:5:错误:上一个声明:端口“q” sr_tb.vhdl:12:20:错误:标识符“qbar”已用于声明 sr_ff.vhdl:6:7:错误:上一个声明:端口“qbar” sr_tb.vhdl:19:7:错误:无法分配端口“时钟” sr_tb.vhdl:21:7:错误:无法分配端口“时钟” sr_tb.vhdl:26:8:错误:无法分配端口“s” sr_tb.vhdl:27:9:错误:无法分配端口“r” sr_tb.vhdl:29:9:错误:无法分配端口“s” sr_tb.vhdl:30:9:错误:无法分配端口“r” sr_tb.vhdl:32:9:错误:无法分配端口“s” sr_tb.vhdl:33:9:错误:无法分配端口“r” sr_tb.vhdl:35:9:错误:无法分配端口“s” sr_tb.vhdl:36:9:错误:无法分配端口“r” ghdl:错误:编译错误
这些都是由(重新)分析behavioral
的架构SR_FF
并找到已经声明的标识符引起的。实体和体系结构声明占用相同的声明区域,并且这些信号名称已在(错误)实体中声明为端口。
在这两种情况下,固化都是一样的。在testbench规范中,您应该引用testbench实体名称:
architecture behavioral of SR_tb is -- WAS SR_FF is
所有来自空间应该是架构规范中的下划线('_'
)和错误的实体名称。修复这两个并且ghdl不会产生分析错误。通过对sr_ff
的实体和体系结构声明的分析,测试平台也进行了详细说明和模拟(注意你用一个断言来表示刺激的结束,但是不要停止模拟,这可以用if语句用函数now
评估当前的模拟时间来完成在clock_process
或-2008使用包装stop
中的std.env
函数)。
值得注意的是,当在接口列表(这里是端口映射)中使用命名关联时,在复合分隔符=>
的左侧可以找到形式,而实际值在右侧列出。你对大写字母的使用暗示你试图以相反的方式做到这一点,将来可能会给你带来麻烦,因为形式和实际情况不同。