|
|
@ -92,8 +92,7 @@ architecture behaviour of execute1 is
|
|
|
|
mult_32s : std_ulogic;
|
|
|
|
mult_32s : std_ulogic;
|
|
|
|
write_fscr : std_ulogic;
|
|
|
|
write_fscr : std_ulogic;
|
|
|
|
write_ic : std_ulogic;
|
|
|
|
write_ic : std_ulogic;
|
|
|
|
write_hfscr : std_ulogic;
|
|
|
|
write_lpcr : std_ulogic;
|
|
|
|
write_hic : std_ulogic;
|
|
|
|
|
|
|
|
write_heir : std_ulogic;
|
|
|
|
write_heir : std_ulogic;
|
|
|
|
set_heir : std_ulogic;
|
|
|
|
set_heir : std_ulogic;
|
|
|
|
write_ctrl : std_ulogic;
|
|
|
|
write_ctrl : std_ulogic;
|
|
|
@ -212,6 +211,7 @@ architecture behaviour of execute1 is
|
|
|
|
signal valid_in : std_ulogic;
|
|
|
|
signal valid_in : std_ulogic;
|
|
|
|
signal ctrl: ctrl_t := ctrl_t_init;
|
|
|
|
signal ctrl: ctrl_t := ctrl_t_init;
|
|
|
|
signal ctrl_tmp: ctrl_t := ctrl_t_init;
|
|
|
|
signal ctrl_tmp: ctrl_t := ctrl_t_init;
|
|
|
|
|
|
|
|
signal dec_sign: std_ulogic;
|
|
|
|
signal rotator_result: std_ulogic_vector(63 downto 0);
|
|
|
|
signal rotator_result: std_ulogic_vector(63 downto 0);
|
|
|
|
signal rotator_carry: std_ulogic;
|
|
|
|
signal rotator_carry: std_ulogic;
|
|
|
|
signal logical_result: std_ulogic_vector(63 downto 0);
|
|
|
|
signal logical_result: std_ulogic_vector(63 downto 0);
|
|
|
@ -224,6 +224,7 @@ architecture behaviour of execute1 is
|
|
|
|
signal spr_result: std_ulogic_vector(63 downto 0);
|
|
|
|
signal spr_result: std_ulogic_vector(63 downto 0);
|
|
|
|
signal next_nia : std_ulogic_vector(63 downto 0);
|
|
|
|
signal next_nia : std_ulogic_vector(63 downto 0);
|
|
|
|
signal s1_sel : std_ulogic_vector(2 downto 0);
|
|
|
|
signal s1_sel : std_ulogic_vector(2 downto 0);
|
|
|
|
|
|
|
|
signal log_spr_data : std_ulogic_vector(63 downto 0);
|
|
|
|
|
|
|
|
|
|
|
|
signal carry_32 : std_ulogic;
|
|
|
|
signal carry_32 : std_ulogic;
|
|
|
|
signal carry_64 : std_ulogic;
|
|
|
|
signal carry_64 : std_ulogic;
|
|
|
@ -410,15 +411,17 @@ architecture behaviour of execute1 is
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function assemble_hfscr(c: ctrl_t) return std_ulogic_vector is
|
|
|
|
function assemble_lpcr(c: ctrl_t) return std_ulogic_vector is
|
|
|
|
variable ret : std_ulogic_vector(63 downto 0);
|
|
|
|
variable ret : std_ulogic_vector(63 downto 0);
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
ret := (others => '0');
|
|
|
|
ret := (others => '0');
|
|
|
|
ret(59 downto 56) := c.hfscr_ic;
|
|
|
|
ret(LPCR_HAIL) := c.lpcr_hail;
|
|
|
|
ret(HFSCR_PREFIX) := c.hfscr_pref;
|
|
|
|
ret(LPCR_UPRT) := '1';
|
|
|
|
ret(HFSCR_TAR) := c.hfscr_tar;
|
|
|
|
ret(LPCR_HR) := '1';
|
|
|
|
ret(HFSCR_DSCR) := c.hfscr_dscr;
|
|
|
|
ret(LPCR_LD) := c.lpcr_ld;
|
|
|
|
ret(HFSCR_FP) := c.hfscr_fp;
|
|
|
|
ret(LPCR_HEIC) := c.lpcr_heic;
|
|
|
|
|
|
|
|
ret(LPCR_LPES) := c.lpcr_lpes;
|
|
|
|
|
|
|
|
ret(LPCR_HVICE) := c.lpcr_hvice;
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
@ -457,6 +460,15 @@ architecture behaviour of execute1 is
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function assemble_dec(c: ctrl_t) return std_ulogic_vector is
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
if c.lpcr_ld = '1' then
|
|
|
|
|
|
|
|
return c.dec;
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
return 32x"0" & c.dec(31 downto 0);
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
-- Tell vivado to keep the hierarchy for the random module so that the
|
|
|
|
-- Tell vivado to keep the hierarchy for the random module so that the
|
|
|
|
-- net names in the xdc file match.
|
|
|
|
-- net names in the xdc file match.
|
|
|
|
attribute keep_hierarchy : string;
|
|
|
|
attribute keep_hierarchy : string;
|
|
|
@ -596,6 +608,8 @@ begin
|
|
|
|
tb_next <= thi & tlo;
|
|
|
|
tb_next <= thi & tlo;
|
|
|
|
end process;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dec_sign <= (ctrl.dec(63) and ctrl.lpcr_ld) or (ctrl.dec(31) and not ctrl.lpcr_ld);
|
|
|
|
|
|
|
|
|
|
|
|
dbg_ctrl_out <= ctrl;
|
|
|
|
dbg_ctrl_out <= ctrl;
|
|
|
|
log_rd_addr <= ex2.log_addr_spr;
|
|
|
|
log_rd_addr <= ex2.log_addr_spr;
|
|
|
|
|
|
|
|
|
|
|
@ -796,8 +810,8 @@ begin
|
|
|
|
case dbg_spr_addr(3 downto 0) is
|
|
|
|
case dbg_spr_addr(3 downto 0) is
|
|
|
|
when SPRSEL_FSCR =>
|
|
|
|
when SPRSEL_FSCR =>
|
|
|
|
dbg_spr_data <= assemble_fscr(ctrl);
|
|
|
|
dbg_spr_data <= assemble_fscr(ctrl);
|
|
|
|
when SPRSEL_HFSCR =>
|
|
|
|
when SPRSEL_LPCR =>
|
|
|
|
dbg_spr_data <= assemble_hfscr(ctrl);
|
|
|
|
dbg_spr_data <= assemble_lpcr(ctrl);
|
|
|
|
when SPRSEL_HEIR =>
|
|
|
|
when SPRSEL_HEIR =>
|
|
|
|
dbg_spr_data <= ctrl.heir;
|
|
|
|
dbg_spr_data <= ctrl.heir;
|
|
|
|
when SPRSEL_CFAR =>
|
|
|
|
when SPRSEL_CFAR =>
|
|
|
@ -1189,6 +1203,7 @@ begin
|
|
|
|
v.e.redir_mode := ex1.msr(MSR_IR) & not ex1.msr(MSR_PR) &
|
|
|
|
v.e.redir_mode := ex1.msr(MSR_IR) & not ex1.msr(MSR_PR) &
|
|
|
|
not ex1.msr(MSR_LE) & not ex1.msr(MSR_SF);
|
|
|
|
not ex1.msr(MSR_LE) & not ex1.msr(MSR_SF);
|
|
|
|
v.e.intr_vec := 16#700#;
|
|
|
|
v.e.intr_vec := 16#700#;
|
|
|
|
|
|
|
|
v.e.alt_intr := ctrl.lpcr_hail and ex1.msr(MSR_IR) and ex1.msr(MSR_DR);
|
|
|
|
v.e.mode_32bit := not ex1.msr(MSR_SF);
|
|
|
|
v.e.mode_32bit := not ex1.msr(MSR_SF);
|
|
|
|
v.e.instr_tag := e_in.instr_tag;
|
|
|
|
v.e.instr_tag := e_in.instr_tag;
|
|
|
|
v.e.last_nia := e_in.nia;
|
|
|
|
v.e.last_nia := e_in.nia;
|
|
|
@ -1387,8 +1402,10 @@ begin
|
|
|
|
slow_op := '1';
|
|
|
|
slow_op := '1';
|
|
|
|
if e_in.spr_select.ispmu = '0' then
|
|
|
|
if e_in.spr_select.ispmu = '0' then
|
|
|
|
case e_in.spr_select.sel is
|
|
|
|
case e_in.spr_select.sel is
|
|
|
|
when SPRSEL_LOGD =>
|
|
|
|
when SPRSEL_LOGR =>
|
|
|
|
v.se.inc_loga := '1';
|
|
|
|
if e_in.insn(16) = '0' then
|
|
|
|
|
|
|
|
v.se.inc_loga := '1';
|
|
|
|
|
|
|
|
end if;
|
|
|
|
when others =>
|
|
|
|
when others =>
|
|
|
|
end case;
|
|
|
|
end case;
|
|
|
|
v.res2_sel := "10";
|
|
|
|
v.res2_sel := "10";
|
|
|
@ -1451,14 +1468,14 @@ begin
|
|
|
|
v.se.write_xerlow := '1';
|
|
|
|
v.se.write_xerlow := '1';
|
|
|
|
when SPRSEL_DEC =>
|
|
|
|
when SPRSEL_DEC =>
|
|
|
|
v.se.write_dec := '1';
|
|
|
|
v.se.write_dec := '1';
|
|
|
|
when SPRSEL_LOGA =>
|
|
|
|
when SPRSEL_LOGR =>
|
|
|
|
v.se.write_loga := '1';
|
|
|
|
v.se.write_loga := '1';
|
|
|
|
when SPRSEL_CFAR =>
|
|
|
|
when SPRSEL_CFAR =>
|
|
|
|
v.se.write_cfar := '1';
|
|
|
|
v.se.write_cfar := '1';
|
|
|
|
when SPRSEL_FSCR =>
|
|
|
|
when SPRSEL_FSCR =>
|
|
|
|
v.se.write_fscr := '1';
|
|
|
|
v.se.write_fscr := '1';
|
|
|
|
when SPRSEL_HFSCR =>
|
|
|
|
when SPRSEL_LPCR =>
|
|
|
|
v.se.write_hfscr := '1';
|
|
|
|
v.se.write_lpcr := '1';
|
|
|
|
when SPRSEL_HEIR =>
|
|
|
|
when SPRSEL_HEIR =>
|
|
|
|
v.se.write_heir := '1';
|
|
|
|
v.se.write_heir := '1';
|
|
|
|
when SPRSEL_CTRL =>
|
|
|
|
when SPRSEL_CTRL =>
|
|
|
@ -1548,22 +1565,15 @@ begin
|
|
|
|
end case;
|
|
|
|
end case;
|
|
|
|
|
|
|
|
|
|
|
|
if ex1.msr(MSR_PR) = '1' and e_in.prefixed = '1' and
|
|
|
|
if ex1.msr(MSR_PR) = '1' and e_in.prefixed = '1' and
|
|
|
|
(ctrl.hfscr_pref = '0' or ctrl.fscr_pref = '0') then
|
|
|
|
ctrl.fscr_pref = '0' then
|
|
|
|
-- [Hypervisor] facility unavailable for prefixed instructions,
|
|
|
|
-- Facility unavailable for prefixed instructions,
|
|
|
|
-- which has higher priority than the alignment interrupt for
|
|
|
|
-- which has higher priority than the alignment interrupt for
|
|
|
|
-- misaligned prefixed instructions, which has higher priority than
|
|
|
|
-- misaligned prefixed instructions, which has higher priority than
|
|
|
|
-- other [hypervisor] facility unavailable interrupts (e.g. for
|
|
|
|
-- other facility unavailable interrupts.
|
|
|
|
-- plfs with HFSCR[FP] = 0).
|
|
|
|
|
|
|
|
v.exception := '1';
|
|
|
|
v.exception := '1';
|
|
|
|
v.ic := x"b";
|
|
|
|
v.ic := x"b";
|
|
|
|
if ctrl.hfscr_pref = '0' then
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
v.e.hv_intr := '1';
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
v.e.intr_vec := 16#f80#;
|
|
|
|
|
|
|
|
v.se.write_hic := '1';
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elsif misaligned = '1' then
|
|
|
|
elsif misaligned = '1' then
|
|
|
|
-- generate an alignment interrupt
|
|
|
|
-- generate an alignment interrupt
|
|
|
@ -1608,41 +1618,20 @@ begin
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
|
|
|
|
|
|
|
|
elsif ex1.msr(MSR_PR) = '1' and e_in.uses_tar = '1' and
|
|
|
|
elsif ex1.msr(MSR_PR) = '1' and e_in.uses_tar = '1' and
|
|
|
|
(ctrl.hfscr_tar = '0' or ctrl.fscr_tar = '0') then
|
|
|
|
ctrl.fscr_tar = '0' then
|
|
|
|
-- [Hypervisor] facility unavailable for TAR access
|
|
|
|
-- Facility unavailable for TAR access
|
|
|
|
v.exception := '1';
|
|
|
|
v.exception := '1';
|
|
|
|
v.ic := x"8";
|
|
|
|
v.ic := x"8";
|
|
|
|
if ctrl.hfscr_tar = '0' then
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
v.e.hv_intr := '1';
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
v.e.intr_vec := 16#f80#;
|
|
|
|
|
|
|
|
v.se.write_hic := '1';
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elsif ex1.msr(MSR_PR) = '1' and e_in.uses_dscr = '1' and
|
|
|
|
elsif ex1.msr(MSR_PR) = '1' and e_in.uses_dscr = '1' and
|
|
|
|
(ctrl.hfscr_dscr = '0' or ctrl.fscr_dscr = '0') then
|
|
|
|
ctrl.fscr_dscr = '0' then
|
|
|
|
-- [Hypervisor] facility unavailable for DSCR access
|
|
|
|
-- Facility unavailable for DSCR access
|
|
|
|
v.exception := '1';
|
|
|
|
v.exception := '1';
|
|
|
|
v.ic := x"2";
|
|
|
|
v.ic := x"2";
|
|
|
|
if ctrl.hfscr_dscr = '0' then
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
v.e.hv_intr := '1';
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
v.e.intr_vec := 16#f80#;
|
|
|
|
|
|
|
|
v.se.write_hic := '1';
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
v.e.intr_vec := 16#f60#;
|
|
|
|
|
|
|
|
v.se.write_ic := '1';
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elsif HAS_FPU and ex1.msr(MSR_PR) = '1' and e_in.fac = FPU and
|
|
|
|
|
|
|
|
ctrl.hfscr_fp = '0' then
|
|
|
|
|
|
|
|
-- Hypervisor facility unavailable for FP instructions
|
|
|
|
|
|
|
|
v.exception := '1';
|
|
|
|
|
|
|
|
v.ic := x"0";
|
|
|
|
|
|
|
|
v.e.hv_intr := '1';
|
|
|
|
|
|
|
|
v.e.intr_vec := 16#f80#;
|
|
|
|
|
|
|
|
v.se.write_hic := '1';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elsif HAS_FPU and ex1.msr(MSR_FP) = '0' and e_in.fac = FPU then
|
|
|
|
elsif HAS_FPU and ex1.msr(MSR_FP) = '0' and e_in.fac = FPU then
|
|
|
|
-- generate a floating-point unavailable interrupt
|
|
|
|
-- generate a floating-point unavailable interrupt
|
|
|
@ -1705,7 +1694,8 @@ begin
|
|
|
|
v.busy := '0';
|
|
|
|
v.busy := '0';
|
|
|
|
bypass_valid := actions.bypass_valid;
|
|
|
|
bypass_valid := actions.bypass_valid;
|
|
|
|
|
|
|
|
|
|
|
|
irq_valid := ex1.msr(MSR_EE) and (pmu_to_x.intr or ctrl.dec(63) or ext_irq_in);
|
|
|
|
irq_valid := ex1.msr(MSR_EE) and (pmu_to_x.intr or dec_sign or
|
|
|
|
|
|
|
|
(ext_irq_in and not ctrl.lpcr_heic));
|
|
|
|
|
|
|
|
|
|
|
|
if valid_in = '1' then
|
|
|
|
if valid_in = '1' then
|
|
|
|
v.prev_op := e_in.insn_type;
|
|
|
|
v.prev_op := e_in.insn_type;
|
|
|
@ -1747,14 +1737,14 @@ begin
|
|
|
|
if pmu_to_x.intr = '1' then
|
|
|
|
if pmu_to_x.intr = '1' then
|
|
|
|
v.e.intr_vec := 16#f00#;
|
|
|
|
v.e.intr_vec := 16#f00#;
|
|
|
|
report "IRQ valid: PMU";
|
|
|
|
report "IRQ valid: PMU";
|
|
|
|
elsif ctrl.dec(63) = '1' then
|
|
|
|
elsif dec_sign = '1' then
|
|
|
|
v.e.intr_vec := 16#900#;
|
|
|
|
v.e.intr_vec := 16#900#;
|
|
|
|
report "IRQ valid: DEC";
|
|
|
|
report "IRQ valid: DEC";
|
|
|
|
elsif ext_irq_in = '1' then
|
|
|
|
elsif ext_irq_in = '1' then
|
|
|
|
v.e.intr_vec := 16#500#;
|
|
|
|
v.e.intr_vec := 16#500#;
|
|
|
|
report "IRQ valid: External";
|
|
|
|
report "IRQ valid: External";
|
|
|
|
v.ext_interrupt := '1';
|
|
|
|
v.ext_interrupt := '1';
|
|
|
|
v.e.hv_intr := '1';
|
|
|
|
v.e.hv_intr := not ctrl.lpcr_lpes;
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
v.e.srr1 := (others => '0');
|
|
|
|
v.e.srr1 := (others => '0');
|
|
|
|
exception := '1';
|
|
|
|
exception := '1';
|
|
|
@ -1968,23 +1958,25 @@ begin
|
|
|
|
end process;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
|
|
|
|
-- Slow SPR read mux
|
|
|
|
-- Slow SPR read mux
|
|
|
|
|
|
|
|
log_spr_data <= (log_wr_addr & ex2.log_addr_spr) when ex1.insn(16) = '0'
|
|
|
|
|
|
|
|
else log_rd_data;
|
|
|
|
with ex1.spr_select.sel select spr_result <=
|
|
|
|
with ex1.spr_select.sel select spr_result <=
|
|
|
|
timebase when SPRSEL_TB,
|
|
|
|
timebase when SPRSEL_TB,
|
|
|
|
32x"0" & timebase(63 downto 32) when SPRSEL_TBU,
|
|
|
|
32x"0" & timebase(63 downto 32) when SPRSEL_TBU,
|
|
|
|
ctrl.dec when SPRSEL_DEC,
|
|
|
|
assemble_dec(ctrl) when SPRSEL_DEC,
|
|
|
|
32x"0" & PVR_MICROWATT when SPRSEL_PVR,
|
|
|
|
32x"0" & PVR_MICROWATT when SPRSEL_PVR,
|
|
|
|
log_wr_addr & ex2.log_addr_spr when SPRSEL_LOGA,
|
|
|
|
log_spr_data when SPRSEL_LOGR,
|
|
|
|
log_rd_data when SPRSEL_LOGD,
|
|
|
|
|
|
|
|
ctrl.cfar when SPRSEL_CFAR,
|
|
|
|
ctrl.cfar when SPRSEL_CFAR,
|
|
|
|
assemble_fscr(ctrl) when SPRSEL_FSCR,
|
|
|
|
assemble_fscr(ctrl) when SPRSEL_FSCR,
|
|
|
|
assemble_hfscr(ctrl) when SPRSEL_HFSCR,
|
|
|
|
assemble_lpcr(ctrl) when SPRSEL_LPCR,
|
|
|
|
ctrl.heir when SPRSEL_HEIR,
|
|
|
|
ctrl.heir when SPRSEL_HEIR,
|
|
|
|
assemble_ctrl(ctrl, ex1.msr(MSR_PR)) when SPRSEL_CTRL,
|
|
|
|
assemble_ctrl(ctrl, ex1.msr(MSR_PR)) when SPRSEL_CTRL,
|
|
|
|
39x"0" & ctrl.dscr when SPRSEL_DSCR,
|
|
|
|
39x"0" & ctrl.dscr when SPRSEL_DSCR,
|
|
|
|
56x"0" & std_ulogic_vector(to_unsigned(CPU_INDEX, 8)) when SPRSEL_PIR,
|
|
|
|
56x"0" & std_ulogic_vector(to_unsigned(CPU_INDEX, 8)) when SPRSEL_PIR,
|
|
|
|
ctrl.ciabr when SPRSEL_CIABR,
|
|
|
|
ctrl.ciabr when SPRSEL_CIABR,
|
|
|
|
assemble_dexcr(ctrl, ex1.insn) when SPRSEL_DEXCR,
|
|
|
|
assemble_dexcr(ctrl, ex1.insn) when SPRSEL_DEXCR,
|
|
|
|
assemble_xer(ex1.e.xerc, ctrl.xer_low) when others;
|
|
|
|
assemble_xer(ex1.e.xerc, ctrl.xer_low) when SPRSEL_XER,
|
|
|
|
|
|
|
|
64x"0" when others;
|
|
|
|
|
|
|
|
|
|
|
|
stage2_stall <= l_in.l2stall or fp_in.f2stall;
|
|
|
|
stage2_stall <= l_in.l2stall or fp_in.f2stall;
|
|
|
|
|
|
|
|
|
|
|
@ -2127,15 +2119,6 @@ begin
|
|
|
|
v.log_addr_spr := std_ulogic_vector(unsigned(ex2.log_addr_spr) + 1);
|
|
|
|
v.log_addr_spr := std_ulogic_vector(unsigned(ex2.log_addr_spr) + 1);
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
x_to_pmu.mtspr <= ex1.se.write_pmuspr;
|
|
|
|
x_to_pmu.mtspr <= ex1.se.write_pmuspr;
|
|
|
|
if ex1.se.write_hfscr = '1' then
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_ic <= ex1.e.write_data(59 downto 56);
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_pref <= ex1.e.write_data(HFSCR_PREFIX);
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_tar <= ex1.e.write_data(HFSCR_TAR);
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_dscr <= ex1.e.write_data(HFSCR_DSCR);
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_fp <= ex1.e.write_data(HFSCR_FP);
|
|
|
|
|
|
|
|
elsif ex1.se.write_hic = '1' then
|
|
|
|
|
|
|
|
ctrl_tmp.hfscr_ic <= ex1.ic;
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
if ex1.se.write_fscr = '1' then
|
|
|
|
if ex1.se.write_fscr = '1' then
|
|
|
|
ctrl_tmp.fscr_ic <= ex1.e.write_data(59 downto 56);
|
|
|
|
ctrl_tmp.fscr_ic <= ex1.e.write_data(59 downto 56);
|
|
|
|
ctrl_tmp.fscr_pref <= ex1.e.write_data(FSCR_PREFIX);
|
|
|
|
ctrl_tmp.fscr_pref <= ex1.e.write_data(FSCR_PREFIX);
|
|
|
@ -2145,6 +2128,13 @@ begin
|
|
|
|
elsif ex1.se.write_ic = '1' then
|
|
|
|
elsif ex1.se.write_ic = '1' then
|
|
|
|
ctrl_tmp.fscr_ic <= ex1.ic;
|
|
|
|
ctrl_tmp.fscr_ic <= ex1.ic;
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
|
|
|
|
if ex1.se.write_lpcr = '1' then
|
|
|
|
|
|
|
|
ctrl_tmp.lpcr_hail <= ex1.e.write_data(LPCR_HAIL);
|
|
|
|
|
|
|
|
ctrl_tmp.lpcr_ld <= ex1.e.write_data(LPCR_LD);
|
|
|
|
|
|
|
|
ctrl_tmp.lpcr_heic <= ex1.e.write_data(LPCR_HEIC);
|
|
|
|
|
|
|
|
ctrl_tmp.lpcr_lpes <= ex1.e.write_data(LPCR_LPES);
|
|
|
|
|
|
|
|
ctrl_tmp.lpcr_hvice <= ex1.e.write_data(LPCR_HVICE);
|
|
|
|
|
|
|
|
end if;
|
|
|
|
if ex1.se.write_heir = '1' then
|
|
|
|
if ex1.se.write_heir = '1' then
|
|
|
|
ctrl_tmp.heir <= ex1.e.write_data;
|
|
|
|
ctrl_tmp.heir <= ex1.e.write_data;
|
|
|
|
elsif ex1.se.set_heir = '1' then
|
|
|
|
elsif ex1.se.set_heir = '1' then
|
|
|
@ -2173,7 +2163,7 @@ begin
|
|
|
|
-- pending exceptions clear any wait state
|
|
|
|
-- pending exceptions clear any wait state
|
|
|
|
-- ex1.fp_exception_next is not tested because it is not possible to
|
|
|
|
-- ex1.fp_exception_next is not tested because it is not possible to
|
|
|
|
-- get into wait state with a pending FP exception.
|
|
|
|
-- get into wait state with a pending FP exception.
|
|
|
|
irq_exc := pmu_to_x.intr or ctrl.dec(63) or ext_irq_in;
|
|
|
|
irq_exc := pmu_to_x.intr or dec_sign or ext_irq_in;
|
|
|
|
if ex1.trace_next = '1' or irq_exc = '1' or interrupt_in.intr = '1' then
|
|
|
|
if ex1.trace_next = '1' or irq_exc = '1' or interrupt_in.intr = '1' then
|
|
|
|
ctrl_tmp.wait_state <= '0';
|
|
|
|
ctrl_tmp.wait_state <= '0';
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
@ -2186,11 +2176,13 @@ begin
|
|
|
|
ctrl_tmp.msr(MSR_FP) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_FP) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_FE0) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_FE0) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_FE1) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_FE1) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_IR) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_IR) <= interrupt_in.alt_int;
|
|
|
|
ctrl_tmp.msr(MSR_DR) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_DR) <= interrupt_in.alt_int;
|
|
|
|
ctrl_tmp.msr(MSR_LE) <= '1';
|
|
|
|
ctrl_tmp.msr(MSR_LE) <= '1';
|
|
|
|
if interrupt_in.scv_int = '0' then
|
|
|
|
if interrupt_in.scv_int = '0' then
|
|
|
|
ctrl_tmp.msr(MSR_EE) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_EE) <= '0';
|
|
|
|
|
|
|
|
end if;
|
|
|
|
|
|
|
|
if interrupt_in.scv_int = '0' and interrupt_in.hv_intr = '0' then
|
|
|
|
ctrl_tmp.msr(MSR_RI) <= '0';
|
|
|
|
ctrl_tmp.msr(MSR_RI) <= '0';
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
@ -2214,7 +2206,6 @@ begin
|
|
|
|
|
|
|
|
|
|
|
|
-- update outputs
|
|
|
|
-- update outputs
|
|
|
|
e_out <= ex2.e;
|
|
|
|
e_out <= ex2.e;
|
|
|
|
e_out.msr <= msr_copy(ctrl.msr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
run_out <= ctrl.run;
|
|
|
|
run_out <= ctrl.run;
|
|
|
|
terminate_out <= ex2.se.terminate;
|
|
|
|
terminate_out <= ex2.se.terminate;
|
|
|
|