clk : in std_ulogic;
l_in : in Decode2ToLoadstore1Type;
+
l_out : out Loadstore1ToLoadstore2Type
);
end loadstore1;
architecture behave of loadstore1 is
- signal l : Decode2ToLoadstore1Type;
+ signal r, rin : Loadstore1ToLoadstore2Type;
signal lsu_sum : std_ulogic_vector(63 downto 0);
begin
-- Calculate the address in the first cycle
- lsu_sum <= std_ulogic_vector(unsigned(l.addr1) + unsigned(l.addr2)) when l.valid = '1' else (others => '0');
+ lsu_sum <= std_ulogic_vector(unsigned(l_in.addr1) + unsigned(l_in.addr2)) when l_in.valid = '1' else (others => '0');
loadstore1_0: process(clk)
begin
if rising_edge(clk) then
- l <= l_in;
+ r <= rin;
end if;
end process;
loadstore1_1: process(all)
+ variable v : Loadstore1ToLoadstore2Type;
begin
- l_out.valid <= l.valid;
- l_out.load <= l.load;
- l_out.data <= l.data;
- l_out.write_reg <= l.write_reg;
- l_out.length <= l.length;
- l_out.byte_reverse <= l.byte_reverse;
- l_out.sign_extend <= l.sign_extend;
- l_out.update <= l.update;
- l_out.update_reg <= l.update_reg;
-
- l_out.addr <= lsu_sum;
+ v := r;
+
+ v.valid := l_in.valid;
+ v.load := l_in.load;
+ v.data := l_in.data;
+ v.write_reg := l_in.write_reg;
+ v.length := l_in.length;
+ v.byte_reverse := l_in.byte_reverse;
+ v.sign_extend := l_in.sign_extend;
+ v.update := l_in.update;
+ v.update_reg := l_in.update_reg;
+
+ v.addr := lsu_sum;
+
+ -- Update registers
+ rin <= v;
+
+ -- Update outputs
+ l_out <= v;
end process;
end;