wishbone_debug_master: Fix address auto-increment for memory writes
authorPaul Mackerras <paulus@ozlabs.org>
Thu, 30 Apr 2020 23:00:21 +0000 (09:00 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Wed, 6 May 2020 21:53:38 +0000 (07:53 +1000)
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
wishbone_debug_master.vhdl

index 11b9ee3d731354c5001aec2c60ba648e5210b82f..ddf692386c1493694e60a4939ded03e2e68fdf2c 100644 (file)
@@ -49,6 +49,7 @@ architecture behaviour of wishbone_debug_master is
     
     type state_t is (IDLE, WB_CYCLE, DMI_WAIT);
     signal state : state_t;
+    signal do_inc : std_ulogic;
 
 begin
 
@@ -84,16 +85,16 @@ begin
                reg_addr <= (others => '0');
                reg_ctrl <= (others => '0');
            else            -- Standard register writes
-               if dmi_req and dmi_wr then
+                if do_inc = '1' then
+                   -- Address register auto-increment
+                   reg_addr <= std_ulogic_vector(unsigned(reg_addr) +
+                                                 decode_autoinc(reg_ctrl(10 downto 9)));
+                elsif dmi_req and dmi_wr then
                    if dmi_addr = DBG_WB_ADDR then
                        reg_addr <= dmi_din;
                    elsif dmi_addr = DBG_WB_CTRL then
                        reg_ctrl <= dmi_din(10 downto 0);
                    end if;
-                elsif state = WB_CYCLE and (wb_in.ack and reg_ctrl(8))= '1'  then
-                   -- Address register auto-increment
-                   reg_addr <= std_ulogic_vector(unsigned(reg_addr) +
-                                                 decode_autoinc(reg_ctrl(10 downto 9)));
                end if;
            end if;
        end if;
@@ -145,6 +146,7 @@ begin
            if (rst) then
                state <= IDLE;
                wb_out.stb <= '0';
+                do_inc <= '0';
            else
                case state is
                when IDLE =>
@@ -162,11 +164,13 @@ begin
                        --
                        wb_out.stb <= '0';
                        state <= DMI_WAIT;
+                        do_inc <= reg_ctrl(8);
                    end if;
                when DMI_WAIT =>
                    if dmi_req = '0' then
                        state <= IDLE;
                    end if;
+                    do_inc <= '0';
                end case;
            end if;
        end if;