Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
HDL
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RTSD
HDL
Commits
2b15c467
Commit
2b15c467
authored
10 years ago
by
Eric Kooistra
Browse files
Options
Downloads
Patches
Plain Diff
Support g_wr_flush_mode = VAL, SOP, SYN.
parent
066e7fd6
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
libraries/io/ddr/src/vhdl/io_ddr.vhd
+42
-15
42 additions, 15 deletions
libraries/io/ddr/src/vhdl/io_ddr.vhd
libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+35
-22
35 additions, 22 deletions
libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
with
77 additions
and
37 deletions
libraries/io/ddr/src/vhdl/io_ddr.vhd
+
42
−
15
View file @
2b15c467
...
@@ -33,14 +33,13 @@ ENTITY io_ddr IS
...
@@ -33,14 +33,13 @@ ENTITY io_ddr IS
g_technology
:
NATURAL
:
=
c_tech_select_default
;
g_technology
:
NATURAL
:
=
c_tech_select_default
;
g_tech_ddr
:
t_c_tech_ddr
;
g_tech_ddr
:
t_c_tech_ddr
;
g_wr_data_w
:
NATURAL
:
=
32
;
g_wr_data_w
:
NATURAL
:
=
32
;
g_wr_use_ctrl
:
BOOLEAN
:
=
FALSE
;
-- TRUE to allow filling the write FIFO by disabling flush after an EOP
g_wr_fifo_depth
:
NATURAL
:
=
128
;
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_wr_fifo_depth
:
NATURAL
:
=
128
;
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_fifo_depth
:
NATURAL
:
=
256
;
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_fifo_depth
:
NATURAL
:
=
256
;
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_data_w
:
NATURAL
:
=
32
;
g_rd_data_w
:
NATURAL
:
=
32
;
g_flush_mode
:
STRING
:
=
"VAL"
;
-- "VAL", "SOP", "SYN"
g_
wr_
flush_mode
:
STRING
:
=
"VAL"
;
-- "VAL", "SOP", "SYN"
g_flush_use_channel
:
BOOLEAN
:
=
FALSE
;
g_
wr_
flush_use_channel
:
BOOLEAN
:
=
FALSE
;
g_flush_start_channel
:
NATURAL
:
=
0
;
g_
wr_
flush_start_channel
:
NATURAL
:
=
0
;
g_flush_nof_channels
:
POSITIVE
:
=
1
g_
wr_
flush_nof_channels
:
POSITIVE
:
=
1
);
);
PORT
(
PORT
(
-- DDR reference clock
-- DDR reference clock
...
@@ -91,6 +90,10 @@ END io_ddr;
...
@@ -91,6 +90,10 @@ END io_ddr;
ARCHITECTURE
str
OF
io_ddr
IS
ARCHITECTURE
str
OF
io_ddr
IS
CONSTANT
c_wr_use_sync
:
BOOLEAN
:
=
sel_a_b
(
g_wr_flush_mode
=
"SYN"
,
TRUE
,
FALSE
);
CONSTANT
c_wr_use_ctrl
:
BOOLEAN
:
=
sel_a_b
(
g_wr_flush_mode
=
"SOP"
,
TRUE
,
FALSE
);
CONSTANT
c_wr_fifo_use_ctrl
:
BOOLEAN
:
=
c_wr_use_sync
OR
c_wr_use_ctrl
;
CONSTANT
c_ctlr_data_w
:
NATURAL
:
=
func_tech_ddr_ctlr_data_w
(
g_tech_ddr
);
CONSTANT
c_ctlr_data_w
:
NATURAL
:
=
func_tech_ddr_ctlr_data_w
(
g_tech_ddr
);
CONSTANT
c_wr_fifo_depth
:
NATURAL
:
=
g_wr_fifo_depth
*
(
c_ctlr_data_w
/
g_wr_data_w
);
-- get FIFO depth at write side
CONSTANT
c_wr_fifo_depth
:
NATURAL
:
=
g_wr_fifo_depth
*
(
c_ctlr_data_w
/
g_wr_data_w
);
-- get FIFO depth at write side
...
@@ -106,9 +109,13 @@ ARCHITECTURE str OF io_ddr IS
...
@@ -106,9 +109,13 @@ ARCHITECTURE str OF io_ddr IS
SIGNAL
wr_flush
:
STD_LOGIC
:
=
'0'
;
SIGNAL
wr_flush
:
STD_LOGIC
:
=
'0'
;
SIGNAL
wr_fifo_snk_in
:
t_dp_sosi
;
SIGNAL
wr_fifo_src_in
:
t_dp_siso
;
SIGNAL
wr_fifo_src_in
:
t_dp_siso
;
SIGNAL
wr_fifo_src_out
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
SIGNAL
wr_fifo_src_out
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
SIGNAL
wr_flush_snk_in
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
SIGNAL
ctlr_wr_snk_out
:
t_dp_siso
:
=
c_dp_siso_rdy
;
-- default xon='1'
SIGNAL
ctlr_wr_snk_out
:
t_dp_siso
:
=
c_dp_siso_rdy
;
-- default xon='1'
SIGNAL
ctlr_wr_snk_in
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
SIGNAL
ctlr_wr_snk_in
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
...
@@ -124,11 +131,21 @@ BEGIN
...
@@ -124,11 +131,21 @@ BEGIN
dvr_done
<=
i_dvr_done
;
dvr_done
<=
i_dvr_done
;
dvr_wr_fifo_usedw
<=
wr_fifo_usedw
;
dvr_wr_fifo_usedw
<=
wr_fifo_usedw
;
p_wr_fifo_snk_in
:
PROCESS
(
wr_sosi
)
BEGIN
wr_fifo_snk_in
<=
wr_sosi
;
IF
c_wr_use_sync
=
TRUE
THEN
-- Work around : Transport sync via sop through the dp_fifo_dc_mixed_widths
wr_fifo_snk_in
.
sop
<=
wr_sosi
.
sync
;
wr_fifo_snk_in
.
eop
<=
'0'
;
END
IF
;
END
PROCESS
;
u_wr_fifo
:
ENTITY
dp_lib
.
dp_fifo_dc_mixed_widths
u_wr_fifo
:
ENTITY
dp_lib
.
dp_fifo_dc_mixed_widths
GENERIC
MAP
(
GENERIC
MAP
(
g_wr_data_w
=>
g_wr_data_w
,
g_wr_data_w
=>
g_wr_data_w
,
g_rd_data_w
=>
c_ctlr_data_w
,
g_rd_data_w
=>
c_ctlr_data_w
,
g_use_ctrl
=>
g
_wr_use_ctrl
,
g_use_ctrl
=>
c
_wr_
fifo_
use_ctrl
,
g_wr_fifo_size
=>
c_wr_fifo_depth
,
g_wr_fifo_size
=>
c_wr_fifo_depth
,
g_wr_fifo_af_margin
=>
c_wr_fifo_af_margin
,
g_wr_fifo_af_margin
=>
c_wr_fifo_af_margin
,
g_rd_fifo_rl
=>
0
g_rd_fifo_rl
=>
0
...
@@ -140,7 +157,7 @@ BEGIN
...
@@ -140,7 +157,7 @@ BEGIN
rd_clk
=>
ctlr_clk_in
,
rd_clk
=>
ctlr_clk_in
,
snk_out
=>
wr_siso
,
snk_out
=>
wr_siso
,
snk_in
=>
wr_
sosi
,
snk_in
=>
wr_
fifo_snk_in
,
wr_usedw
=>
OPEN
,
wr_usedw
=>
OPEN
,
rd_usedw
=>
wr_fifo_usedw
,
rd_usedw
=>
wr_fifo_usedw
,
...
@@ -149,12 +166,12 @@ BEGIN
...
@@ -149,12 +166,12 @@ BEGIN
src_in
=>
wr_fifo_src_in
,
src_in
=>
wr_fifo_src_in
,
src_out
=>
wr_fifo_src_out
src_out
=>
wr_fifo_src_out
);
);
u_dp_flush
:
ENTITY
dp_lib
.
dp_flush
u_dp_flush
:
ENTITY
dp_lib
.
dp_flush
GENERIC
MAP
(
GENERIC
MAP
(
g_ready_latency
=>
0
,
g_ready_latency
=>
0
,
g_framed_xon
=>
g
_wr_use_ctrl
,
-- stop flushing when wr_flush is low and a sop has arrived
g_framed_xon
=>
c
_wr_
fifo_
use_ctrl
,
-- stop flushing when wr_flush is low and a sop
(or sync via sop)
has arrived
g_framed_xoff
=>
FALSE
-- immediately start flushing when wr_flush goes high
g_framed_xoff
=>
FALSE
-- immediately start flushing when wr_flush goes high
)
)
PORT
MAP
(
PORT
MAP
(
rst
=>
ctlr_rst_in
,
rst
=>
ctlr_rst_in
,
...
@@ -169,12 +186,22 @@ BEGIN
...
@@ -169,12 +186,22 @@ BEGIN
flush_en
=>
wr_flush
flush_en
=>
wr_flush
);
);
p_wr_flush_snk_in
:
PROCESS
(
wr_fifo_src_out
)
BEGIN
wr_flush_snk_in
<=
wr_fifo_src_out
;
IF
c_wr_use_sync
=
TRUE
THEN
-- Work around : Transport sync via sop through the dp_fifo_dc_mixed_widths
wr_flush_snk_in
.
sync
<=
wr_fifo_src_out
.
sop
;
wr_flush_snk_in
.
sop
<=
'0'
;
END
IF
;
END
PROCESS
;
u_io_ddr_driver_flush_ctrl
:
ENTITY
work
.
io_ddr_driver_flush_ctrl
u_io_ddr_driver_flush_ctrl
:
ENTITY
work
.
io_ddr_driver_flush_ctrl
GENERIC
MAP
(
GENERIC
MAP
(
g_mode
=>
g_flush_mode
,
g_mode
=>
g_
wr_
flush_mode
,
g_use_channel
=>
g_flush_use_channel
,
g_use_channel
=>
g_
wr_
flush_use_channel
,
g_start_channel
=>
g_flush_start_channel
,
g_start_channel
=>
g_
wr_
flush_start_channel
,
g_nof_channels
=>
g_flush_nof_channels
g_nof_channels
=>
g_
wr_
flush_nof_channels
)
)
PORT
MAP
(
PORT
MAP
(
rst
=>
ctlr_rst_in
,
rst
=>
ctlr_rst_in
,
...
@@ -185,7 +212,7 @@ BEGIN
...
@@ -185,7 +212,7 @@ BEGIN
dvr_wr_not_rd
=>
dvr_wr_not_rd
,
dvr_wr_not_rd
=>
dvr_wr_not_rd
,
dvr_done
=>
i_dvr_done
,
dvr_done
=>
i_dvr_done
,
wr_sosi
=>
wr_f
ifo_src_out
,
wr_sosi
=>
wr_f
lush_snk_in
,
wr_flush
=>
wr_flush
wr_flush
=>
wr_flush
);
);
...
...
This diff is collapsed.
Click to expand it.
libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+
35
−
22
View file @
2b15c467
...
@@ -44,12 +44,15 @@ USE dp_lib.dp_stream_pkg.ALL;
...
@@ -44,12 +44,15 @@ USE dp_lib.dp_stream_pkg.ALL;
USE
technology_lib
.
technology_select_pkg
.
ALL
;
USE
technology_lib
.
technology_select_pkg
.
ALL
;
USE
tech_ddr_lib
.
tech_ddr_pkg
.
ALL
;
USE
tech_ddr_lib
.
tech_ddr_pkg
.
ALL
;
ENTITY
tb_io_ddr
IS
ENTITY
tb_io_ddr
IS
GENERIC
(
g_nof_repeat
:
NATURAL
:
=
2
;
g_wr_flush_mode
:
STRING
:
=
"SYN"
-- "VAL", "SOP", "SYN"
);
END
ENTITY
tb_io_ddr
;
END
ENTITY
tb_io_ddr
;
ARCHITECTURE
str
of
tb_io_ddr
IS
ARCHITECTURE
str
of
tb_io_ddr
IS
CONSTANT
c_nof_repeat
:
NATURAL
:
=
2
;
CONSTANT
c_ctlr_ref_clk_period
:
TIME
:
=
5
ns
;
-- 200 MHz
CONSTANT
c_ctlr_ref_clk_period
:
TIME
:
=
5
ns
;
-- 200 MHz
CONSTANT
c_dp_clk_period
:
TIME
:
=
5000
ps
;
-- 200 MHz
CONSTANT
c_dp_clk_period
:
TIME
:
=
5000
ps
;
-- 200 MHz
...
@@ -78,9 +81,9 @@ ARCHITECTURE str of tb_io_ddr IS
...
@@ -78,9 +81,9 @@ ARCHITECTURE str of tb_io_ddr IS
CONSTANT
c_rd_fifo_depth
:
NATURAL
:
=
256
;
CONSTANT
c_rd_fifo_depth
:
NATURAL
:
=
256
;
-- Frame size for sop/eop
-- Frame size for sop/eop
CONSTANT
c_wr_flush_mode
:
STRING
:
=
"SOP"
;
-- "VAL", "SOP", "SYN"
CONSTANT
c_wr_use_ctrl
:
BOOLEAN
:
=
sel_a_b
(
c_wr_flush_mode
=
"VAL"
,
FALSE
,
TRUE
);
CONSTANT
c_wr_frame_size
:
NATURAL
:
=
32
;
CONSTANT
c_wr_frame_size
:
NATURAL
:
=
32
;
-- Sync period
CONSTANT
c_wr_sync_period
:
NATURAL
:
=
512
;
SIGNAL
tb_end
:
STD_LOGIC
:
=
'0'
;
SIGNAL
tb_end
:
STD_LOGIC
:
=
'0'
;
SIGNAL
ctlr_ref_clk
:
STD_LOGIC
:
=
'0'
;
SIGNAL
ctlr_ref_clk
:
STD_LOGIC
:
=
'0'
;
...
@@ -154,7 +157,7 @@ BEGIN
...
@@ -154,7 +157,7 @@ BEGIN
-- After reset even when dvr_flush_en='0' then the write FIFO is flushed until the first write access is started
-- After reset even when dvr_flush_en='0' then the write FIFO is flushed until the first write access is started
proc_common_wait_some_cycles
(
ctlr_clk
,
100
);
proc_common_wait_some_cycles
(
ctlr_clk
,
100
);
FOR
R
IN
0
TO
c
_nof_repeat
-1
LOOP
FOR
R
IN
0
TO
g
_nof_repeat
-1
LOOP
FOR
I
IN
c_address_lo_arr
'RANGE
LOOP
FOR
I
IN
c_address_lo_arr
'RANGE
LOOP
v_addr_lo
:
=
func_tech_ddr_dq_address
(
TO_DDR_CTLR_ADDRESS
(
4
*
c_address_lo_arr
(
I
))
,
c_tech_ddr
);
v_addr_lo
:
=
func_tech_ddr_dq_address
(
TO_DDR_CTLR_ADDRESS
(
4
*
c_address_lo_arr
(
I
))
,
c_tech_ddr
);
v_addr_hi
:
=
func_tech_ddr_dq_address
(
TO_DDR_CTLR_ADDRESS
(
4
*
c_address_lo_arr
(
I
)
+
4
*
c_nof_address_arr
(
I
)
-1
),
c_tech_ddr
);
v_addr_hi
:
=
func_tech_ddr_dq_address
(
TO_DDR_CTLR_ADDRESS
(
4
*
c_address_lo_arr
(
I
)
+
4
*
c_nof_address_arr
(
I
)
-1
),
c_tech_ddr
);
...
@@ -231,29 +234,39 @@ BEGIN
...
@@ -231,29 +234,39 @@ BEGIN
p_sop_eop
:
PROCESS
(
diag_wr_src_out
,
wr_val_cnt
)
p_sop_eop
:
PROCESS
(
diag_wr_src_out
,
wr_val_cnt
)
BEGIN
BEGIN
-- Default, fits g_wr_flush_mode="VAL"
wr_src_out
<=
diag_wr_src_out
;
wr_src_out
<=
diag_wr_src_out
;
wr_src_out
.
sop
<=
'0'
;
wr_src_out
.
eop
<=
'0'
;
IF
g_wr_flush_mode
=
"SOP"
THEN
IF
wr_val_cnt
MOD
c_wr_frame_size
=
0
THEN
wr_src_out
.
sop
<=
'0'
;
wr_src_out
.
sop
<=
diag_wr_src_out
.
valid
;
wr_src_out
.
eop
<=
'0'
;
ELSIF
wr_val_cnt
MOD
c_wr_frame_size
=
c_wr_frame_size
-1
THEN
IF
wr_val_cnt
MOD
c_wr_frame_size
=
0
THEN
wr_src_out
.
eop
<=
diag_wr_src_out
.
valid
;
wr_src_out
.
sop
<=
diag_wr_src_out
.
valid
;
ELSIF
wr_val_cnt
MOD
c_wr_frame_size
=
c_wr_frame_size
-1
THEN
wr_src_out
.
eop
<=
diag_wr_src_out
.
valid
;
END
IF
;
END
IF
;
IF
g_wr_flush_mode
=
"SYN"
THEN
wr_src_out
.
sync
<=
'0'
;
IF
wr_val_cnt
MOD
c_wr_sync_period
=
0
THEN
wr_src_out
.
sync
<=
diag_wr_src_out
.
valid
;
END
IF
;
END
IF
;
END
IF
;
END
PROCESS
;
END
PROCESS
;
u_io_ddr
:
ENTITY
work
.
io_ddr
u_io_ddr
:
ENTITY
work
.
io_ddr
GENERIC
MAP
(
GENERIC
MAP
(
g_technology
=>
c_tech_select_default
,
g_technology
=>
c_tech_select_default
,
g_tech_ddr
=>
c_tech_ddr
,
g_tech_ddr
=>
c_tech_ddr
,
g_wr_data_w
=>
c_dp_data_w
,
g_wr_data_w
=>
c_dp_data_w
,
g_wr_use_ctrl
=>
c_wr_use_ctrl
,
-- TRUE to allow filling the write FIFO by disabling flush after an EOP
g_wr_fifo_depth
=>
c_wr_fifo_depth
,
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_wr_fifo_depth
=>
c_wr_fifo_depth
,
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_fifo_depth
=>
c_rd_fifo_depth
,
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_fifo_depth
=>
c_rd_fifo_depth
,
-- >=16 AND >g_tech_ddr.maxburstsize, defined at DDR side of the FIFO.
g_rd_data_w
=>
c_dp_data_w
,
g_rd_data_w
=>
c_dp_data_w
,
g_wr_flush_mode
=>
g_wr_flush_mode
,
g_flush_mode
=>
c_wr_flush_mode
,
-- "VAL", "SOP", "SYN"
g_wr_flush_use_channel
=>
FALSE
,
g_flush_use_channel
=>
FALSE
,
g_wr_flush_start_channel
=>
0
,
g_flush_start_channel
=>
0
,
g_wr_flush_nof_channels
=>
1
g_flush_nof_channels
=>
1
)
)
PORT
MAP
(
PORT
MAP
(
-- DDR reference clock
-- DDR reference clock
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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