2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
12 e_in : in Execute2ToWritebackType;
13 l_in : in Loadstore2ToWritebackType;
14 m_in : in MultiplyToWritebackType;
16 w_out : out WritebackToRegisterFileType;
17 c_out : out WritebackToCrFileType;
19 complete_out : out std_ulogic
23 architecture behaviour of writeback is
24 type reg_internal_type is record
25 complete : std_ulogic;
27 type reg_type is record
28 w : WritebackToRegisterFileType;
29 c : WritebackToCrFileType;
31 signal r, rin : reg_type;
32 signal r_int, rin_int : reg_internal_type;
34 writeback_0: process(clk)
36 if rising_edge(clk) then
42 writeback_1: process(all)
43 variable x: std_ulogic_vector(0 downto 0);
44 variable y: std_ulogic_vector(0 downto 0);
45 variable z: std_ulogic_vector(0 downto 0);
46 variable v : reg_type;
47 variable v_int : reg_internal_type;
55 assert (to_integer(unsigned(x)) + to_integer(unsigned(y)) + to_integer(unsigned(z))) <= 1 severity failure;
57 x := "" & e_in.write_enable;
58 y := "" & l_in.write_enable;
59 z := "" & m_in.write_reg_enable;
60 assert (to_integer(unsigned(x)) + to_integer(unsigned(y)) + to_integer(unsigned(z))) <= 1 severity failure;
62 assert not(e_in.write_cr_enable = '1' and m_in.write_cr_enable = '1');
64 v.w := WritebackToRegisterFileInit;
65 v.c := WritebackToCrFileInit;
67 v_int.complete := '0';
68 if e_in.valid = '1' or l_in.valid = '1' or m_in.valid = '1' then
69 v_int.complete := '1';
72 if e_in.write_enable = '1' then
73 v.w.write_reg := e_in.write_reg;
74 v.w.write_data := e_in.write_data;
75 v.w.write_enable := '1';
78 if e_in.write_cr_enable = '1' then
79 v.c.write_cr_enable := '1';
80 v.c.write_cr_mask := e_in.write_cr_mask;
81 v.c.write_cr_data := e_in.write_cr_data;
84 if l_in.write_enable = '1' then
85 v.w.write_reg := l_in.write_reg;
86 v.w.write_data := l_in.write_data;
87 v.w.write_enable := '1';
90 if m_in.write_reg_enable = '1' then
91 v.w.write_enable := '1';
92 v.w.write_reg := m_in.write_reg_nr;
93 v.w.write_data := m_in.write_reg_data;
96 if m_in.write_cr_enable = '1' then
97 v.c.write_cr_enable := '1';
98 v.c.write_cr_mask := m_in.write_cr_mask;
99 v.c.write_cr_data := m_in.write_cr_data;
107 complete_out <= r_int.complete;