📄 armpctrl.vhd
字号:
-- check weather mestg active
function apc_is_mem(
pctrl : apc_pctrl
) return boolean;
-- check weather mestg load
function apc_is_memload(
pctrl : apc_pctrl
) return boolean;
-- check weather str addr (next pctrl will be store data)
function apc_is_straddr(
pctrl : apc_pctrl
) return boolean;
-- check weather str data (prev pctrl was be store addr)
function apc_is_strdata(
pctrl : apc_pctrl
) return boolean;
-------------------------------------------------------------------------------
-- pctrl predicate: register locking
-- check weather it is a mem ldr
function apc_is_rdlocked(
pctrl : apc_pctrl
) return boolean;
-- check weather app_is_rdlocked() + rd compare
function apc_is_rdlocked_by (
rd : std_logic_vector(APM_RREAL_U downto APM_RREAL_D);
pctrl : apc_pctrl
) return boolean;
-- check weather wrstg rd data come from alu
function apc_is_rdfromalu(
pctrl : apc_pctrl
) return boolean;
-------------------------------------------------------------------------------
-- pctrl predicate: cpsr locking
-- check weather rsstg is used
function apc_is_rswillshieft(
pctrl : apc_pctrl
) return boolean;
-- check weather cpsr will be modified
function apc_is_exwillsetcpsr(
pctrl : apc_pctrl
) return boolean;
-- check weather cpsr is used
function apc_is_usecpsr(
pctrl : apc_pctrl
) return boolean;
-------------------------------------------------------------------------------
-- check weather stg should flush
function apc_is_flush(
stgid : std_logic_vector(2 downto 0);
flushid : std_logic_vector(2 downto 0)
) return boolean;
end armpctrl;
package body armpctrl is
function apc_is_valid (
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if pctrl.valid = '1' then
tmp := true;
end if;
return tmp;
end;
function apc_is_branch(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
if (pctrl.wr.wrop_rdvalid = '1') and
(pctrl.wr.wrop_rd = APM_RREAL_PC) then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_rdlocked(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) and
(pctrl.me.meop_enable = '1') and
(pctrl.me.meop_param.read = '1') and
(pctrl.wr.wrop_rdvalid = '1') then
tmp := true;
end if;
return tmp;
end;
function apc_is_rdlocked_by (
rd : std_logic_vector(APM_RREAL_U downto APM_RREAL_D);
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if (pctrl.wr.wrop_rd = rd) and apc_is_rdlocked(pctrl) then
tmp := true;
end if;
return tmp;
end;
function apc_is_rdfromalu(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) and
(not apc_is_memload(pctrl)) and
(pctrl.wr.wrop_rdvalid = '1') then
tmp := true;
end if;
return tmp;
end;
function apc_is_mem(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
if pctrl.me.meop_enable = '1' then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_memload(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_mem(pctrl) then
if pctrl.me.meop_param.read = '1' then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_straddr(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
if (pctrl.me.meop_enable = '1') and
(pctrl.me.meop_param.read = '0') and
(pctrl.me.meop_param.addrin = '1') then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_strdata(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
if (pctrl.me.meop_enable = '1') and
(pctrl.me.meop_param.read = '0') and
(pctrl.me.meop_param.writedata = '1') then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_rswillshieft(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
-- shiefter output used
if pctrl.rs.rsop_op2_src = apc_opsrc_through or
pctrl.rs.rsop_buf2_src = apc_bufsrc_through then
-- shiefter does something
if (pctrl.rs.rsop_styp = ash_styp_simm) or
(pctrl.rs.rsop_styp = ash_styp_sreg) then
if not (pctrl.rs.rsop_sdir = ash_sdir_snone) then
tmp := true;
end if;
end if;
end if;
end if;
return tmp;
end;
function apc_is_exwillsetcpsr(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := apc_is_valid(pctrl) and
(pctrl.ex.exop_setcpsr = '1') ;
return tmp;
end;
function apc_is_usecpsr(
pctrl : apc_pctrl
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if apc_is_valid(pctrl) then
if apc_is_rswillshieft(pctrl) then
tmp := true;
end if;
end if;
return tmp;
end;
function apc_is_flush(
stgid : std_logic_vector(2 downto 0);
flushid : std_logic_vector(2 downto 0)
) return boolean is
variable tmp : boolean;
begin
tmp := false;
if not (stgid = flushid) then
tmp := true;
end if;
return tmp;
end;
end armpctrl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -