forked from cores/microwatt
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.6 KiB
VHDL
66 lines
1.6 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
library work;
|
|
use work.common.all;
|
|
|
|
entity cr_file is
|
|
port(
|
|
clk : in std_logic;
|
|
|
|
d_in : in Decode2ToCrFileType;
|
|
d_out : out CrFileToDecode2Type;
|
|
|
|
w_in : in WritebackToCrFileType
|
|
);
|
|
end entity cr_file;
|
|
|
|
architecture behaviour of cr_file is
|
|
signal crs : std_ulogic_vector(31 downto 0) := (others => '0');
|
|
begin
|
|
-- synchronous writes
|
|
cr_write_0: process(clk)
|
|
variable hi, lo : integer := 0;
|
|
begin
|
|
if rising_edge(clk) then
|
|
if w_in.write_cr_enable = '1' then
|
|
report "Writing " & to_hstring(w_in.write_cr_data) & " to CR mask " & to_hstring(w_in.write_cr_mask);
|
|
|
|
for i in 0 to 7 loop
|
|
if w_in.write_cr_mask(i) = '1' then
|
|
lo := i*4;
|
|
hi := lo + 3;
|
|
crs(hi downto lo) <= w_in.write_cr_data(hi downto lo);
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
end if;
|
|
end process cr_write_0;
|
|
|
|
-- asynchronous reads
|
|
cr_read_0: process(all)
|
|
variable hi, lo : integer := 0;
|
|
begin
|
|
--lo := (7-d_in.read_cr_nr_1)*4;
|
|
--hi := lo + 3;
|
|
|
|
--report "read " & integer'image(d_in.read_cr_nr_1) & " from CR " & to_hstring(crs(hi downto lo));
|
|
--d_out.read_cr_data_1 <= crs(hi downto lo);
|
|
|
|
-- Also return the entire CR to make mfcrf easier for now
|
|
report "read CR " & to_hstring(crs);
|
|
d_out.read_cr_data <= crs;
|
|
|
|
-- -- Forward any written data
|
|
-- if w_in.write_cr_enable = '1' then
|
|
-- if d_in.read_cr_nr_1 = w_in.write_cr_nr then
|
|
-- d_out.read_cr_data_1 <= w_in.write_cr_data;
|
|
-- end if;
|
|
-- if d_in.read_cr_nr_2 = w_in.write_cr_nr then
|
|
-- d_out.read_cr_data_2 <= w_in.write_cr_data;
|
|
-- end if;
|
|
-- end if;
|
|
end process cr_read_0;
|
|
end architecture behaviour;
|