Merge pull request #18 from mikey/verific
[microwatt.git] / writeback.vhdl
1 library ieee;
2 use ieee.std_logic_1164.all;
3
4 library work;
5 use work.common.all;
6
7 entity writeback is
8 port (
9 clk : in std_ulogic;
10
11 e_in : in Execute2ToWritebackType;
12 l_in : in Loadstore2ToWritebackType;
13 m_in : in MultiplyToWritebackType;
14
15 w_out : out WritebackToRegisterFileType;
16 c_out : out WritebackToCrFileType;
17
18 complete_out : out std_ulogic
19 );
20 end entity writeback;
21
22 architecture behaviour of writeback is
23 signal e : Execute2ToWritebackType;
24 signal l : Loadstore2ToWritebackType;
25 signal m : MultiplyToWritebackType;
26 signal w_tmp : WritebackToRegisterFileType;
27 signal c_tmp : WritebackToCrFileType;
28 begin
29 writeback_0: process(clk)
30 begin
31 if rising_edge(clk) then
32 e <= e_in;
33 l <= l_in;
34 m <= m_in;
35 end if;
36 end process;
37
38 w_out <= w_tmp;
39 c_out <= c_tmp;
40
41 complete_out <= '1' when e.valid or l.valid or m.valid else '0';
42
43 writeback_1: process(all)
44 begin
45 --assert (unsigned(w.valid) + unsigned(l.valid) + unsigned(m.valid)) <= 1;
46 --assert not(w.write_enable = '1' and l.write_enable = '1');
47
48 w_tmp <= WritebackToRegisterFileInit;
49 c_tmp <= WritebackToCrFileInit;
50
51 if e.valid = '1' then
52 if e.write_enable = '1' then
53 w_tmp.write_reg <= e.write_reg;
54 w_tmp.write_data <= e.write_data;
55 w_tmp.write_enable <= '1';
56 end if;
57
58 if e.write_cr_enable = '1' then
59 report "Writing CR ";
60 c_tmp.write_cr_enable <= '1';
61 c_tmp.write_cr_mask <= e.write_cr_mask;
62 c_tmp.write_cr_data <= e.write_cr_data;
63 end if;
64 end if;
65
66 if l.valid = '1' and l.write_enable = '1' then
67 w_tmp.write_reg <= l.write_reg;
68 w_tmp.write_data <= l.write_data;
69 w_tmp.write_enable <= '1';
70 end if;
71 if l.valid = '1' and l.write_enable2 = '1' then
72 w_tmp.write_reg2 <= l.write_reg2;
73 w_tmp.write_data2 <= l.write_data2;
74 w_tmp.write_enable2 <= '1';
75 end if;
76
77 if m.valid = '1' then
78 if m.write_reg_enable = '1' then
79 w_tmp.write_enable <= '1';
80 w_tmp.write_reg <= m.write_reg_nr;
81 w_tmp.write_data <= m.write_reg_data;
82 end if;
83 if m.write_cr_enable = '1' then
84 report "Writing CR ";
85 c_tmp.write_cr_enable <= '1';
86 c_tmp.write_cr_mask <= m.write_cr_mask;
87 c_tmp.write_cr_data <= m.write_cr_data;
88 end if;
89 end if;
90 end process;
91 end;