📄 armiu_mestg.vhd
字号:
-- $(lic)
-- $(help_generic)
-- $(help_local)
library ieee;
use ieee.std_logic_1164.all;
use work.armpctrl.all;
use work.armdecode.all;
use work.arm_comp.all;
use work.armpmodel.all;
use work.ctrl_comp.all;
entity armiu_mestg is
port (
rst : in std_logic;
clk : in std_logic;
i : in armiu_mestg_typ_in;
o : out armiu_mestg_typ_out
);
end armiu_mestg;
architecture rtl of armiu_mestg is
type armiu_mestg_tmp_type is record
o : armiu_mestg_typ_out;
commit : std_logic;
meid : std_logic_vector(2 downto 0);
wrid : std_logic_vector(2 downto 0);
end record;
type armiu_mestg_reg_type is record
pctrl : apc_pctrl;
mexc : std_logic;
end record;
type armiu_mestg_dbg_type is record
dummy : std_logic;
-- pragma translate_off
dbg : armiu_mestg_tmp_type;
-- pragma translate_on
end record;
signal r, c : armiu_mestg_reg_type;
signal rdbg, cdbg : armiu_mestg_dbg_type;
begin
p0: process (clk, rst, r, i )
variable v : armiu_mestg_reg_type;
variable t : armiu_mestg_tmp_type;
variable vdbg : armiu_mestg_dbg_type;
begin
-- $(init(t:armiu_mestg_tmp_type))
v := r;
t.commit := not i.flush_v ;
t.meid := i.pstate.fromME_pctrl_r.insn.id;
t.wrid := i.pstate.fromWR_pctrl_r.insn.id;
--if i.dco.me_mexc = '1' then
-- v.mexc := '1';
--end if;
-- swp addresses
t.o.dci.addr_in := i.pstate.fromDM_pctrl_r.data1;
case i.pstate.fromDM_pctrl_r.insn.decinsn is
when type_arm_swp =>
t.o.dci.addr_in(1 downto 0) := (others => '0');
when others =>
end case;
t.o.dci.addr_re := r.pctrl.data1;
t.o.dci.atomic_readwrite := '0';
case r.pctrl.insn.decinsn is
when type_arm_swp =>
t.o.dci.addr_re(1 downto 0) := (others => '0');
t.o.dci.atomic_readwrite := '1';
when others =>
end case;
-- reset
if ( rst = '0' ) then
v.mexc := '0';
end if;
-- pipeline propagation
t.o.pctrl_r := r.pctrl;
t.o.toWR_pctrl_v := v.pctrl;
-- irq
if (not (i.irqo.irl = IRQ_NOIRQ)) and
(not (t.meid = t.wrid)) then
t.commit := '0';
t.o.toWR_pctrl_v.wr.wrop_trap.trap := '1';
t.o.toWR_pctrl_v.wr.wrop_trap.traptype := apm_trap_irq;
t.o.toWR_pctrl_v.data2(3 downto 0) := i.irqo.irl;
end if;
-- dcache input
t.o.dci.data_in := i.pstate.fromDM_pctrl_r.data2;
t.o.dci.data_re := r.pctrl.data2;
t.o.dci.addrin_re := r.pctrl.me.meop_param.addrin and
r.pctrl.valid;
t.o.dci.annul := (not t.commit) ;
t.o.dci.forcewrite := '0';
t.o.dci.forceread := '0';
t.o.dci.param_r.size := r.pctrl.me.meop_param.size;
t.o.dci.param_r.read := r.pctrl.me.meop_param.read;
t.o.dci.param_r.lock := r.pctrl.me.meop_param.lock;
t.o.dci.param_r.writedata := r.pctrl.me.meop_param.writedata;
t.o.dci.param_r.addrin := r.pctrl.me.meop_param.addrin;
t.o.dci.param_r.signed := r.pctrl.me.meop_param.signed;
-- pipeline flush
if not (t.commit = '1') then
t.o.toWR_pctrl_v.valid := '0';
end if;
if i.pstate.hold_r.hold = '0' then
v.pctrl := i.fromDM_pctrl_v;
end if;
c <= v;
o <= t.o;
-- pragma translate_off
vdbg := rdbg;
vdbg.dbg := t;
cdbg <= vdbg;
-- pragma translate_on
end process p0;
pregs : process (clk, c)
begin
if rising_edge(clk) then
r <= c;
-- pragma translate_off
rdbg <= cdbg;
-- pragma translate_on
end if;
end process;
end rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -