OpenCores
URL https://opencores.org/ocsvn/core_arm/core_arm/trunk

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [arm/] [armiu_rsstg.vhd] - Rev 5

Go to most recent revision | Compare with Previous | Blame | View Log

-- $(lic)
-- $(help_generic)
-- $(help_local)
 
library ieee;
use ieee.std_logic_1164.all;
use work.armshiefter.all;
use work.armpctrl.all;
use work.armctrl.all;
use work.armpmodel.all;
use work.armdecode.all;
use work.arm_comp.all;
 
entity armiu_rsstg is
  port ( 
    rst     : in  std_logic;
    clk     : in  std_logic;
    i       : in  armiu_rsstg_typ_in;
    o       : out armiu_rsstg_typ_out
    );
end armiu_rsstg;
 
architecture rtl of armiu_rsstg is
 
  type armiu_rsstg_tmp_type is record
    o       : armiu_rsstg_typ_out;
    commit : std_logic;
    shieftout      : std_logic_vector(31 downto 0);
    cond_fail : std_logic;
  end record;
  type armiu_rsstg_reg_type is record
    pctrl : apc_pctrl;
    buf1 : std_logic_vector(31 downto 0);
    buf2 : std_logic_vector(31 downto 0);
  end record;
  type armiu_rsstg_dbg_type is record
     dummy : std_logic;
     -- pragma translate_off
     dbg : armiu_rsstg_tmp_type;
     -- pragma translate_on
  end record;
  signal r, c       : armiu_rsstg_reg_type;
  signal rdbg, cdbg : armiu_rsstg_dbg_type;
 
begin  
 
  p0: process (clk, rst, r, i  )
    variable v    : armiu_rsstg_reg_type;
    variable t    : armiu_rsstg_tmp_type;
    variable vdbg : armiu_rsstg_dbg_type;
  begin 
 
    -- $(init(t:armiu_rsstg_tmp_type))
 
    v := r;
    t.commit := not i.flush_v;
 
    aas_shieft( r.pctrl.insn.insn,
                r.pctrl.rs.rsop_sdir,
                r.pctrl.rs.rsop_styp,
                r.pctrl.data1,
                r.pctrl.data2,
                i.pstate.fromEX_cpsr_r.ex.c,
                t.shieftout,
                v.pctrl.rs.rs_shieftcarryout
                );
 
    -- reset
    if ( rst = '0' ) then
    end if;
 
    -- pipeline propagation
    t.o.pctrl_r := r.pctrl;
    t.o.toEX_pctrl_v := v.pctrl;
 
    -- pipeline flush
    if not (t.commit = '1') then
      t.o.toEX_pctrl_v.valid := '0';
    end if;
 
    case r.pctrl.rs.rsop_op1_src is
      when apc_opsrc_through => t.o.toEX_pctrl_v.data1 := r.pctrl.data1;
      when apc_opsrc_buf     => t.o.toEX_pctrl_v.data1 := r.buf1;
      when apc_opsrc_alures  => t.o.toEX_pctrl_v.data1 := i.fromEX_alures_v;
      when apc_opsrc_none    =>
      when others => 
    end case;
 
    case r.pctrl.rs.rsop_op2_src is
      when apc_opsrc_through => t.o.toEX_pctrl_v.data2 := t.shieftout;
      when apc_opsrc_buf     => t.o.toEX_pctrl_v.data2 := r.buf2;
      when apc_opsrc_alures  => t.o.toEX_pctrl_v.data2 := i.fromEX_alures_v;
      when apc_opsrc_none    =>
      when others => 
    end case;
 
    case r.pctrl.rs.rsop_buf1_src is
      when apc_bufsrc_through => v.buf1 := r.pctrl.data1;
      when apc_bufsrc_alures  => v.buf1 := i.fromEX_alures_v;
      when apc_bufsrc_none    =>
      when others => 
    end case;
 
    case r.pctrl.rs.rsop_buf2_src is
      when apc_bufsrc_through => v.buf2 := t.shieftout;
      when apc_bufsrc_alures  => v.buf2 := i.fromEX_alures_v;
      when apc_bufsrc_none    =>
      when others => 
    end case;
 
    t.cond_fail := '0';                 -- tmp for dbg
    if act_checkcond(i.fromEX_cpsr_v,r.pctrl.insn.insn(ADE_COND_U downto ADE_COND_D)) = '0' then
      t.cond_fail := '1';                 -- tmp for dbg
      t.o.toEX_pctrl_v.valid := '0';
    end if;
 
    -- todo: add pctrl owner propagation
 
    if i.pstate.hold_r.hold = '0' then
      if apc_is_valid(i.fromRR_pctrl_v) then
        v.pctrl := i.fromRR_pctrl_v;
      else
        if not apc_is_straddr(r.pctrl) then
          v.pctrl := i.fromRR_pctrl_v;
        else
          -- wait for store data (coming after this one)
          t.o.toEX_pctrl_v.valid := '0';
        end if;
      end if;
    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;
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.