]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/tumbl.git/blobdiff - hw/mem.vhd
Attempt to fix forward from memory read to write over when Tumbl is being to stop.
[fpga/lx-cpu1/tumbl.git] / hw / mem.vhd
index 411e069fd7073f3d8ed124df8f2dc432b7d240f9..18417293711bfec7abaf1c8a9b9c5f886e60f9ed 100644 (file)
@@ -54,7 +54,8 @@ BEGIN
        MEM_WRB_o.wrb_Action <= MEM_REG_i.wrb_Action;
        MEM_WRB_o.wrix_rD    <= MEM_REG_i.wrix_rD;
        -- also signal 'slow memory decices' and interrupts from devices
-       MEM2CTRL_o.clken <= DMEMB_i.clken;
+       MEM2CTRL_o.bus_taken <= '0' WHEN EX2MEM_i.mem_Action = NO_MEM ELSE DMEMB_i.bus_taken;
+       MEM2CTRL_o.bus_wait  <= '0' WHEN EX2MEM_i.mem_Action = NO_MEM ELSE DMEMB_i.bus_wait;
        MEM2CTRL_o.int   <= DMEMB_i.int;
 
 p_mem:
@@ -75,6 +76,9 @@ p_mem:
                        WHEN OTHERS => dmem_data_v :=              DMEMB_i.data;
                END CASE;
 
+               MEM2CTRL_o.read_data <= dmem_data_v;
+               MEM2CTRL_o.need_keep <= '0';
+
                -- output to dmem-bus
                CASE EX2MEM_i.mem_Action IS
 
@@ -93,6 +97,7 @@ p_mem:
                                                WHEN OTHERS  =>
                                                        -- forward mem_data just read, to handle e.g. lhu rD,mem[x]; sh rD,mem[y]; ...
                                                        exeq_data_v := dmem_data_v;
+                                                       MEM2CTRL_o.need_keep <= '1';
                                        END CASE;
                                ELSE
                                        exeq_data_v := EX2MEM_i.data_rD;