@ -9,7 +9,7 @@ use work.common.all;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				entity core_debug is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    generic (
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        -- Length of log buffer
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        LOG_LENGTH : positive := 2048
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        LOG_LENGTH : natural := 512
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        );
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    port (
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        clk          : in std_logic;
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -92,6 +92,8 @@ architecture behave of core_debug is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    constant DBG_CORE_LOG_ADDR       : std_ulogic_vector(3 downto 0) := "0110";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    constant DBG_CORE_LOG_DATA       : std_ulogic_vector(3 downto 0) := "0111";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    constant LOG_INDEX_BITS : natural := log2(LOG_LENGTH);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    -- Some internal wires
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal stat_reg : std_ulogic_vector(63 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -104,38 +106,12 @@ architecture behave of core_debug is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal do_gspr_rd   : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal gspr_index   : gspr_index_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    -- Logging RAM
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    constant LOG_INDEX_BITS : natural := log2(LOG_LENGTH);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    subtype log_ptr_t is unsigned(LOG_INDEX_BITS - 1 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    type log_array_t is array(0 to LOG_LENGTH - 1) of std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_array    : log_array_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_rd_ptr   : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_wr_ptr   : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_toggle   : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_wr_enable : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_rd_ptr_latched : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_rd       : std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_addr : std_ulogic_vector(31 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_data : std_ulogic_vector(63 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_addr : std_ulogic_vector(31 downto 0) := (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_data : std_ulogic_vector(63 downto 0) := (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal do_dmi_log_rd : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_reading : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal log_dmi_read_done : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal dmi_read_log_data : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    signal dmi_read_log_data_1 : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    function select_dword(data : std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                          addr : std_ulogic_vector(31 downto 0)) return std_ulogic_vector is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        variable firstbit : integer;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        firstbit := to_integer(unsigned(addr(1 downto 0))) * 64;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return data(firstbit + 63 downto firstbit);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    end;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    attribute ram_style : string;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    attribute ram_style of log_array : signal is "block";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    attribute ram_decomp : string;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    attribute ram_decomp of log_array : signal is "power";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				       -- Single cycle register accesses on DMI except for GSPR data
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    dmi_ack <= dmi_req when dmi_addr /= DBG_CORE_GSPR_DATA
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -241,6 +217,34 @@ begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    icache_rst <= do_icreset;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    terminated_out <= terminated;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    -- Logging RAM
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    maybe_log: if LOG_LENGTH > 0 generate
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        subtype log_ptr_t is unsigned(LOG_INDEX_BITS - 1 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        type log_array_t is array(0 to LOG_LENGTH - 1) of std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_array    : log_array_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_rd_ptr   : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_wr_ptr   : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_toggle   : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_wr_enable : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_rd_ptr_latched : log_ptr_t;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_rd       : std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_dmi_reading : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        signal log_dmi_read_done : std_ulogic;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        function select_dword(data : std_ulogic_vector(255 downto 0);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                              addr : std_ulogic_vector(31 downto 0)) return std_ulogic_vector is
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            variable firstbit : integer;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            firstbit := to_integer(unsigned(addr(1 downto 0))) * 64;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            return data(firstbit + 63 downto firstbit);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        end;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        attribute ram_style : string;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        attribute ram_style of log_array : signal is "block";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        attribute ram_decomp : string;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        attribute ram_decomp of log_array : signal is "power";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        -- Use MSB of read addresses to stop the logging
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_wr_enable <= not (log_read_addr(31) or log_dmi_addr(31));
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -286,5 +290,13 @@ begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_write_addr(LOG_INDEX_BITS - 1 downto 0) <= std_ulogic_vector(log_wr_ptr);
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_write_addr(LOG_INDEX_BITS) <= '1';
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_write_addr(31 downto LOG_INDEX_BITS + 1) <= (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    end generate;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    no_log: if LOG_LENGTH = 0 generate
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    begin
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_read_data <= (others => '0');
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        log_write_addr <= x"00000001";
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    end generate;
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				end behave;