Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
W
White Rabbit Switch - Gateware
Manage
Activity
Members
Labels
Plan
Issues
15
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Projects
White Rabbit Switch - Gateware
Commits
b2866ff8
Commit
b2866ff8
authored
11 years ago
by
Maciej Lipinski
Browse files
Options
Downloads
Patches
Plain Diff
[swcore/multi-alloc] addapted to the new alloc - seems to be working
parent
bf779fc2
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
modules/wrsw_swcore/optimized_new_allocator/swc_multiport_page_allocator.vhd
+86
-82
86 additions, 82 deletions
.../optimized_new_allocator/swc_multiport_page_allocator.vhd
with
86 additions
and
82 deletions
modules/wrsw_swcore/optimized_new_allocator/swc_multiport_page_allocator.vhd
+
86
−
82
View file @
b2866ff8
...
...
@@ -58,12 +58,12 @@ entity swc_multiport_page_allocator is
g_page_num
:
integer
:
=
1024
;
--:= c_swc_packet_mem_num_pages
g_usecount_width
:
integer
:
=
3
;
--:= c_swc_usecount_width
--- resource manager
g_max_pck_size
:
integer
;
g_page_size
:
integer
;
g_special_res_num_pages
:
integer
;
g_resource_num
:
integer
;
-- this include 1 for unknown
g_resource_num_width
:
integer
;
g_num_dbg_vector_width
:
integer
g_max_pck_size
:
integer
:
=
759
;
g_page_size
:
integer
:
=
66
;
g_special_res_num_pages
:
integer
:
=
256
;
g_resource_num
:
integer
:
=
3
;
-- this include 1 for unknown
g_resource_num_width
:
integer
:
=
2
;
g_num_dbg_vector_width
:
integer
:
=
10
*
3
);
port
(
rst_n_i
:
in
std_logic
;
...
...
@@ -159,6 +159,10 @@ architecture syn of swc_multiport_page_allocator is
req_free
:
std_logic
;
req_set_usecnt
:
std_logic
;
req_force_free
:
std_logic
;
req_addr_usecnt
:
std_logic_vector
(
g_page_addr_width
-1
downto
0
);
req_addr_free
:
std_logic_vector
(
g_page_addr_width
-1
downto
0
);
req_addr_f_free
:
std_logic_vector
(
g_page_addr_width
-1
downto
0
);
req_ucnt
:
std_logic_vector
(
g_usecount_width
-1
downto
0
);
grant_ib_d
:
std_logic_vector
(
2
downto
0
);
grant_ob_d
:
std_logic_vector
(
2
downto
0
);
...
...
@@ -217,113 +221,115 @@ architecture syn of swc_multiport_page_allocator is
begin
-- syn
gen_arbiter
:
for
i
in
0
to
g_num_ports
-1
generate
gen_records
:
for
i
in
0
to
g_num_ports
-1
generate
ports
(
i
)
.
req_force_free
<=
force_free_i
(
i
);
ports
(
i
)
.
req_free
<=
free_i
(
i
);
ports
(
i
)
.
req_alloc
<=
alloc_i
(
i
)
and
not
(
pg_nomem
);
ports
(
i
)
.
req_alloc
<=
alloc_i
(
i
)
;
--
and not (pg_nomem);
ports
(
i
)
.
req_set_usecnt
<=
set_usecnt_i
(
i
);
ports
(
i
)
.
req_addr_usecnt
<=
pgaddr_usecnt_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
ports
(
i
)
.
req_addr_free
<=
pgaddr_free_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
ports
(
i
)
.
req_addr_f_free
<=
pgaddr_force_free_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
ports
(
i
)
.
req_ucnt
<=
usecnt_i
(
g_usecount_width
*
(
i
+
1
)
-
1
downto
g_usecount_width
*
i
);
end
generate
gen_records
;
process
(
ports
,
arb_req
,
arb_grant
,
pg_done
)
-- MUXes
gen_arbiter
:
for
i
in
0
to
g_num_ports
-1
generate
process
(
ports
,
arb_req
,
arb_grant
,
pg_done
,
pg_nomem
)
begin
ports
(
i
)
.
grant_ib_d
(
0
)
<=
arb_grant
(
2
*
i
);
ports
(
i
)
.
grant_ob_d
(
0
)
<=
arb_grant
(
2
*
i
+
1
);
ports
(
i
)
.
req_ib
<=
(
ports
(
i
)
.
req_alloc
or
ports
(
i
)
.
req_set_usecnt
);
ports
(
i
)
.
req_ob
<=
(
ports
(
i
)
.
req_free
or
ports
(
i
)
.
req_force_free
);
arb_req
(
2
*
i
)
<=
ports
(
i
)
.
req_ib
and
not
(
ports
(
i
)
.
grant_ib_d
(
0
)
or
pg_req_vec_d0
(
i
));
arb_req
(
2
*
i
+
1
)
<=
ports
(
i
)
.
req_ob
and
not
(
ports
(
i
)
.
grant_ob_d
(
0
)
or
pg_req_vec_d0
(
i
));
ports
(
i
)
.
req_ib
<=
((
ports
(
i
)
.
req_alloc
and
(
not
pg_nomem
))
or
ports
(
i
)
.
req_set_usecnt
);
ports
(
i
)
.
req_ob
<=
(
ports
(
i
)
.
req_free
or
ports
(
i
)
.
req_force_free
);
arb_req
(
2
*
i
)
<=
ports
(
i
)
.
req_ib
and
not
(
ports
(
i
)
.
grant_ib_d
(
0
)
or
pg_req_vec_d0
(
i
));
arb_req
(
2
*
i
+
1
)
<=
ports
(
i
)
.
req_ob
and
not
(
ports
(
i
)
.
grant_ob_d
(
0
)
or
pg_req_vec_d0
(
i
));
end
process
;
end
generate
gen_arbiter
;
p_arbitrate
:
process
(
clk_i
)
begin
if
rising_edge
(
clk_i
)
then
if
rst_n_i
=
'0'
then
arb_grant
<=
(
others
=>
'0'
);
else
f_rr_arbitrate
(
arb_req
,
arb_grant
,
arb_grant
);
end
if
;
end
if
;
end
process
;
p_req_vec
:
process
(
clk_i
)
begin
if
rising_edge
(
clk_i
)
then
if
rst_n_i
=
'0'
then
pg_req_vec_d0
<=
(
others
=>
'0'
);
else
for
i
in
0
to
g_num_ports
-1
loop
if
(
pg_req_vec
(
i
)
=
'1'
)
then
pg_req_vec_d0
(
i
)
<=
'1'
;
elsif
(
pg_rsp_vec
(
i
)
=
'1'
and
pg_done
=
'1'
)
then
pg_req_vec_d0
(
i
)
<=
'0'
;
end
if
;
end
loop
;
-- i
end
if
;
end
if
;
end
process
;
-- gen_pg_reqs : for i in 0 to g_num_ports-1 generate
-- -- process(ports)
-- -- begin
-- pg_alloc <= ports(i).req_alloc when (ports(i).grant_ib_d(0) = '1') else '0';
-- pg_set_usecnt <= ports(i).req_set_usecnt when (ports(i).grant_ib_d(0) = '1') else '0';
-- pg_free <= ports(i).req_free when (ports(i).grant_ob_d(0) = '1') else '0';
-- pg_force_free <= ports(i).req_force_free when (ports(i).grant_ob_d(0) = '1') else '0';
-- pg_req_vec(i) <= ports(i).grant_ib_d(0) or ports(i).grant_ob_d(0);
-- pg_addr <= ports(i).req_addr_usecnt when (ports(i).grant_ib_d(0) = '1' and ports(i).req_set_usecnt = '1') else
-- ports(i).req_addr_free when (ports(i).grant_ob_d(0) = '1' and ports(i).req_free = '1') else
-- ports(i).req_addr_f_free when (ports(i).grant_ob_d(0) = '1' and ports(i).req_force_free = '1') else
-- (others => 'X');
-- pg_usecnt <= ports(i).req_ucnt when (ports(i).grant_ib_d(0) = '1' and ports(i).req_set_usecn = '1') else
-- (others => 'X');
-- -- end process;
-- end generate gen_pg_reqs;
p_gen_pg_reqs
:
process
(
ports
)
variable
alloc
,
free
,
force_free
,
set_usecnt
:
std_logic
;
variable
tmp_addr
:
std_logic_vector
(
g_page_addr_width
-1
downto
0
);
variable
tmp_ucnt
:
std_logic_vector
(
g_usecount_width
-1
downto
0
);
begin
alloc
:
=
'0'
;
free
:
=
'0'
;
force_free
:
=
'0'
;
set_usecnt
:
=
'0'
;
tmp_addr
:
=
(
others
=>
'X'
);
tmp_ucnt
:
=
(
others
=>
'X'
);
for
i
in
0
to
g_num_ports
-1
loop
if
(
ports
(
i
)
.
grant_ib_d
(
0
)
=
'1'
)
then
alloc
:
=
ports
(
i
)
.
req_alloc
;
set_usecnt
:
=
ports
(
i
)
.
req_set_usecnt
;
end
if
;
if
(
ports
(
i
)
.
grant_ob_d
(
0
)
=
'1'
)
then
tmp_addr
:
=
ports
(
i
)
.
req_addr_usecnt
;
tmp_ucnt
:
=
ports
(
i
)
.
req_ucnt
;
els
if
(
ports
(
i
)
.
grant_ob_d
(
0
)
=
'1'
)
then
free
:
=
ports
(
i
)
.
req_free
;
force_free
:
=
ports
(
i
)
.
req_force_free
;
if
(
ports
(
i
)
.
req_free
=
'1'
)
then
tmp_addr
:
=
ports
(
i
)
.
req_addr_free
;
tmp_ucnt
:
=
(
others
=>
'X'
);
elsif
(
ports
(
i
)
.
req_force_free
=
'1'
)
then
tmp_addr
:
=
ports
(
i
)
.
req_addr_f_free
;
tmp_ucnt
:
=
(
others
=>
'X'
);
end
if
;
end
if
;
pg_req_vec
(
i
)
<=
ports
(
i
)
.
grant_ib_d
(
0
)
or
ports
(
i
)
.
grant_ob_d
(
0
);
pg_req_vec
(
i
)
<=
ports
(
i
)
.
grant_ib_d
(
0
)
or
ports
(
i
)
.
grant_ob_d
(
0
);
end
loop
;
-- i
pg_alloc
<=
alloc
;
pg_free
<=
free
;
pg_force_free
<=
force_free
;
pg_set_usecnt
<=
set_usecnt
;
pg_addr
<=
tmp_addr
;
pg_usecnt
<=
tmp_ucnt
;
end
process
;
p_mux_addr_usecnt_inputs
:
process
(
ports
,
pgaddr_usecnt_i
,
pgaddr_free_i
,
pgaddr_force_free_i
,
usecnt_i
)
variable
tmp_addr
:
std_logic_vector
(
g_page_addr_width
-1
downto
0
);
variable
tmp_ucnt
:
std_logic_vector
(
g_usecount_width
-1
downto
0
);
p_arbitrate
:
process
(
clk_i
)
begin
tmp_addr
:
=
(
others
=>
'X'
);
tmp_ucnt
:
=
(
others
=>
'X'
);
for
i
in
0
to
g_num_ports
-1
loop
if
(
ports
(
i
)
.
grant_ib_d
(
0
)
=
'1'
)
then
tmp_addr
:
=
pgaddr_usecnt_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
tmp_ucnt
:
=
usecnt_i
(
g_usecount_width
*
(
i
+
1
)
-
1
downto
g_usecount_width
*
i
);
elsif
(
ports
(
i
)
.
grant_ob_d
(
0
)
=
'1'
)
then
if
(
ports
(
i
)
.
req_free
=
'1'
)
then
tmp_addr
:
=
pgaddr_free_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
tmp_ucnt
:
=
(
others
=>
'X'
);
elsif
(
ports
(
i
)
.
req_force_free
=
'1'
)
then
tmp_addr
:
=
pgaddr_force_free_i
(
g_page_addr_width
*
(
i
+
1
)
-1
downto
g_page_addr_width
*
i
);
tmp_ucnt
:
=
(
others
=>
'X'
);
end
if
;
if
rising_edge
(
clk_i
)
then
if
rst_n_i
=
'0'
then
arb_grant
<=
(
others
=>
'0'
);
else
f_rr_arbitrate
(
arb_req
,
arb_grant
,
arb_grant
);
end
if
;
end
loop
;
-- i
pg_addr
<=
tmp_addr
;
pg_usecnt
<=
tmp_ucnt
;
end
if
;
end
process
;
p_req_vec_reg
:
process
(
clk_i
)
begin
if
rising_edge
(
clk_i
)
then
if
rst_n_i
=
'0'
then
pg_req_vec_d0
<=
(
others
=>
'0'
);
else
for
i
in
0
to
g_num_ports
-1
loop
if
(
pg_req_vec
(
i
)
=
'1'
)
then
pg_req_vec_d0
(
i
)
<=
'1'
;
elsif
(
pg_rsp_vec
(
i
)
=
'1'
and
pg_done
=
'1'
)
then
pg_req_vec_d0
(
i
)
<=
'0'
;
end
if
;
end
loop
;
-- i
end
if
;
end
if
;
end
process
;
-- one allocator/deallocator for all ports
...
...
@@ -365,11 +371,10 @@ begin -- syn
set_usecnt_done
(
i
)
<=
'1'
when
(
ports
(
i
)
.
req_set_usecnt
=
'1'
and
pg_rsp_vec
(
i
)
=
'1'
and
pg_done
=
'1'
)
else
'0'
;
end
generate
gen_done
;
alloc_done_o
<=
alloc_done
;
free_done_o
<=
free_done
;
force_free_done_o
<=
force_free_done
;
set_usecnt_done_o
<=
set_usecnt_done
;
alloc_done_o
<=
alloc_done
;
free_done_o
<=
free_done
;
force_free_done_o
<=
force_free_done
;
set_usecnt_done_o
<=
set_usecnt_done
;
free_last_usecnt_o
<=
(
others
=>
pg_free_last_usecnt
);
p_assertions
:
process
(
clk_i
)
...
...
@@ -388,7 +393,6 @@ begin -- syn
end
if
;
end
process
;
--------------------------------------------------------------------------------------------------
-- Resource Manager logic and instantiation
--------------------------------------------------------------------------------------------------
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment