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
14
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
3312e191
Commit
3312e191
authored
11 years ago
by
Maciej Lipinski
Browse files
Options
Downloads
Patches
Plain Diff
[swcore/multi-alloc] serious bug-fix: when memory full, single page was allocated to many ports
parent
952523e2
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
+13
-7
13 additions, 7 deletions
.../optimized_new_allocator/swc_multiport_page_allocator.vhd
with
13 additions
and
7 deletions
modules/wrsw_swcore/optimized_new_allocator/swc_multiport_page_allocator.vhd
+
13
−
7
View file @
3312e191
...
...
@@ -311,7 +311,7 @@ begin -- syn
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
);
ports
(
i
)
.
req_alloc
<=
alloc_i
(
i
)
and
(
not
pg_nomem
)
;
ports
(
i
)
.
req_set_usecnt
<=
set_usecnt_i
(
i
);
ports
(
i
)
.
req_free_res_valid
<=
free_resource_valid_i
(
i
);
ports
(
i
)
.
req_f_free_res_valid
<=
force_free_resource_valid_i
(
i
);
...
...
@@ -333,7 +333,7 @@ begin -- syn
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
and
(
not
pg_nomem
))
or
ports
(
i
)
.
req_set_usecnt
);
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
grant_ib_d0
(
i
));
arb_req
(
2
*
i
+
1
)
<=
ports
(
i
)
.
req_ob
and
not
(
ports
(
i
)
.
grant_ob_d
(
0
)
or
grant_ob_d0
(
i
));
...
...
@@ -362,7 +362,7 @@ begin -- syn
set_usecnt
:
=
ports
(
i
)
.
req_set_usecnt
;
tmp_addr_ucnt
:
=
ports
(
i
)
.
req_addr_usecnt
;
tmp_addr_free
:
=
(
others
=>
'X'
);
if
(
ports
(
i
)
.
req_alloc
=
'1'
)
then
if
(
ports
(
i
)
.
req_alloc
=
'1'
)
then
tmp_ucnt_alloc
:
=
ports
(
i
)
.
req_ucnt_alloc
;
else
tmp_ucnt_alloc
:
=
(
others
=>
'X'
);
...
...
@@ -496,10 +496,16 @@ begin -- syn
pgaddr_alloc_o
<=
pg_addr_alloc
;
gen_done
:
for
i
in
0
to
g_num_ports
-1
generate
alloc_done
(
i
)
<=
'1'
when
(
ports
(
i
)
.
req_alloc
=
'1'
and
pg_rsp_vec
(
i
)
=
'1'
and
done_alloc
=
'1'
)
else
'0'
;
free_done
(
i
)
<=
'1'
when
(
ports
(
i
)
.
req_free
=
'1'
and
pg_rsp_vec
(
i
)
=
'1'
and
done_free
=
'1'
)
else
'0'
;
force_free_done
(
i
)
<=
'1'
when
(
ports
(
i
)
.
req_force_free
=
'1'
and
pg_rsp_vec
(
i
)
=
'1'
and
done_force_free
=
'1'
)
else
'0'
;
set_usecnt_done
(
i
)
<=
'1'
when
(
ports
(
i
)
.
req_set_usecnt
=
'1'
and
pg_rsp_vec
(
i
)
=
'1'
and
done_usecnt
=
'1'
)
else
'0'
;
-- when nomem it got lost -> the req_alloc is forced LOW by nomam HIGH, so the alloc which happened just before nomem
-- was not answered...
-- alloc_done(i) <= '1' when (ports(i).req_alloc ='1' and pg_rsp_vec(i)='1' and done_alloc ='1') else '0';
-- free_done(i) <= '1' when (ports(i).req_free ='1' and pg_rsp_vec(i)='1' and done_free ='1') else '0';
-- force_free_done(i) <= '1' when (ports(i).req_force_free='1' and pg_rsp_vec(i)='1' and done_force_free='1') else '0';
-- set_usecnt_done(i) <= '1' when (ports(i).req_set_usecnt='1' and pg_rsp_vec(i)='1' and done_usecnt ='1') else '0';
alloc_done
(
i
)
<=
'1'
when
(
pg_rsp_vec
(
i
)
=
'1'
and
done_alloc
=
'1'
)
else
'0'
;
free_done
(
i
)
<=
'1'
when
(
pg_rsp_vec
(
i
)
=
'1'
and
done_free
=
'1'
)
else
'0'
;
force_free_done
(
i
)
<=
'1'
when
(
pg_rsp_vec
(
i
)
=
'1'
and
done_force_free
=
'1'
)
else
'0'
;
set_usecnt_done
(
i
)
<=
'1'
when
(
pg_rsp_vec
(
i
)
=
'1'
and
done_usecnt
=
'1'
)
else
'0'
;
end
generate
gen_done
;
alloc_done_o
<=
alloc_done
;
...
...
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