mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-01-13 15:18:09 +00:00
Right now our test cases fold the SPRs into the GPRs. That makes debugging fails more difficult than it needs to be, so print out the CTR, LR and CR. We still need to print the XER, but that is in two spots in microwatt and will take some more work. This also adds many instructions to the tests that we have added lately including overflow instructions, CR logicals and mt/mfxer. Signed-off-by: Anton Blanchard <anton@linux.ibm.com>
92 lines
2.3 KiB
VHDL
92 lines
2.3 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
|
|
generic (
|
|
SIM : boolean := false
|
|
);
|
|
port(
|
|
clk : in std_logic;
|
|
|
|
d_in : in Decode2ToCrFileType;
|
|
d_out : out CrFileToDecode2Type;
|
|
|
|
w_in : in WritebackToCrFileType;
|
|
|
|
-- debug
|
|
sim_dump : in std_ulogic
|
|
);
|
|
end entity cr_file;
|
|
|
|
architecture behaviour of cr_file is
|
|
signal crs : std_ulogic_vector(31 downto 0) := (others => '0');
|
|
signal crs_updated : std_ulogic_vector(31 downto 0);
|
|
signal xerc : xer_common_t := xerc_init;
|
|
signal xerc_updated : xer_common_t;
|
|
begin
|
|
cr_create_0: process(all)
|
|
variable hi, lo : integer := 0;
|
|
variable cr_tmp : std_ulogic_vector(31 downto 0) := (others => '0');
|
|
begin
|
|
cr_tmp := crs;
|
|
|
|
for i in 0 to 7 loop
|
|
if w_in.write_cr_mask(i) = '1' then
|
|
lo := i*4;
|
|
hi := lo + 3;
|
|
cr_tmp(hi downto lo) := w_in.write_cr_data(hi downto lo);
|
|
end if;
|
|
end loop;
|
|
|
|
crs_updated <= cr_tmp;
|
|
|
|
if w_in.write_xerc_enable = '1' then
|
|
xerc_updated <= w_in.write_xerc_data;
|
|
else
|
|
xerc_updated <= xerc;
|
|
end if;
|
|
|
|
end process;
|
|
|
|
-- synchronous writes
|
|
cr_write_0: process(clk)
|
|
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);
|
|
crs <= crs_updated;
|
|
end if;
|
|
if w_in.write_xerc_enable = '1' then
|
|
report "Writing XERC";
|
|
xerc <= xerc_updated;
|
|
end if;
|
|
end if;
|
|
end process;
|
|
|
|
-- asynchronous reads
|
|
cr_read_0: process(all)
|
|
begin
|
|
-- just return the entire CR to make mfcrf easier for now
|
|
if d_in.read = '1' then
|
|
report "Reading CR " & to_hstring(crs_updated);
|
|
end if;
|
|
d_out.read_cr_data <= crs_updated;
|
|
d_out.read_xerc_data <= xerc_updated;
|
|
end process;
|
|
|
|
sim_dump_test: if SIM generate
|
|
dump_cr: process(all)
|
|
begin
|
|
if sim_dump = '1' then
|
|
report "CR 00000000" & to_hstring(crs);
|
|
assert false report "end of test" severity failure;
|
|
end if;
|
|
end process;
|
|
end generate;
|
|
|
|
end architecture behaviour;
|