Studentenversion des ESY6/A Praktikums "signal_processing".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_task_add_rand.vhd 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. use ieee.float_pkg.all;
  5. library work;
  6. use work.reg32.all;
  7. use work.avalon_slave.all;
  8. use work.test_utility.all;
  9. use work.test_avalon_slave.all;
  10. use work.task.all;
  11. use work.test_hardware_task.all;
  12. use work.test_data_channel_pkg.all;
  13. library std;
  14. use std.env.all;
  15. use std.textio.all;
  16. entity test_task_add_rand is
  17. generic( CHECK_RESULTS : boolean; GUI_MODE : boolean := false );
  18. end entity test_task_add_rand;
  19. architecture test of test_task_add_rand is
  20. procedure test_configure( signal clk : in std_logic;
  21. signal req : out work.avalon_slave.Request;
  22. signal rsp : in work.avalon_slave.Response ) is
  23. variable index : integer := 0;
  24. variable writedata : std_logic_vector( 31 downto 0 );
  25. begin
  26. std.textio.write( std.textio.OUTPUT, " test_configure ... " );
  27. index := 0;
  28. writedata := x"08000000"; -- 2^32 / 32
  29. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  30. index => index, config => writedata );
  31. index := 1;
  32. writedata := x"00000000";
  33. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  34. index => index, config => writedata );
  35. index := 2;
  36. writedata := x"40800000"; -- 2 ** 2 = 4 float
  37. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  38. index => index, config => writedata );
  39. std.textio.write( std.textio.OUTPUT, TEST_OK );
  40. end procedure test_configure;
  41. signal clk : std_logic := '0';
  42. signal reset : std_logic := '1';
  43. signal req : work.avalon_slave.Request;
  44. signal rsp : work.avalon_slave.Response;
  45. signal data_channel_req : work.avalon_slave.Request;
  46. signal data_channel_rsp : work.avalon_slave.Response;
  47. signal signal_a_read : std_logic;
  48. signal signal_a_readdata : std_logic_vector( 31 downto 0 );
  49. signal signal_b_read : std_logic;
  50. signal signal_b_readdata : std_logic_vector( 31 downto 0 );
  51. signal signal_write : std_logic;
  52. signal signal_writedata : std_logic_vector( 31 downto 0 );
  53. signal data_channel_read : std_logic;
  54. signal data_channel_readdata : std_logic_vector( 31 downto 0 );
  55. begin
  56. dut : entity work.task_add
  57. port map (
  58. clk => clk,
  59. reset => reset,
  60. address => req.address,
  61. read => req.read,
  62. readdata => rsp.readdata,
  63. write => req.write,
  64. writedata => req.writedata,
  65. signal_a_read => signal_a_read,
  66. signal_a_readdata => signal_a_readdata,
  67. signal_b_read => signal_b_read,
  68. signal_b_readdata => signal_b_readdata,
  69. signal_write => signal_write,
  70. signal_writedata => signal_writedata
  71. );
  72. u_data_channel : entity work.data_channel
  73. port map (
  74. clk => clk,
  75. reset => reset,
  76. ctrl_address => data_channel_req.address,
  77. ctrl_read => data_channel_req.read,
  78. ctrl_readdata => data_channel_rsp.readdata,
  79. ctrl_write => data_channel_req.write,
  80. ctrl_writedata => data_channel_req.writedata,
  81. hw_sink_write => signal_write,
  82. hw_sink_writedata => signal_writedata,
  83. hw_source_read => data_channel_read,
  84. hw_source_readdata => data_channel_readdata
  85. );
  86. clk <= not clk after 10 ns;
  87. reset_release : process is
  88. begin
  89. wait for 35 ns;
  90. reset <= '0';
  91. wait;
  92. end process reset_release;
  93. input_data_a_simulus: process is
  94. variable index : integer := 0;
  95. begin
  96. while true loop
  97. signal_a_readdata <= to_std_logic_vector( to_float( work.sine_cosine_data.expected( index ) ) );
  98. wait until rising_edge( signal_a_read );
  99. if ( index < 1023 ) then
  100. index := index + 1;
  101. end if;
  102. end loop;
  103. end process input_data_a_simulus;
  104. input_data_b_simulus: process is
  105. variable index : integer := 0;
  106. begin
  107. while true loop
  108. signal_b_readdata <= to_std_logic_vector( to_float( work.rand_data.expected( index ) ) );
  109. wait until rising_edge( signal_b_read );
  110. if ( index < 1023 ) then
  111. index := index + 1;
  112. end if;
  113. end loop;
  114. end process input_data_b_simulus;
  115. stimulus: process is
  116. variable data_channel_config : std_logic_vector( 31 downto 0 ) := x"00000001";
  117. begin
  118. std.textio.write( std.textio.OUTPUT, "--------------------------------------------------------------------------------" & LF );
  119. std.textio.write( std.textio.OUTPUT, "Starting test_task_add_rand" & LF );
  120. wait until falling_edge( reset );
  121. wait until falling_edge( clk );
  122. work.test_data_channel_pkg.write_and_assert_config( clk => clk,
  123. req => data_channel_req,
  124. rsp => data_channel_rsp,
  125. config => data_channel_config );
  126. test_configure( clk => clk, req => req, rsp => rsp );
  127. test_execute( clk => clk, req => req, rsp => rsp,
  128. write => signal_write, writedata => signal_writedata );
  129. for i in 0 to 10 loop
  130. wait until falling_edge( clk );
  131. end loop;
  132. if ( CHECK_RESULTS ) then
  133. check_and_write_content( clk => clk,
  134. req => data_channel_req, rsp => data_channel_rsp,
  135. expected => work.add_rand_data.expected );
  136. else
  137. write_content( clk => clk,
  138. req => data_channel_req, rsp => data_channel_rsp );
  139. end if;
  140. if ( GUI_MODE ) then
  141. std.env.stop;
  142. else
  143. std.env.finish;
  144. end if;
  145. end process stimulus;
  146. end architecture test;