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;
 |