📄 armcmd_sw.vhd
字号:
-- $(lic)
-- $(help_generic)
-- $(help_local)
library ieee;
use ieee.std_logic_1164.all;
use work.memdef.all;
use work.armdecode.all;
use work.armcmd.all;
use work.armpctrl.all;
use work.armpmodel.all;
use work.armcmd_comp.all;
entity armcmd_sw is
port (
rst : in std_logic;
clk : in std_logic;
i : in armcmd_sw_typ_in;
o : out armcmd_sw_typ_out
);
end armcmd_sw;
architecture rtl of armcmd_sw is
type armcmd_sw_tmp_type is record
o : armcmd_sw_typ_out;
off : std_logic_vector(23 downto 0);
ctrlmemo : acm_ctrlmemout;
end record;
type armcmd_sw_reg_type is record
dummy : std_logic;
end record;
type armcmd_sw_dbg_type is record
dummy : std_logic;
-- pragma translate_off
dbg : armcmd_sw_tmp_type;
-- pragma translate_on
end record;
signal r, c : armcmd_sw_reg_type;
signal rdbg, cdbg : armcmd_sw_dbg_type;
begin
p0: process (clk, rst, r, i )
variable v : armcmd_sw_reg_type;
variable t : armcmd_sw_tmp_type;
variable vdbg : armcmd_sw_dbg_type;
begin
-- $(init(t:armcmd_sw_tmp_type))
v := r;
t.o.ctrlo := i.ctrli.ctrlo;
t.o.ctrlo.nextinsn := '0';
t.ctrlmemo := i.ctrlmemo;
t.ctrlmemo.meop_param.writedata := '0'; -- MESTG: dcache inputs (wr data)
t.ctrlmemo.meop_param.addrin := '0'; -- MESTG: dcache inputs (tag cmp)
t.ctrlmemo.meop_param.read := '0'; -- MESTG: dcache inputs (readdata)
t.ctrlmemo.meop_param.signed := '0'; -- MESTG: dcache inputs (readdata)
t.ctrlmemo.meop_param.lock := '0'; -- MESTG: dcache inputs (atomic)
t.ctrlmemo.meop_enable := '0'; -- MESTG: dcache inputs
-- swpb cmd
if i.ctrli.insn.insn(ADE_SWPB_C) = '1' then
t.ctrlmemo.meop_param.size := lmd_byte;
else
t.ctrlmemo.meop_param.size := lmd_word;
end if;
-- swp{cond} <rd>,<rm>,[<rn>]
case i.ctrli.cnt is
when ACM_CNT_ZERO =>
-- [frame: ctrli.cnt = 1] load address calculation (rn)
--
-- RRSTG RSSTG EXSTG DMSTG MESTG WRSTG
-- --+-----------+-----------+-----------+-----------+-----------+----------+
-- <rn> ->+-----------+----------op1 | | |
-- | | | \->[buf] | | |
-- | (regread)| (noshift) | +---+ | +(trans) | +>(dcache)+-+>(write)
-- | | | | | | | | | | |
-- <rm> ->+-----------+->[buf] | | | | | | | | |
-- --+-----------+-----------+-----+-----+-+---+-----+-+---------+-+--------+
-- | | | | |
-- pctrl.data1 (as address) : +-------+ +-------+ |
-- pctrl.me.param: o------------------------------+ |
-- pctrl.wr.rd(<rd>):o------------------------------------------+
t.ctrlmemo.r1_src := acm_rrn; -- fetch <rn> (addrbase)
t.ctrlmemo.r2_src := acm_rrm; -- fetch <rm> (swapreg)
t.ctrlmemo.data2 := (others => '0'); -- <0>
t.ctrlmemo.rsop_op1_src := apc_opsrc_through; -- route <rn> to exestg op1
t.ctrlmemo.rsop_op2_src := apc_opsrc_through; -- route <offset12> to exestg op2
t.ctrlmemo.rd_src := acm_rdrrd;
t.ctrlmemo.rsop_buf2_src := apc_bufsrc_through;
t.ctrlmemo.exop_buf_src := apc_exbufsrc_op1;
t.ctrlmemo.exop_data_src := apc_datasrc_none; -- route <rn> to pctrl.data1 (waddr)
t.ctrlmemo.meop_param.read := '1'; -- MESTG: dcache inputs (readdata)
t.ctrlmemo.meop_param.addrin := '1'; -- MESTG: dcache inputs (tag cmp)
t.ctrlmemo.meop_param.lock := '1'; -- MESTG: dcache inputs (atomic)
t.ctrlmemo.meop_enable := '1'; -- MESTG: dcache inputs
when ACM_CNT_ONE =>
-- [frame: ctrli.cnt = 2] store address calculation (rn) (will not block)
-- lock barier
-- >|<
-- RRSTG | RSSTG EXSTG DMSTG MESTG WRSTG
-- --+-----------+-----------+-----------+-----------+-----------+----------+
-- | | | | |
-- | | | | | |
-- | (regread)| (noshift) | (aluop) | +(trans) | +>(dcache)| (write)
-- | | | [buf] | | | | | |
-- | | | | | | | | | |
-- --+-----------+-----------+-----+-----+-+---+-----+-+---------+----------+
-- | | | |
-- pctrl.data1 (as address) : +-------+ +-------+
-- cyc0:pctrl.me.param: o------------------------------+
t.ctrlmemo.r1_src := acm_none; -- fetch <rn> (addrbase)
t.ctrlmemo.r2_src := acm_none; -- fetch <rn> (addrbase)
t.ctrlmemo.rd_src := acm_rdnone;
t.ctrlmemo.exop_data_src := apc_datasrc_buf; -- route <offset12> to exestg op2
t.ctrlmemo.meop_param.read := '0'; -- MESTG: dcache inputs (readdata)
t.ctrlmemo.meop_param.addrin := '1'; -- MESTG: dcache inputs (tag cmp)
t.ctrlmemo.meop_enable := '1'; -- MESTG: dcache inputs
when others =>
-- [ctrli.cnt = 1:] send writedata (will not block )
--
-- lock barier
-- >|<
-- RRSTG | RSSTG EXSTG DMSTG MESTG WRSTG
-- --+-----------+-----------+-----------+-----------+-----------+----------+
-- | + <0>-op1 | | |
-- | | | \ | | |
-- | (regread)| (noshift) | +(aluop) | (trans) | +>(dcache)| (write)
-- | | | / | | | | /\ |
-- | | [buf]-op2 | | | | | |
-- --+-----------+-----------+-----+-----+-----------+-+---+-----+----------+
-- | | |
-- (as memwritedata) pctrl.data1: +-------------------+ |
-- cyc1:pctrl.me.param: o----------------------+ |
-- cyc0:pctrl.data1(addr): o--------------------------+
t.ctrlmemo.r1_src := acm_none;
t.ctrlmemo.r2_src := acm_none;
t.ctrlmemo.data2 := (others => '0');
t.ctrlmemo.rsop_op1_src := apc_opsrc_none;
t.ctrlmemo.rsop_op2_src := apc_opsrc_buf;
t.ctrlmemo.rd_src := acm_rdnone;
t.ctrlmemo.exop_data_src := apc_datasrc_aluout; -- route <offset12> to exestg op2
t.ctrlmemo.meop_param.read := '0'; -- MESTG: dcache inputs
t.ctrlmemo.meop_param.writedata := '1'; -- MESTG: dcache inputs (wr data)
t.ctrlmemo.meop_enable := '1'; -- MESTG: dcache inputs
t.o.ctrlo.nextinsn := '1';
end case;
t.o.ctrlmemo := t.ctrlmemo;
-- reset
if ( rst = '0' ) then
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 + -