每次 clk128_tb 发生事件并发现等于“1”时,问题代码都会打开和关闭文件。
一个以问题过程为核心的最小、完整和可验证的示例:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
entity color_out is
end entity;
architecture foo of color_out is
signal clk128_tb: std_logic := '0';
signal color_out_v: std_logic := '0';
type pixel is record
R: unsigned (7 downto 0);
G: unsigned (7 downto 0);
B: unsigned (7 downto 0);
end record;
type scan is array (0 to 3) of pixel;
signal color_out: scan := ( (X"FF", X"A0", X"FF"),
(X"7F", X"7F", X"7F"),
(X"00", X"FF", X"00"),
(X"C0", X"C0", X"C0") );
begin
Verify_data_process :
process
variable my_line: line;
file l_file: TEXT; -- open write_mode is "color_out.txt";
constant header: string := " R G B";
variable file_is_open: boolean;
begin -- process
if not file_is_open then
file_open (l_file, "color_out.txt", write_mode);
file_is_open := true;
-- print(l_file, "R G B" );
write(my_line, header);
writeline(l_file, my_line);
end if;
wait until rising_edge(clk128_tb ); -- wait until clk128_tb = '1';
-- print(l_file, "R G B" );
if color_out_v = '1' then
report "Color_out";
write(my_line, integer'image(to_integer(color_out(0).R)) & " ");
write(my_line, integer'image(to_integer(color_out(0).G)) & " ");
write(my_line, integer'image(to_integer(color_out(0).B)));
writeline(l_file, my_line);
report "write line";
end if;
-- file_close(l_file);
end process;
CLOCK:
process
begin
wait for 10 ns;
clk128_tb <= not clk128_tb;
if now > 100 ns then
wait;
end if;
end process;
STIMULIS:
process
begin
wait for 20 ns;
color_out_v <= '1';
wait;
end process;
end architecture;
更改包括仅打开文件一次而不是显式关闭它。当模拟结束时文件将被隐式关闭,或者如果提供了敏感度列表,则可以向进程传递信号以显式关闭文件。例如,当 now = TIME'HIGH 时,可以向该信号提供交易。
也没有名为 print 的过程,它已被一个常量标题字符串替换为写入行缓冲区和写入行。请注意,这仅在打开文件时发生一次。
使用rising_edge 函数是习惯的力量。如果没有 MCVe,代码会自然增长。
正如 A. Kieffer 所评论的那样,使用整数'图像以及一些添加的格式空间作为答案。行是对字符串的访问(指针),您将字符串写入一行。
运行时,上面给出了控制台输出:
ghdl -r color_out
color_out.vhdl:45:13:@30ns:(report note): color_out
color_out.vhdl:50:13:@30ns:(report note): 写行
color_out.vhdl:45:13:@50ns: (report note): Color_out
color_out.vhdl:50:13:@50ns:(report note): write line
color_out.vhdl:45:13:@70ns:(report note): Color_out
color_out.vhdl:50:13:@ 70ns:(report note): 写行
color_out.vhdl:45:13:@90ns:(report note): Color_out
color_out.vhdl:50:13:@90ns:(report note): write line
color_out.vhdl:45: 13:@110ns:(report note): Color_out
color_out.vhdl:50:13:@110ns:(report note): write line
文件 color_out.txt 包含:
R G B
255 160 255
255 160 255
255 160 255
255 160 255
255 160 255
当 color_out_v = '1' 时,每个上升沿事件的一组像素值。并且使用本地静态索引 0,它们始终是相同的像素。
所以问题是每次唤醒进程时重复打开和关闭文件。
文件关闭后的 file_open 具有清除文件内容的效果,您不会有任何结果。
参见 IEEE Std 1076-2008 5.5.2 文件操作第 2 段(摘录):
— 如果提供给 Open_Kind 参数的值是 WRITE_MODE,则文件对象的访问模式是只写的。此外,外部文件最初为空。写入文件对象的值按照写入的顺序放置在外部文件中。