library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_arith.all;
|
use ieee.std_logic_arith.all;
|
|
|
package ahb_funct is
|
package ahb_funct is
|
|
|
function nb_bits (A : std_logic_vector) return NATURAL;
|
function nb_bits (A : std_logic_vector) return NATURAL;
|
function nb_bits (A : INTEGER) return NATURAL;
|
function nb_bits (A : INTEGER) return NATURAL;
|
|
|
procedure fixed_priority(
|
procedure fixed_priority(
|
t_turn: out integer;
|
t_turn: out integer;
|
t_grant: out integer;
|
t_grant: out integer;
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer);
|
turn: in integer);
|
procedure round_robin(
|
procedure round_robin(
|
def_elem: in integer;
|
def_elem: in integer;
|
t_turn: out integer;
|
t_turn: out integer;
|
t_grant: out integer;
|
t_grant: out integer;
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer);
|
turn: in integer);
|
procedure random_priority(
|
procedure random_priority(
|
def_elem: in integer;
|
def_elem: in integer;
|
t_turn: out integer;
|
t_turn: out integer;
|
t_grant: out integer;
|
t_grant: out integer;
|
random: in integer;
|
random: in integer;
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer);
|
turn: in integer);
|
|
|
end ahb_funct;
|
end ahb_funct;
|
|
|
package body ahb_funct is
|
package body ahb_funct is
|
|
|
function nb_bits (A : std_logic_vector) return NATURAL is
|
function nb_bits (A : std_logic_vector) return NATURAL is
|
variable logres : NATURAL ;
|
variable logres : NATURAL ;
|
begin
|
begin
|
logres := 1;
|
logres := 1;
|
for i in A'length-1 downto 0 loop
|
for i in A'length-1 downto 0 loop
|
if A(i) = '1' then
|
if A(i) = '1' then
|
logres := i;
|
logres := i;
|
exit;
|
exit;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
return logres;
|
return logres;
|
end nb_bits;
|
end nb_bits;
|
|
|
function nb_bits (A : INTEGER) return NATURAL is
|
function nb_bits (A : INTEGER) return NATURAL is
|
variable logres : NATURAL ;
|
variable logres : NATURAL ;
|
begin
|
begin
|
logres := 1;
|
logres := 1;
|
for i in 0 to 30 loop
|
for i in 0 to 30 loop
|
if 2**i <= A then
|
if 2**i <= A then
|
logres := i+1;
|
logres := i+1;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
return logres;
|
return logres;
|
end nb_bits;
|
end nb_bits;
|
|
|
procedure fixed_priority(
|
procedure fixed_priority(
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_grant: out integer;
|
t_grant: out integer;
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer-- range 0 to num_elem-1
|
turn: in integer-- range 0 to num_elem-1
|
) is
|
) is
|
begin
|
begin
|
t_grant := 0;
|
t_grant := 0;
|
t_turn := 0;
|
t_turn := 0;
|
req_for:for i in req'length-1 downto 0 loop
|
req_for:for i in req'length-1 downto 0 loop
|
if req(i) = '1' then
|
if req(i) = '1' then
|
t_grant := i;
|
t_grant := i;
|
end if;
|
end if;
|
end loop;
|
end loop;
|
end fixed_priority;
|
end fixed_priority;
|
|
|
procedure round_robin(
|
procedure round_robin(
|
def_elem: in integer;
|
def_elem: in integer;
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_grant: out integer;-- range 0 to num_elem-1;
|
t_grant: out integer;-- range 0 to num_elem-1;
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer-- range 0 to num_elem-1
|
turn: in integer-- range 0 to num_elem-1
|
) is
|
) is
|
constant req_size: integer:= req'length;
|
constant req_size: integer:= req'length;
|
variable v_req: std_logic_vector(req_size*2-1 downto 0);
|
variable v_req: std_logic_vector(req_size*2-1 downto 0);
|
type turn_array is array (req_size-1 downto 0) of std_logic_vector(req_size-1 downto 0);
|
type turn_array is array (req_size-1 downto 0) of std_logic_vector(req_size-1 downto 0);
|
variable v_turn: turn_array;
|
variable v_turn: turn_array;
|
begin
|
begin
|
t_grant := def_elem;
|
t_grant := def_elem;
|
t_turn := turn;
|
t_turn := turn;
|
v_req := req&req;--concatenation
|
v_req := req&req;--concatenation
|
for i in 0 to req_size-1 loop
|
for i in 0 to req_size-1 loop
|
v_turn(i) := v_req(i+req_size-1 downto i);
|
v_turn(i) := v_req(i+req_size-1 downto i);
|
end loop;
|
end loop;
|
for j in 0 to req_size-1 loop
|
for j in 0 to req_size-1 loop
|
if j=turn then
|
if j=turn then
|
for jj in 0 to req_size-1 loop
|
for jj in 0 to req_size-1 loop
|
if v_turn(j)(jj)='1' then
|
if v_turn(j)(jj)='1' then
|
if turn+jj >=req'length then
|
if turn+jj >=req'length then
|
t_turn := turn+jj-req_size;
|
t_turn := turn+jj-req_size;
|
t_grant := turn+jj-req_size;
|
t_grant := turn+jj-req_size;
|
else
|
else
|
t_turn := turn+jj;
|
t_turn := turn+jj;
|
t_grant := turn+jj;
|
t_grant := turn+jj;
|
end if;
|
end if;
|
end if;
|
end if;
|
end loop; -- jj
|
end loop; -- jj
|
end if;
|
end if;
|
end loop; -- j
|
end loop; -- j
|
end round_robin;
|
end round_robin;
|
|
|
|
|
procedure random_priority(
|
procedure random_priority(
|
def_elem: in integer;
|
def_elem: in integer;
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_turn: out integer;-- range 0 to num_elem-1;
|
t_grant: out integer;-- range 0 to num_elem-1;
|
t_grant: out integer;-- range 0 to num_elem-1;
|
random: in integer;-- range 0 to 2**(nb_bits(num_elem));
|
random: in integer;-- range 0 to 2**(nb_bits(num_elem));
|
req: in std_logic_vector;
|
req: in std_logic_vector;
|
turn: in integer-- range 0 to num_elem-1
|
turn: in integer-- range 0 to num_elem-1
|
) is
|
) is
|
constant req_size: integer:= req'length;
|
constant req_size: integer:= req'length;
|
variable j, v_turn, upper_limit: integer;
|
variable j, v_turn, upper_limit: integer;
|
begin
|
begin
|
t_grant := def_elem;
|
t_grant := def_elem;
|
upper_limit := 2**(nb_bits(req_size))-1;
|
upper_limit := 2**(nb_bits(req_size))-1;
|
v_turn := turn;
|
v_turn := turn;
|
req_for:for i in upper_limit downto 0 loop
|
req_for:for i in upper_limit downto 0 loop
|
if ((i >= random) and (i <= random+upper_limit)) then
|
if ((i >= random) and (i <= random+upper_limit)) then
|
j := i mod req_size;
|
j := i mod req_size;
|
if req(j) = '1' then
|
if req(j) = '1' then
|
t_grant := j;
|
t_grant := j;
|
if turn=req_size-1 then
|
if turn=req_size-1 then
|
v_turn := 0;
|
v_turn := 0;
|
else
|
else
|
v_turn := turn+1;
|
v_turn := turn+1;
|
end if;
|
end if;
|
end if;
|
end if;
|
t_turn := v_turn;
|
t_turn := v_turn;
|
--synopsys translate_off
|
--synopsys translate_off
|
assert (v_turn>=0 and v_turn<req_size) report "####ERROR: WRONG ARBITRATION!!!" severity failure;
|
assert (v_turn>=0 and v_turn<req_size) report "####ERROR: WRONG ARBITRATION!!!" severity failure;
|
--synopsys translate_on
|
--synopsys translate_on
|
end if;
|
end if;
|
end loop;
|
end loop;
|
end random_priority;
|
end random_priority;
|
|
|
|
|
end ahb_funct;
|
end ahb_funct;
|
|
|
|
|
|
|
|
|