📄 armdecode.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use work.config.all;
use work.memdef.all;
use work.armpmodel.all;
use work.armshiefter.all;
-- PREFIX: ade_xxx
package armdecode is
-------------------------------------------------------------------------------
-- Addressing modes:
-- DAta PRocessing Addressing Modes : DAPRAM
-- LoaD/STore Addressing Modes : LDSTAM
-- Load/Store misc (V4) Addressing Modes : LSV4AM
-- DAta PRocessing Addressing Modes (DAPRAM):
--
-- o ade_DAPRAM_simm:
-- - DP op2: Register : <rm>
-- - DP op2: Register <SDIR> by Immediate : <rm>, <SDIR> #<imm>
-- - DP op2: Register RRX : <rm>, RRX
-- - <SDIR>: {LSL}|{LSR}|{ASR}|{ROR}
-- o ade_DAPRAM_sreg:
-- - DP op2: Register <SDIR> by Register : <rm>, <SDIR> <rs>
-- - <SDIR>: {LSL}|{LSR}|{ASR}|{ROR}
-- o ade_DAPRAM_immrot:
-- - DP op2: Immediate #<imm>
type ade_DAPRAM is (
ade_DAPRAM_simm, -- OP2 shieft with imm
ade_DAPRAM_sreg, -- OP2 shieft with reg
ade_DAPRAM_immrot -- OP2 immidiate rotated
);
-- Load/Store Addressing Modes (LDSTAM) and Load/Store misc (V4) Addressing Modes (LSV4AM) :
--
-- o adm_LDSTAMxLSV4AM_reg:
-- * <LSV4AM>
-- - L/S W/UB: Register Offset : [<rn>, +/-<rm>]
-- - L/S W/UB: Register Offset pre-indexed : [<rn>, +/-<rm>]!
-- - L/S W/UB: Register Offset post-indexed : [<rn>], +/-<rm>
-- - L/S W/UB: Scaled Register Offset : [<rn>, +/-<rm>, <LSAMscale>]
-- - L/S W/UB: Scaled Register Offset pre-indexed : [<rn>, +/-<rm>, <LSAMscale>]!
-- - L/S W/UB: Scaled Register Offset post-indexed : [<rn>], +/-<rm>, <LSAMscale>
-- - <LSAMscale>: {LSL #<imm>}|{LSR #<imm>}|{ASR #<imm>}|{ROR #<imm>}|{RRX}
-- * <LDSTAM>
-- - L/S MISC: Register offset : [<rn>, #+/-<rm>]
-- - L/S MISC: Register offset pre-index : [<rn>, #+/-<rm>] !
-- - L/S MISC: Register offset post-index : [<rn>], #+/-<rm>
-- o adm_LDSTAMxLSV4AM_imm:
-- * <LSV4AM>
-- - L/S W/UB: Immediate Offset : [<rn>, #+/-<offset12>]
-- - L/S W/UB: Immediate Offset pre-indexed : [<rn>, #+/-<offset12>]!
-- - L/S W/UB: Immediate Offset post-indexed : [<rn>], #+/-<offset12>
-- * <LDSTAM>
-- - L/S MISC: Immediate offset : [<rn>, #+/-<off>]
-- - L/S MISC: Immediate offset pre-index : [<rn>, #+/-<off>] !
-- - L/S MISC: Immediate offset post-index : [<rn>], #+/-<off>
type ade_LDSTAMxLSV4AM is (
ade_LDSTAMxLSV4AM_imm, -- addr v1 imm
-- addr v4 imm
ade_LDSTAMxLSV4AM_reg -- addr v1 reg (shieft with imm)
-- addr v4 reg
);
-- Prefix/Postfix
type ade_pos is (
ade_pre, -- pre indexed
ade_post -- post indexed
);
-- Decoded addressing mode
type ade_amode is record
DAPRAM_typ : ade_DAPRAM;
LDSTAM_typ : ade_LDSTAMxLSV4AM;
LSV4AM_typ : ade_LDSTAMxLSV4AM;
LDSTAMxLSV4AM_pos : ade_pos;
DAPRAMxLDSTAM_sdir : ash_sdir;
LDSTAMxLSV4AM_uacc : std_logic;
LDSTAMxLSV4AM_wb : std_logic;
end record;
-- Decode addressing mode
procedure ade_decode_amode (
insn : in std_logic_vector(31 downto 0);
am : out ade_amode
);
-------------------------------------------------------------------------------
-- Implemented instructions:
type ade_decinsn is (
type_arm_invalid,type_arm_nop, type_arm_mrs, type_arm_bx, type_arm_mul, type_arm_mla,
type_arm_swp, type_arm_sumull, type_arm_sumlal, type_arm_strhb, type_arm_ldrhb, type_arm_and,
type_arm_sub, type_arm_eor, type_arm_rsb, type_arm_add, type_arm_sbc, type_arm_adc,
type_arm_msr, type_arm_teq, type_arm_cmn, type_arm_tst, type_arm_cmp, type_arm_orr,
type_arm_mov, type_arm_mvn, type_arm_str1, type_arm_str2, type_arm_str3, type_arm_ldr1,
type_arm_stm, type_arm_ldm, type_arm_b, type_arm_swi, type_arm_cdp, type_arm_mrc,
type_arm_mcr, type_arm_stc, type_arm_ldc, type_arm_rsc, type_arm_bic, type_arm_undefined
);
-- Instruction groups
type ade_insntyp is (
ade_typmem,
ade_typalu,
ade_typmisc,
ade_typcp
);
-- this decoder is automatically generated by "decgen"
function ade_decode_v4(
insn_in : in std_logic_vector(31 downto 0)
) return ade_decinsn;
-------------------------------------------------------------------------------
-- Condition code
constant ADE_COND_U : integer := 31;
constant ADE_COND_D : integer := 28;
constant ADE_COND_EQ : std_logic_vector(3 downto 0) := "0000";
constant ADE_COND_NE : std_logic_vector(3 downto 0) := "0001";
constant ADE_COND_CS : std_logic_vector(3 downto 0) := "0010";
constant ADE_COND_CC : std_logic_vector(3 downto 0) := "0011";
constant ADE_COND_MI : std_logic_vector(3 downto 0) := "0100";
constant ADE_COND_PL : std_logic_vector(3 downto 0) := "0101";
constant ADE_COND_VS : std_logic_vector(3 downto 0) := "0110";
constant ADE_COND_VC : std_logic_vector(3 downto 0) := "0111";
constant ADE_COND_HI : std_logic_vector(3 downto 0) := "1000";
constant ADE_COND_LS : std_logic_vector(3 downto 0) := "1001";
constant ADE_COND_GE : std_logic_vector(3 downto 0) := "1010";
constant ADE_COND_LT : std_logic_vector(3 downto 0) := "1011";
constant ADE_COND_GT : std_logic_vector(3 downto 0) := "1100";
constant ADE_COND_LE : std_logic_vector(3 downto 0) := "1101";
constant ADE_COND_AL : std_logic_vector(3 downto 0) := "1110";
constant ADE_COND_NV : std_logic_vector(3 downto 0) := "1111";
-------------------------------------------------------------------------------
-- Alu codes
constant ADE_OP_U : integer := 24;
constant ADE_OP_D : integer := 21;
constant ADE_OP_AND : std_logic_vector(3 downto 0) := "0000";
constant ADE_OP_EOR : std_logic_vector(3 downto 0) := "0001";
constant ADE_OP_SUB : std_logic_vector(3 downto 0) := "0010";
constant ADE_OP_RSB : std_logic_vector(3 downto 0) := "0011";
constant ADE_OP_ADD : std_logic_vector(3 downto 0) := "0100";
constant ADE_OP_ADC : std_logic_vector(3 downto 0) := "0101";
constant ADE_OP_SBC : std_logic_vector(3 downto 0) := "0110";
constant ADE_OP_RSC : std_logic_vector(3 downto 0) := "0111";
constant ADE_OP_TST : std_logic_vector(3 downto 0) := "1000";
constant ADE_OP_TEQ : std_logic_vector(3 downto 0) := "1001";
constant ADE_OP_CMP : std_logic_vector(3 downto 0) := "1010";
constant ADE_OP_CMN : std_logic_vector(3 downto 0) := "1011";
constant ADE_OP_ORR : std_logic_vector(3 downto 0) := "1100";
constant ADE_OP_MOV : std_logic_vector(3 downto 0) := "1101";
constant ADE_OP_BIC : std_logic_vector(3 downto 0) := "1110";
constant ADE_OP_MVN : std_logic_vector(3 downto 0) := "1111";
constant ADE_SETCPSR_C : integer := 20; -- set cpsr
-------------------------------------------------------------------------------
-- swp, msr, mrs codes
constant ADE_MSR_R : integer := 22; -- '1' = spsr: '0' = cpsr
constant ADE_MRS_R : integer := 22; -- '1' = spsr: '0' = cpsr
constant ADE_MSR_IMM : integer := 16; -- '1' = imm; '0' = reg
constant ADE_WB_C : integer := 21; -- same as ADE_LDSTAMxLSV4AM_WB
constant ADE_SWPB_C : integer := 22; -- 1=SWPB,0=SWP
constant ADE_BROFF_U : integer := 23; -- branch offset
constant ADE_BROFF_D : integer := 0;
constant ADE_BRLINK_C : integer := 22;
-------------------------------------------------------------------------------
-- ld, st codes
constant ADE_LDSTAM_OFF_U : integer := 11; -- <offset12> of armcmd_l1.vhd LDSSTAM
constant ADE_LDSTAM_OFF_D : integer := 0;
constant ADE_LSV4AM_OFF8_HU : integer := 11; -- <offset8> of armcmd_l4.vhd LSV4AM
constant ADE_LSV4AM_OFF8_HD : integer := 8;
constant ADE_LSV4AM_OFF8_LU : integer := 3;
constant ADE_LSV4AM_OFF8_LD : integer := 0;
constant ADE_LDSTAM_UBYTE : integer := 22; -- '1': unsigned byte, '0': word
constant ADE_LSV4AM_SIGNED : integer := 6; -- '1': unsigned byte, '0': word
constant ADE_LSV4AM_HALF : integer := 5; -- '1': unsigned byte, '0': word
constant ADE_LDSTAMxLSV4AM_ADD : integer := 23; -- '1': add, '0': sub
constant ADE_PAB_U : integer := 24; -- '0': after / '1': before
constant ADE_UID_U : integer := 23; -- '1':increment / '0':decrement
constant ADE_REGLIST_U : integer := 15;
constant ADE_REGLIST_D : integer := 0;
-------------------------------------------------------------------------------
-- coprocessor
constant ADE_MRC_MCR_C : integer := 20; -- '1':MRC '0':MCR
constant ADE_LDC_STC_WB_C : integer := 21; -- '1': writeback '0': nowriteback (ADE_LDSTAMxLSV4AM_WB)
constant ADE_LDC_STC_P_C : integer := 24; -- '1': Post; '0': Pre (negate ADE_LDSTAMxLSV4AM_POS)
-------------------------------------------------------------------------------
-- registers
constant ADE_RN_U : integer := 19;
constant ADE_RN_D : integer := 16;
constant ADE_RD_U : integer := 15;
constant ADE_RD_D : integer := 12;
constant ADE_RM_U : integer := 3;
constant ADE_RM_D : integer := 0;
constant ADE_SREG_U : integer := 11; -- shieft register
constant ADE_SREG_D : integer := 8;
-------------------------------------------------------------------------------
-- festg out insn
type ade_feinsn is record
insn : std_logic_vector(31 downto 0);
pc : std_logic_vector(31 downto 0);
pc_vir : std_logic_vector(31 downto 0);
valid : std_logic;
trap : std_logic;
end record;
-- Decoded insn
type ade_insn is record
pc_8 : std_logic_vector(31 downto 0);
insn : std_logic_vector(31 downto 0);
insntyp : ade_insntyp;
decinsn : ade_decinsn;
am : ade_amode;
valid : std_logic;
id : std_logic_vector(2 downto 0);
end record;
-- destg out insn
type ade_deinsn is record
insn : ade_insn;
trap : std_logic;
end record;
-------------------------------------------------------------------------------
end armdecode;
package body armdecode is
-- Addressing mode decode constants
-- DAPRAM: am.DAPRAM_typ
constant ADE_DAPRAM_TYP : integer := 25; -- '1': imm rot, '0': sreg/simm (shiefted)
constant ADE_DAPRAM_TYP_P : integer := 4; -- shiefted: ('0': imm , '1': reg)
-- LDSTAM: am.LDSTAM_typ
constant ADE_LDSTAM_TYP : integer := 25; -- '0': adm_LDSTAM_imm, '1': adm_LDSTAM_reg (shiefted)
-- LSV4AM: am.LSV4AM_typ
constant ADE_LSV4AM_TYP : integer := 22; -- '1': adm_LSV4AM_imm , '0': adm_LSV4AM_reg
-- DAPRAM, LDSTAM: am.DAPRAMxLDSTAM_sdir
constant ADE_DAPRAMxLDSTAM_SDIR_U : integer := 6; -- shieft type
constant ADE_DAPRAMxLDSTAM_SDIR_D : integer := 5;
constant ADE_DAPRAMxLDSTAM_SDIRNONE_U : integer := 11; -- no shieft
constant ADE_DAPRAMxLDSTAM_SDIRNONE_D : integer := 4;
constant ADE_DAPRAMxLDSTAM_SDIRROR_U : integer := 11; -- ror
constant ADE_DAPRAMxLDSTAM_SDIRROR_D : integer := 7;
-- LDSTAM, LSV4AM: am.LDSTAMxLSV4AM_pos
-- LDSTAM, LSV4AM: am.LDSTAMxLSV4AM_wb
-- LDSTAM, LSV4AM: am.LDSTAMxLSV4AM_uacc
constant ADE_LDSTAMxLSV4AM_POS : integer := 24; -- '0': postindexed, '1': preindexed
constant ADE_LDSTAMxLSV4AM_WB : integer := 21; -- postindexed: 0 = normal, 1 = usermode
procedure ade_decode_amode (
insn : in std_logic_vector(31 downto 0);
am : out ade_amode
) is
variable tmp : std_logic_vector(4 downto 0);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -