📄 armiu.vhd
字号:
-- (nextaddr) (clr) (clr) (clr) (clr) (clr) (clr) (clr) (clr)
-- +----------+---------+---------+---------+---------+---------+-----+---+---------+---------------+
-- V V V V V V V | V V |
-- +---------+---------+---------+---------+---------+---------+-------+-+---------+---------+-------+-+
-- |IMSTG |FESTG |DESTG |DRSTG |RRSTG |RSSTG |EXSTG | |DMSTG |MESTG |WRSTG | |
-- | | | | | | | regbra+ | | | wrbra+ |
-- | | | |tundef-+ | | | | | | | | |
-- | | mexc+ | |tswi -+ | | | | | | tdabrt-+tdabrt-+ |
-- | tprfch+-+-------+-+---------+-------+-+---------+---------+-------+ | | | | |
-- +-------+-+-------+-+---------+-------+-+---------+---------+---------+---------+---------+-------+-+
-- / \ | | V |
-- | | | pctrl.trap:+-----------------------------------------------------------+
-- +-----+---------+-------------------+
-- (idle until wrbra)
t.armiu_imstgi.flush_v := '0';
t.armiu_festgi.flush_v := '0';
t.armiu_destgi.flush_v := '0';
t.armiu_drstgi.flush_v := '0';
t.armiu_rrstgi.flush_v := '0';
t.armiu_rsstgi.flush_v := '0';
t.armiu_exstgi.flush_v := '0';
t.armiu_dmstgi.flush_v := '0';
t.armiu_mestgi.flush_v := '0';
t.exclear := '0';
t.wrclear := '0';
if armiu_exstgo.flush_v = '1' then
t.exclear := '1';
end if;
if armiu_wrstgo.toIM_branch_v = '1' then
t.wrclear := '1';
end if;
-- reset
if ( rst = '0' ) then
end if;
t.drid := armiu_drstgo.id;
t.rrid := armiu_rrstgo.pctrl_r.insn.id;
t.rsid := armiu_rsstgo.pctrl_r.insn.id;
t.exid := armiu_exstgo.pctrl_r.insn.id;
t.dmid := armiu_dmstgo.pctrl_r.insn.id;
t.meid := armiu_mestgo.pctrl_r.insn.id;
t.wrid := armiu_wrstgo.pctrl_r.insn.id;
if t.exclear = '1' or t.wrclear = '1' then
t.armiu_imstgi.flush_v := '1';
t.armiu_festgi.flush_v := '1';
t.armiu_destgi.flush_v := '1';
if apc_is_flush(t.drid,t.exid) then
t.armiu_drstgi.flush_v := '1';
end if;
if apc_is_flush(t.rrid,t.exid) then
t.armiu_rrstgi.flush_v := '1';
end if;
if apc_is_flush(t.rsid,t.exid) then
t.armiu_rsstgi.flush_v := '1';
end if;
end if;
if t.wrclear = '1' then
if apc_is_flush(t.exid,t.wrid) then
t.armiu_exstgi.flush_v := '1';
end if;
if apc_is_flush(t.dmid,t.wrid) then
t.armiu_dmstgi.flush_v := '1';
end if;
if apc_is_flush(t.meid,t.wrid) then
t.armiu_mestgi.flush_v := '1';
end if;
end if;
-- branch address
t.addrvir := armiu_exstgo.alures_v;
t.branch := '0';
if armiu_exstgo.toIM_branch_v = '1' then
t.addrvir := armiu_exstgo.alures_v;
t.branch := '1';
end if;
if armiu_wrstgo.toIM_branch_v = '1' then
t.addrvir := armiu_wrstgo.toIM_branchaddr_v;
t.branch := '1';
end if;
t.armiu_imstgi.branch_v := t.branch;
t.armiu_imstgi.addrvir_v := t.addrvir;
-- locking>|<
-- +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
-- |IMSTG |FESTG |DESTG |DRSTG |RRSTG |RSSTG |EXSTG |DMSTG |MESTG |WRSTG |
-- | | | | | | |take | | | |
-- | | | |[undef] | | |[undef] | | | |
-- | | | | | | | | | | |
-- | | |[insn] | | | | | | | |
-- +---------+---------++--------++--------+-+-------+---------+---------+---------+---------+-------+-+
-- V /\ /\ V
-- ++--------++--------+-+-------+---------+---------+---------+---------+-------+-+
-- | | ldc/stc | reg/lock| |ldc/mrc| |
-- | | ctrl | stc/mcr | |[reg] <+ |
-- | | busy |cpd-lock | |commit |
-- | | | | |use id |
-- +---------+---------+---------+ +---------+
-- FE DEC EX
-- |< DRSTG.netxinsn controled >|
--
-- todo: check valid, not correct
t.cpsyci.hold_r := hold;
-- coprocessor: PR-DESTG -> CP-FESTG
t.cpsyci.fromPRDE_insn := lmd_convert ( armiu_festgo.toDE_insn_r.insn, CFG_BO_INSN, CFG_BO_PROC );
t.cpsyci.fromPRDE_valid := armiu_festgo.toDE_insn_r.valid;
-- PR-DRSTG -> CP-DESTG
t.cpsyci.fromPRDR_nextinsn_v := armiu_drstgo.nextinsn_v;
t.cpsyci.fromPRDR_valid := armiu_destgo.toDR_insn_r.insn.valid;
-- PR-RRSTG -> CP-EXSTG
t.cpsyci.fromPRRR_valid := armiu_rrstgo.pctrl_r.valid;
-- PR-WRSTG -> CP-WRSTG
t.cpsyci.fromPRWR_data_v := armiu_wrstgo.toCPWR_crd_data_v;
t.cpsyci.fromPRWR_valid := armiu_wrstgo.pctrl_r.valid;
-- PR-DRSTG <- CP-DESTG
t.armiu_drstgi.fromCPDE_busy := '0';
t.armiu_drstgi.fromCPDE_last := '1';
t.armiu_drstgi.fromCPDE_accept := '0';
case armiu_destgo.toDR_insn_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
when "1111" => -- sysctrl coprocessor
-- PR-DRSTG <- CP-DESTG
t.armiu_drstgi.fromCPDE_busy := cpsyco.CPDE_PRDR.busy;
t.armiu_drstgi.fromCPDE_last := cpsyco.CPDE_PRDR.last;
t.armiu_drstgi.fromCPDE_accept := cpsyco.CPDE_PRDR.accept;
when others => null;
end case;
-- PR-RRSTG <- CP-EXSTG
case armiu_rrstgo.pctrl_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
when "1111" => -- sysctrl coprocessor
-- PR-RRSTG <- CP-EXSTG
t.armiu_rrstgi.fromCPEX_data := cpsyco.CPEX_PRRR.data;
t.armiu_rrstgi.fromCPEX_lock := cpsyco.CPEX_PRRR.lock;
when others => null;
end case;
c <= v;
o <= t.o;
armiu_imstgi <= t.armiu_imstgi;
armiu_festgi <= t.armiu_festgi;
armiu_destgi <= t.armiu_destgi;
armiu_drstgi <= t.armiu_drstgi;
armiu_rrstgi <= t.armiu_rrstgi;
armiu_rsstgi <= t.armiu_rsstgi;
armiu_exstgi <= t.armiu_exstgi;
armiu_dmstgi <= t.armiu_dmstgi;
armiu_mestgi <= t.armiu_mestgi;
armiu_wrstgi <= t.armiu_wrstgi;
cpsyci <= t.cpsyci;
ici <= t.ici;
dci <= t.dci;
-- 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;
imstg0: armiu_imstg port map ( rst, clk, armiu_imstgi, armiu_imstgo);
festg0: armiu_festg port map ( rst, clk, armiu_festgi, armiu_festgo);
destg0: armiu_destg port map ( rst, clk, armiu_destgi, armiu_destgo);
drstg0: armiu_drstg port map ( rst, clk, armiu_drstgi, armiu_drstgo);
rrstg0: armiu_rrstg port map ( rst, clk, clkn, armiu_rrstgi, armiu_rrstgo);
rsstg0: armiu_rsstg port map ( rst, clk, armiu_rsstgi, armiu_rsstgo);
exstg0: armiu_exstg port map ( rst, clk, armiu_exstgi, armiu_exstgo);
dmstg0: armiu_dmstg port map ( rst, clk, armiu_dmstgi, armiu_dmstgo);
mestg0: armiu_mestg port map ( rst, clk, armiu_mestgi, armiu_mestgo);
wrstg0: armiu_wrstg port map ( rst, clk, armiu_wrstgi, armiu_wrstgo);
cpsys0: armcp_sctrl port map ( rst, clk, cpsyci, cpsyco );
end rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -