166 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| library ieee;
 | |
| use ieee.std_logic_1164.all;
 | |
| use ieee.numeric_std.all;
 | |
| use std.textio.all;
 | |
| 
 | |
| entity wave_test is
 | |
| end wave_test;
 | |
| 
 | |
| architecture rtl of wave_test is
 | |
| 
 | |
|   component wave is
 | |
|     port
 | |
|     (
 | |
|       -- AXI4 slave interface
 | |
|       aclk    : in std_logic;
 | |
|       aresetn : in std_logic;
 | |
| 
 | |
|       -- read addr
 | |
|       araddr  : in std_logic_vector(31 downto 0);
 | |
|       arvalid : in std_logic;
 | |
|       arready : out std_logic;
 | |
| 
 | |
|       -- read data
 | |
|       rdata   : out std_logic_vector(31 downto 0);
 | |
|       rresp   : out std_logic;
 | |
|       rvalid  : out std_logic;
 | |
|       rready  : in std_logic;
 | |
| 
 | |
|       -- write addr
 | |
|       awaddr  : in std_logic_vector(31 downto 0);
 | |
|       awvalid : in std_logic;
 | |
|       awready : out std_logic;
 | |
| 
 | |
|       -- write data
 | |
|       wdata   : in std_logic_vector(31 downto 0);
 | |
|       wstrb   : in std_logic_vector(3 downto 0);
 | |
| 
 | |
|       -- write resp
 | |
|       bresp   : out std_logic;
 | |
|       bvalid  : out std_logic;
 | |
|       bready  : in std_logic;
 | |
| 
 | |
| 
 | |
|       -- PDM output!
 | |
|       pdmout  : out std_logic
 | |
|     );
 | |
|   end component;
 | |
| 
 | |
|   signal finished, clk, rst, rstn: std_logic := '0';
 | |
| 
 | |
|   signal arvalid, arready, awvalid, awready: std_logic;
 | |
|   signal rresp, rvalid, rready, bresp, bvalid, bready: std_logic;
 | |
|   signal wstrb: std_logic_vector(3 downto 0);
 | |
|   signal araddr, rdata, awaddr, wdata: std_logic_vector(31 downto 0);
 | |
| 
 | |
|   signal pdmout: std_logic;
 | |
| 
 | |
|   constant period: integer := 7 * 256;
 | |
|   constant half_time: time := 1280 ns * period;
 | |
| 
 | |
| begin
 | |
|   rstn <= not rst;
 | |
|   dut: wave port map(aclk => clk, aresetn => rstn,
 | |
|   arvalid => arvalid, arready => arready, awvalid => awvalid, awready => awready,
 | |
|   rresp => rresp, rvalid => rvalid, rready => rready, bresp => bresp, bvalid => bvalid, bready => bready,
 | |
|   wstrb => wstrb, araddr => araddr, rdata => rdata, awaddr => awaddr, wdata => wdata,
 | |
|   pdmout => pdmout
 | |
|                     );
 | |
| 
 | |
|   -- tick tock
 | |
|   process
 | |
|   begin
 | |
|     if finished = '0' then
 | |
|       clk <= not clk;
 | |
|       wait for 5 ns;
 | |
|     else
 | |
|       clk <= '0';
 | |
|       wait;
 | |
|     end if;
 | |
|   end process;
 | |
| 
 | |
|   process
 | |
|   begin
 | |
|     rst <= '1';
 | |
| 
 | |
|     arvalid <= '0';
 | |
|     awvalid <= '0';
 | |
|     wstrb <= "0000";
 | |
| 
 | |
|     wait for 1 ns;
 | |
| --    assert(='0') report "Fail rst" severity error;
 | |
| 
 | |
|     rst <= '0';
 | |
| 
 | |
|     wait for 10 ns;
 | |
| 
 | |
|     awvalid <= '1';
 | |
|     awaddr <= x"00000000";  -- enable
 | |
|     wstrb <= "1111";
 | |
|     wdata <= x"00000001";
 | |
|     bready <= '1';
 | |
| 
 | |
|     wait for 10 ns;
 | |
|     assert(bvalid = '1') report "Write error" severity error;
 | |
|     assert(bresp = '0') report "Write fail" severity error;
 | |
|     assert(awready = '1') report "Write error" severity error;
 | |
| 
 | |
|     awaddr <= x"00000004";  -- period
 | |
|     wdata <= std_logic_vector(to_unsigned(period, 32));
 | |
| 
 | |
|     wait for 10 ns;
 | |
| 
 | |
|     -- read back
 | |
|     wstrb <= "0000";
 | |
|     awvalid <= '0';
 | |
|     arvalid <= '1';
 | |
|     araddr <= x"00000004";
 | |
|     rready <= '1';
 | |
| 
 | |
|     wait for 10 ns;
 | |
|     assert(unsigned(rdata) = period) report "Period readback failed" severity error;
 | |
| 
 | |
|     arvalid <= '0';
 | |
|     awvalid <= '1';
 | |
|     wstrb <= "1111";
 | |
| 
 | |
|     awaddr <= x"00000008"; -- high
 | |
|     wdata <= x"00008000";
 | |
| 
 | |
|     wait for 10 ns;
 | |
| 
 | |
|     awaddr <= x"0000000c"; -- low
 | |
|     wdata <= x"00004000";
 | |
| 
 | |
|     wait for 10 ns;
 | |
| 
 | |
|     wstrb <= "0000";
 | |
|     awvalid <= '0';
 | |
| 
 | |
|     wait for 30 ns;
 | |
|     assert(pdmout = '1') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '0') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '0') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '1') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '0') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '0') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '0') report "wrong pdmout" severity error;
 | |
|     wait for 10 ns;
 | |
|     assert(pdmout = '1') report "wrong pdmout" severity error;
 | |
| 
 | |
|     wait for 100 us;
 | |
| 
 | |
|     assert false report "Test done." severity note;
 | |
| 
 | |
|     finished <= '1';
 | |
|     wait;
 | |
| 
 | |
|   end process;
 | |
| end rtl;
 |