aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/issue376/util.vhdl
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/issue376/util.vhdl')
-rw-r--r--testsuite/gna/issue376/util.vhdl191
1 files changed, 191 insertions, 0 deletions
diff --git a/testsuite/gna/issue376/util.vhdl b/testsuite/gna/issue376/util.vhdl
new file mode 100644
index 000000000..94100ce8f
--- /dev/null
+++ b/testsuite/gna/issue376/util.vhdl
@@ -0,0 +1,191 @@
+library ieee ;
+ use ieee.std_logic_1164.all ;
+
+library std;
+ use std.textio.all;
+
+
+-- Utility package
+package util is
+
+ procedure nop( signal clock : in std_logic ; count : in natural ) ;
+
+end package ;
+
+package body util is
+
+ procedure nop( signal clock : in std_logic ; count : in natural ) is
+ begin
+ for i in 1 to count loop
+ wait until rising_edge( clock ) ;
+ end loop ;
+ end procedure ;
+
+end package body ;
+
+library ieee ;
+ use ieee.std_logic_1164.all ;
+ use ieee.numeric_std.all;
+library std;
+ use std.textio.all;
+
+
+entity data_saver is
+ generic(
+ FILENAME : string := "file.dat";
+ DATA_WIDTH : natural := 16
+ );
+ port(
+ reset : in std_logic;
+ clock : in std_logic;
+ data : std_logic_vector(DATA_WIDTH-1 downto 0);
+ data_valid : std_logic
+ );
+end entity;
+
+
+architecture arch of data_saver is
+begin
+
+ handler : process
+ FILE fp : text;
+ variable line_data : line;
+ begin
+ --
+ wait until falling_edge(reset);
+
+ file_open(fp, FILENAME, WRITE_MODE);
+
+ while (reset = '0') loop
+ wait until rising_edge(data_valid);
+ write(line_data, data);
+ writeline(fp,line_data);
+ end loop;
+ file_close(fp);
+ end process;
+end architecture;
+
+
+library ieee ;
+ use ieee.std_logic_1164.all ;
+ use ieee.numeric_std.all;
+library std;
+ use std.textio.all;
+
+
+entity signed_saver is
+ generic(
+ FILENAME : string := "file.dat";
+ DATA_WIDTH : natural := 16
+ );
+ port(
+ reset : in std_logic;
+ clock : in std_logic;
+ data : signed(DATA_WIDTH-1 downto 0);
+ data_valid : std_logic
+ );
+end entity;
+
+
+architecture arch of signed_saver is
+begin
+
+ handler : process
+ FILE fp : text;
+ variable line_data : line;
+ begin
+ --
+ wait until falling_edge(reset);
+
+ file_open(fp, FILENAME, WRITE_MODE);
+
+ while (reset = '0') loop
+ wait until rising_edge(clock);
+
+ if data_valid = '1' then
+ write(line_data, (to_integer(data)));
+ writeline(fp,line_data);
+ end if;
+ end loop;
+ file_close(fp);
+ end process;
+end architecture;
+
+
+
+library ieee ;
+ use ieee.std_logic_1164.all ;
+ use ieee.numeric_std.all;
+library std;
+ use std.textio.all;
+
+
+entity data_reader is
+ generic(
+ FILENAME : string := "file.dat";
+ DATA_WIDTH : natural := 16
+ );
+ port(
+ reset : in std_logic;
+ clock : in std_logic;
+ data_request : in std_logic;
+ data : out std_logic_vector(DATA_WIDTH-1 downto 0);
+ data_valid : out std_logic
+ );
+end entity;
+
+
+architecture arch of data_reader is
+
+ type character_array_t is array (natural range <>) of character;
+begin
+
+ handler : process
+ variable line_data : line;
+ variable tmp : integer;
+ variable c : character;--_array_t(0 to 3);
+
+ type bin_t is file of character ;
+ file fp : bin_t ;
+ variable fs : file_open_status ;
+ begin
+ --
+ data <= (others => '0');
+ data_valid <= '0';
+ wait until falling_edge(reset);
+
+ file_open(fs, fp, FILENAME, READ_MODE);
+
+ if( fs /= OPEN_OK ) then
+ report "File open issues" severity failure ;
+ end if ;
+
+ --readline(fp,line_data);
+ while (reset = '0') loop
+
+ wait until rising_edge(clock);
+ data_valid <= '0';
+
+ if data_request = '1' then
+ read(fp, c);
+ tmp := integer(natural(character'pos(c)));
+ data(7 downto 0) <= std_logic_vector(to_unsigned(tmp,8));
+ read(fp, c);
+ tmp := integer(natural(character'pos(c)));
+ data(15 downto 8) <= std_logic_vector(to_unsigned(tmp,8));
+ read(fp, c);
+ tmp := integer(natural(character'pos(c)));
+ data(23 downto 16) <= std_logic_vector(to_unsigned(tmp,8));
+ read(fp, c);
+ tmp := integer(natural(character'pos(c)));
+ data(31 downto 24) <= std_logic_vector(to_unsigned(tmp,8));
+
+ data_valid <= '1';
+ wait until rising_edge(clock);
+ data_valid <= '0';
+ end if;
+
+ end loop;
+ file_close(fp);
+ end process;
+end architecture;