Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x393
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
x393
Commits
6176aa7b
Commit
6176aa7b
authored
Jun 02, 2014
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed DCI and ODT for all tested modes
parent
01028931
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
209 additions
and
112 deletions
+209
-112
.project
.project
+15
-15
ddrc_control.v
ddrc_control.v
+34
-5
ddrc_test01.v
ddrc_test01.v
+21
-4
ddrc_test01_testbench.sav
ddrc_test01_testbench.sav
+18
-13
ddrc_test01_testbench.tf
ddrc_test01_testbench.tf
+91
-61
ddrc_sequencer.v
phy/ddrc_sequencer.v
+4
-0
phy_cmd.v
phy/phy_cmd.v
+6
-2
phy_top.v
phy/phy_top.v
+20
-12
No files found.
.project
View file @
6176aa7b
...
@@ -56,77 +56,77 @@
...
@@ -56,77 +56,77 @@
<link>
<link>
<name>
vivado_logs/VivadoBitstream.log
</name>
<name>
vivado_logs/VivadoBitstream.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoBitstream-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoBitstream-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoOpt.log
</name>
<name>
vivado_logs/VivadoOpt.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOpt-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOpt-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoOptPhys.log
</name>
<name>
vivado_logs/VivadoOptPhys.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOptPhys-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOptPhys-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoOptPower.log
</name>
<name>
vivado_logs/VivadoOptPower.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOptPower-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoOptPower-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoPlace.log
</name>
<name>
vivado_logs/VivadoPlace.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoPlace-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoPlace-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoRoute.log
</name>
<name>
vivado_logs/VivadoRoute.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoRoute-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoRoute-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoSynthesis.log
</name>
<name>
vivado_logs/VivadoSynthesis.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoSynthesis-20140
531222614445
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoSynthesis-20140
602115135083
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoTimimgSummaryReportImplemented.log
</name>
<name>
vivado_logs/VivadoTimimgSummaryReportImplemented.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimimgSummaryReportImplemented-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimimgSummaryReportImplemented-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoTimimgSummaryReportSynthesis.log
</name>
<name>
vivado_logs/VivadoTimimgSummaryReportSynthesis.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimimgSummaryReportSynthesis-20140
531222614445
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimimgSummaryReportSynthesis-20140
602115135083
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoTimingReportImplemented.log
</name>
<name>
vivado_logs/VivadoTimingReportImplemented.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimingReportImplemented-20140
531223145240
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimingReportImplemented-20140
602122428009
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_logs/VivadoTimingReportSynthesis.log
</name>
<name>
vivado_logs/VivadoTimingReportSynthesis.log
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimingReportSynthesis-20140
531222614445
.log
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_logs/VivadoTimingReportSynthesis-20140
602115135083
.log
</location>
</link>
</link>
<link>
<link>
<name>
vivado_state/eddr3-opt-phys.dcp
</name>
<name>
vivado_state/eddr3-opt-phys.dcp
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-opt-phys-20140
531223145240
.dcp
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-opt-phys-20140
602122428009
.dcp
</location>
</link>
</link>
<link>
<link>
<name>
vivado_state/eddr3-place.dcp
</name>
<name>
vivado_state/eddr3-place.dcp
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-place-20140
531223145240
.dcp
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-place-20140
602122428009
.dcp
</location>
</link>
</link>
<link>
<link>
<name>
vivado_state/eddr3-route.dcp
</name>
<name>
vivado_state/eddr3-route.dcp
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-route-20140
531223145240
.dcp
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-route-20140
602122428009
.dcp
</location>
</link>
</link>
<link>
<link>
<name>
vivado_state/eddr3-synth.dcp
</name>
<name>
vivado_state/eddr3-synth.dcp
</name>
<type>
1
</type>
<type>
1
</type>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-synth-20140
531222614445
.dcp
</location>
<location>
/data/vdt/vdt-projects/eddr3/vivado_state/eddr3-synth-20140
602115135083
.dcp
</location>
</link>
</link>
</linkedResources>
</linkedResources>
</projectDescription>
</projectDescription>
ddrc_control.v
View file @
6176aa7b
...
@@ -41,14 +41,19 @@ module ddrc_control #(
...
@@ -41,14 +41,19 @@ module ddrc_control #(
parameter
WBUF_DELAY_REL_MASK
=
'h3ff
,
// address mask to set extra delay
parameter
WBUF_DELAY_REL_MASK
=
'h3ff
,
// address mask to set extra delay
parameter
PAGES_REL
=
'h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter
PAGES_REL
=
'h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter
PAGES_REL_MASK
=
'h3ff
,
// address mask to set DQM and DQS patterns
parameter
PAGES_REL_MASK
=
'h3ff
,
// address mask to set DQM and DQS patterns
parameter
CMDA_EN_REL
=
'h024
,
// address to enable('h82
3)/disable('h822
) command/address outputs
parameter
CMDA_EN_REL
=
'h024
,
// address to enable('h82
5)/disable('h824
) command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
SDRST_ACT_REL
=
'h026
,
// address to activate('h82
5)/deactivate('h8242
) active-low reset signal to DDR3 memory
parameter
SDRST_ACT_REL
=
'h026
,
// address to activate('h82
7)/deactivate('h826
) active-low reset signal to DDR3 memory
parameter
SDRST_ACT_REL_MASK
=
'h3fe
,
// address mask for reset DDR3
parameter
SDRST_ACT_REL_MASK
=
'h3fe
,
// address mask for reset DDR3
parameter
CKE_EN_REL
=
'h028
,
// address to enable('h82
7)/disable('h826
) CKE signal to memory
parameter
CKE_EN_REL
=
'h028
,
// address to enable('h82
9)/disable('h828
) CKE signal to memory
parameter
CKE_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
CKE_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
EXTRA_REL
=
'h02a
,
// address to set extra parameters (currently just inv_clk_div)
parameter
DCI_RST_REL
=
'h02a
,
// address to activate('h82b)/deactivate('h82a) Zynq DCI calibrate circuitry
parameter
DCI_RST_REL_MASK
=
'h3fe
,
// address mask for DCI calibrate circuitry
parameter
DLY_RST_REL
=
'h02c
,
// address to activate('h82d)/deactivate('h82c) delay calibration circuitry
parameter
DLY_RST_REL_MASK
=
'h3fe
,
// address mask for delay calibration circuitry
parameter
EXTRA_REL
=
'h02e
,
// address to set extra parameters (currently just inv_clk_div)
parameter
EXTRA_REL_MASK
=
'h3ff
// address mask for extra parameters
parameter
EXTRA_REL_MASK
=
'h3ff
// address mask for extra parameters
)(
)(
input
clk
,
input
clk
,
input
mclk
,
input
mclk
,
...
@@ -73,6 +78,8 @@ module ddrc_control #(
...
@@ -73,6 +78,8 @@ module ddrc_control #(
// control: additional signals
// control: additional signals
output
cmda_en
,
// tri-state all command and address lines to DDR chip
output
cmda_en
,
// tri-state all command and address lines to DDR chip
output
ddr_rst
,
// generate DDR3 memory reset signal
output
ddr_rst
,
// generate DDR3 memory reset signal
output
dci_rst
,
// active high - reset DCI circuitry
output
dly_rst
,
// active high - delay calibration circuitry
output
ddr_cke
,
// control DDR3 memory CKE signal
output
ddr_cke
,
// control DDR3 memory CKE signal
output
inv_clk_div
,
// invert clk_div to ISERDES
output
inv_clk_div
,
// invert clk_div to ISERDES
...
@@ -118,6 +125,13 @@ module ddrc_control #(
...
@@ -118,6 +125,13 @@ module ddrc_control #(
localparam
SDRST_ACT_ADDR
=
CONTROL_ADDR
|
SDRST_ACT_REL
;
// address to activate('h825)/deactivate('h8242) active-low reset signal to DDR3 memory
localparam
SDRST_ACT_ADDR
=
CONTROL_ADDR
|
SDRST_ACT_REL
;
// address to activate('h825)/deactivate('h8242) active-low reset signal to DDR3 memory
localparam
SDRST_ACT_ADDR_MASK
=
CONTROL_ADDR_MASK
|
SDRST_ACT_REL_MASK
;
// address mask for reset DDR3
localparam
SDRST_ACT_ADDR_MASK
=
CONTROL_ADDR_MASK
|
SDRST_ACT_REL_MASK
;
// address mask for reset DDR3
localparam
DCI_RST_ADDR
=
CONTROL_ADDR
|
DCI_RST_REL
;
// address to activate/deactivate Zynq DCI calibrate circuitry
localparam
DCI_RST_ADDR_MASK
=
CONTROL_ADDR_MASK
|
DCI_RST_REL_MASK
;
// address mask for DCI calibrate circuitry
localparam
DLY_RST_ADDR
=
CONTROL_ADDR
|
DLY_RST_REL
;
// address to activate/deactivate delay calibration circuitry
localparam
DLY_RST_ADDR_MASK
=
CONTROL_ADDR_MASK
|
DLY_RST_REL_MASK
;
// address mask for delay calibration circuitry
localparam
CKE_EN_ADDR
=
CONTROL_ADDR
|
CKE_EN_REL
;
// address to enable('h827)/disable('h826) CKE signal to memory
localparam
CKE_EN_ADDR
=
CONTROL_ADDR
|
CKE_EN_REL
;
// address to enable('h827)/disable('h826) CKE signal to memory
localparam
CKE_EN_ADDR_MASK
=
CONTROL_ADDR_MASK
|
CKE_EN_REL_MASK
;
// address mask for CKE
localparam
CKE_EN_ADDR_MASK
=
CONTROL_ADDR_MASK
|
CKE_EN_REL_MASK
;
// address mask for CKE
...
@@ -147,6 +161,8 @@ module ddrc_control #(
...
@@ -147,6 +161,8 @@ module ddrc_control #(
reg
[
1
:
0
]
port1_int_page_r
;
// port 1 PHY-side buffer read page (to be controlled by arbiter later, set to 2'b0)
reg
[
1
:
0
]
port1_int_page_r
;
// port 1 PHY-side buffer read page (to be controlled by arbiter later, set to 2'b0)
reg
cmda_en_r
;
// enable (tri-state off) all command and address lines to DDR chip
reg
cmda_en_r
;
// enable (tri-state off) all command and address lines to DDR chip
reg
ddr_rst_r
;
// generate DDR3 memory reset
reg
ddr_rst_r
;
// generate DDR3 memory reset
reg
dci_rst_r
;
// active high - reset DCI circuitry
reg
dly_rst_r
;
// active high - reset delay calibration circuitry
reg
ddr_cke_r
;
// enable CKE to memory
reg
ddr_cke_r
;
// enable CKE to memory
reg
inv_clk_div_r
;
// invert clk_div to ISERDES
reg
inv_clk_div_r
;
// invert clk_div to ISERDES
...
@@ -179,7 +195,10 @@ module ddrc_control #(
...
@@ -179,7 +195,10 @@ module ddrc_control #(
assign
port1_page
=
port1_page_r
[
1
:
0
]
;
assign
port1_page
=
port1_page_r
[
1
:
0
]
;
assign
port1_int_page
=
port1_int_page_r
[
1
:
0
]
;
assign
port1_int_page
=
port1_int_page_r
[
1
:
0
]
;
assign
cmda_en
=
cmda_en_r
;
assign
cmda_en
=
cmda_en_r
;
assign
ddr_rst
=
ddr_rst_r
;
assign
ddr_rst
=
ddr_rst_r
;
assign
dci_rst
=
dci_rst_r
;
assign
dly_rst
=
dly_rst_r
;
assign
ddr_cke
=
ddr_cke_r
;
assign
ddr_cke
=
ddr_cke_r
;
assign
inv_clk_div
=
inv_clk_div_r
;
assign
inv_clk_div
=
inv_clk_div_r
;
...
@@ -235,6 +254,16 @@ module ddrc_control #(
...
@@ -235,6 +254,16 @@ module ddrc_control #(
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
SDRST_ACT_ADDR
)
&
SDRST_ACT_ADDR_MASK
)
==
0
))
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
SDRST_ACT_ADDR
)
&
SDRST_ACT_ADDR_MASK
)
==
0
))
ddr_rst_r
<=
waddr_fifo_out
[
0
]
;
ddr_rst_r
<=
waddr_fifo_out
[
0
]
;
if
(
rst
)
dci_rst_r
<=
1'b0
;
// reset DCI circuitry off (it is ORed with rst later)
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
DCI_RST_ADDR
)
&
DCI_RST_ADDR_MASK
)
==
0
))
dci_rst_r
<=
waddr_fifo_out
[
0
]
;
if
(
rst
)
dly_rst_r
<=
1'b0
;
// reset DCI circuitry off (it is ORed with rst later)
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
DLY_RST_ADDR
)
&
DLY_RST_ADDR_MASK
)
==
0
))
dly_rst_r
<=
waddr_fifo_out
[
0
]
;
if
(
rst
)
ddr_cke_r
<=
1'b0
;
if
(
rst
)
ddr_cke_r
<=
1'b0
;
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
CKE_EN_ADDR
)
&
CKE_EN_ADDR_MASK
)
==
0
))
else
if
(
fifo_re
&&
(((
waddr_fifo_out
^
CKE_EN_ADDR
)
&
CKE_EN_ADDR_MASK
)
==
0
))
ddr_cke_r
<=
waddr_fifo_out
[
0
]
;
ddr_cke_r
<=
waddr_fifo_out
[
0
]
;
...
...
ddrc_test01.v
View file @
6176aa7b
...
@@ -83,13 +83,17 @@ module ddrc_test01 #(
...
@@ -83,13 +83,17 @@ module ddrc_test01 #(
parameter
WBUF_DELAY_REL_MASK
=
'h3ff
,
// address mask to set extra delay
parameter
WBUF_DELAY_REL_MASK
=
'h3ff
,
// address mask to set extra delay
parameter
PAGES_REL
=
'h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter
PAGES_REL
=
'h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter
PAGES_REL_MASK
=
'h3ff
,
// address mask to set DQM and DQS patterns
parameter
PAGES_REL_MASK
=
'h3ff
,
// address mask to set DQM and DQS patterns
parameter
CMDA_EN_REL
=
'h024
,
// address to enable('h82
3)/disable('h822
) command/address outputs
parameter
CMDA_EN_REL
=
'h024
,
// address to enable('h82
5)/disable('h824
) command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
SDRST_ACT_REL
=
'h026
,
// address to activate('h82
5)/deactivate('h8242
) active-low reset signal to DDR3 memory
parameter
SDRST_ACT_REL
=
'h026
,
// address to activate('h82
7)/deactivate('h826
) active-low reset signal to DDR3 memory
parameter
SDRST_ACT_REL_MASK
=
'h3fe
,
// address mask for reset DDR3
parameter
SDRST_ACT_REL_MASK
=
'h3fe
,
// address mask for reset DDR3
parameter
CKE_EN_REL
=
'h028
,
// address to enable('h82
7)/disable('h826
) CKE signal to memory
parameter
CKE_EN_REL
=
'h028
,
// address to enable('h82
9)/disable('h828
) CKE signal to memory
parameter
CKE_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
CKE_EN_REL_MASK
=
'h3fe
,
// address mask for command/address outputs
parameter
EXTRA_REL
=
'h02a
,
// address to set extra parameters (currently just inv_clk_div)
parameter
DCI_RST_REL
=
'h02a
,
// address to activate('h82b)/deactivate('h82a) Zynq DCI calibrate circuitry
parameter
DCI_RST_REL_MASK
=
'h3fe
,
// address mask for DCI calibrate circuitry
parameter
DLY_RST_REL
=
'h02a
,
// address to activate('h82d)/deactivate('h82c) delay calibration circuitry
parameter
DLY_RST_REL_MASK
=
'h3fe
,
// address mask for delay calibration circuitry
parameter
EXTRA_REL
=
'h02e
,
// address to set extra parameters (currently just inv_clk_div)
parameter
EXTRA_REL_MASK
=
'h3ff
// address mask for extra parameters
parameter
EXTRA_REL_MASK
=
'h3ff
// address mask for extra parameters
)(
)(
// DDR3 interface
// DDR3 interface
...
@@ -225,6 +229,11 @@ module ddrc_test01 #(
...
@@ -225,6 +229,11 @@ module ddrc_test01 #(
// additional control signals
// additional control signals
wire
cmda_en
;
// enable DDR3 memory control and addreee outputs
wire
cmda_en
;
// enable DDR3 memory control and addreee outputs
wire
ddr_rst
;
// generate DDR3 memory reset (active hight)
wire
ddr_rst
;
// generate DDR3 memory reset (active hight)
wire
dci_rst
;
// active high - reset DCI circuitry
wire
dly_rst
;
// active high - reset delay calibration circuitry
wire
ddr_cke
;
// control of the DDR3 memory CKE signal
wire
ddr_cke
;
// control of the DDR3 memory CKE signal
wire
inv_clk_div
;
// input
wire
inv_clk_div
;
// input
...
@@ -384,6 +393,10 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
...
@@ -384,6 +393,10 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
.
SDRST_ACT_REL_MASK
(
SDRST_ACT_REL_MASK
)
,
.
SDRST_ACT_REL_MASK
(
SDRST_ACT_REL_MASK
)
,
.
CKE_EN_REL
(
CKE_EN_REL
)
,
.
CKE_EN_REL
(
CKE_EN_REL
)
,
.
CKE_EN_REL_MASK
(
CKE_EN_REL_MASK
)
,
.
CKE_EN_REL_MASK
(
CKE_EN_REL_MASK
)
,
.
DCI_RST_REL
(
DCI_RST_REL
)
,
.
DCI_RST_REL_MASK
(
DCI_RST_REL_MASK
)
,
.
DLY_RST_REL
(
DLY_RST_REL
)
,
.
DLY_RST_REL_MASK
(
DLY_RST_REL_MASK
)
,
.
EXTRA_REL
(
EXTRA_REL
)
,
.
EXTRA_REL
(
EXTRA_REL
)
,
.
EXTRA_REL_MASK
(
EXTRA_REL_MASK
)
.
EXTRA_REL_MASK
(
EXTRA_REL_MASK
)
)
ddrc_control_i
(
)
ddrc_control_i
(
...
@@ -405,6 +418,8 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
...
@@ -405,6 +418,8 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
.
dly_set
(
set
)
,
// output
.
dly_set
(
set
)
,
// output
.
cmda_en
(
cmda_en
)
,
// output
.
cmda_en
(
cmda_en
)
,
// output
.
ddr_rst
(
ddr_rst
)
,
// output
.
ddr_rst
(
ddr_rst
)
,
// output
.
dci_rst
(
dci_rst
)
,
// output
.
dly_rst
(
dly_rst
)
,
// output
.
ddr_cke
(
ddr_cke
)
,
// output
.
ddr_cke
(
ddr_cke
)
,
// output
.
inv_clk_div
(
inv_clk_div
)
,
// output
.
inv_clk_div
(
inv_clk_div
)
,
// output
.
dqs_pattern
(
dqs_pattern
[
7
:
0
])
,
// output[7:0]
.
dqs_pattern
(
dqs_pattern
[
7
:
0
])
,
// output[7:0]
...
@@ -532,6 +547,8 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
...
@@ -532,6 +547,8 @@ BUFG bufg_axi_aclk_i (.O(axi_aclk),.I(fclk[0]));
.
port1_data
(
axiwr_bram_wdata
[
31
:
0
])
,
// input[31:0]
.
port1_data
(
axiwr_bram_wdata
[
31
:
0
])
,
// input[31:0]
.
cmda_en
(
cmda_en
)
,
// input
.
cmda_en
(
cmda_en
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
dci_rst
(
dci_rst
)
,
// input
.
dly_rst
(
dly_rst
)
,
// input
.
ddr_cke
(
ddr_cke
)
,
// input
.
ddr_cke
(
ddr_cke
)
,
// input
.
inv_clk_div
(
inv_clk_div
)
,
// input
.
inv_clk_div
(
inv_clk_div
)
,
// input
.
dqs_pattern
(
dqs_pattern
)
,
// input[7:0]
.
dqs_pattern
(
dqs_pattern
)
,
// input[7:0]
...
...
ddrc_test01_testbench.sav
View file @
6176aa7b
[*]
[*]
[*] GTKWave Analyzer v3.3.49 (w)1999-2013 BSI
[*] GTKWave Analyzer v3.3.49 (w)1999-2013 BSI
[*]
Sun Jun 1 23:19:02
2014
[*]
Mon Jun 2 06:48:00
2014
[*]
[*]
[dumpfile] "/data/vdt/vdt-projects/eddr3/simulation/ddrc_test01_testbench-2014060
1171040635
.lxt"
[dumpfile] "/data/vdt/vdt-projects/eddr3/simulation/ddrc_test01_testbench-2014060
2003755521
.lxt"
[dumpfile_mtime] "
Sun Jun 1 23:14:06
2014"
[dumpfile_mtime] "
Mon Jun 2 06:40:41
2014"
[dumpfile_size] 76
198101
[dumpfile_size] 76
024228
[savefile] "/data/vdt/vdt-projects/eddr3/ddrc_test01_testbench.sav"
[savefile] "/data/vdt/vdt-projects/eddr3/ddrc_test01_testbench.sav"
[timestart] 1
167729
00
[timestart] 1
023600
00
[size] 1920 1180
[size] 1920 1180
[pos] 0 108
[pos] 0 108
*-
16.459938 116901250
114486875 114489375 114571875 114574375 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
*-
22.533184 131161875
114486875 114489375 114571875 114574375 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] ddrc_test01_testbench.
[treeopen] ddrc_test01_testbench.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.axibram_read_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.axibram_read_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_control_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_control_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].dq_i.
[treeopen] ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].dq_i.
...
@@ -36,9 +37,9 @@
...
@@ -36,9 +37,9 @@
[treeopen] ddrc_test01_testbench.simul_axi_master_rdaddr_i.
[treeopen] ddrc_test01_testbench.simul_axi_master_rdaddr_i.
[treeopen] ddrc_test01_testbench.simul_axi_master_wraddr_i.
[treeopen] ddrc_test01_testbench.simul_axi_master_wraddr_i.
[sst_width] 334
[sst_width] 334
[signals_width] 40
7
[signals_width] 40
3
[sst_expanded] 1
[sst_expanded] 1
[sst_vpaned_height]
820
[sst_vpaned_height]
755
@28
@28
ddrc_test01_testbench.RST[0]
ddrc_test01_testbench.RST[0]
ddrc_test01_testbench.CLK[0]
ddrc_test01_testbench.CLK[0]
...
@@ -1306,8 +1307,12 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.set[0]
...
@@ -1306,8 +1307,12 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.set[0]
-ddrc_sequencer
-ddrc_sequencer
@800200
@800200
-ddr_sequencer_i_selected
-ddr_sequencer_i_selected
@c00200
-tristate_control
-tristate_control
@28
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.SDODT[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dci_disable_dqs[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dci_disable_dq[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_dci_in[0]
@22
@22
ddrc_test01_testbench.ddrc_test01_i.ddrc_control_i.dqs_tri_pattern_r[15:0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_control_i.dqs_tri_pattern_r[15:0]
@28
@28
...
@@ -1332,7 +1337,7 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_dq_tri_in[0]
...
@@ -1332,7 +1337,7 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_dq_tri_in[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_dq_tri[7:0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_dq_tri[7:0]
@28
@28
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].dq_i.iobufs_dqs_i.T[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.byte_lane0_i.dq_block[0].dq_i.iobufs_dqs_i.T[0]
@1
401
200
@1
000
200
-tristate_control
-tristate_control
@28
@28
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.sdclk[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.phy_cmd_i.phy_top_i.sdclk[0]
...
@@ -1391,7 +1396,7 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_clk[0]
...
@@ -1391,7 +1396,7 @@ ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_clk[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_data[31:0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_data[31:0]
@28
@28
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_we[0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd0_we[0]
@2
3
@2
2
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd_addr[9:0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd_addr[9:0]
@800028
@800028
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd_busy[2:0]
ddrc_test01_testbench.ddrc_test01_i.ddrc_sequencer_i.cmd_busy[2:0]
...
@@ -1822,7 +1827,7 @@ ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.wdata_i.we[0]
...
@@ -1822,7 +1827,7 @@ ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.wdata_i.we[0]
ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.wdata_i.wem[0]
ddrc_test01_testbench.ddrc_test01_i.axibram_write_i.wdata_i.wem[0]
@1401200
@1401200
-wdata_i
-wdata_i
@
8
00200
@
c
00200
-axibram_read_i
-axibram_read_i
@28
@28
ddrc_test01_testbench.ddrc_test01_i.axibram_read_i.aclk[0]
ddrc_test01_testbench.ddrc_test01_i.axibram_read_i.aclk[0]
...
@@ -1922,7 +1927,7 @@ ddrc_test01_testbench.SIMUL_AXI_FULL[0]
...
@@ -1922,7 +1927,7 @@ ddrc_test01_testbench.SIMUL_AXI_FULL[0]
ddrc_test01_testbench.rstb[0]
ddrc_test01_testbench.rstb[0]
@200
@200
-
-
@1
000
200
@1
401
200
-axibram_read_i
-axibram_read_i
@c00200
@c00200
-ddrc_status
-ddrc_status
...
...
ddrc_test01_testbench.tf
View file @
6176aa7b
...
@@ -42,7 +42,7 @@ module ddrc_test01_testbench #(
...
@@ -42,7 +42,7 @@ module ddrc_test01_testbench #(
parameter
CLKFBOUT_MULT_REF
=
9
,
// Fvco=Fclkin*CLKFBOUT_MULT_F/DIVCLK_DIVIDE, Fout=Fvco/CLKOUT#_DIVIDE
parameter
CLKFBOUT_MULT_REF
=
9
,
// Fvco=Fclkin*CLKFBOUT_MULT_F/DIVCLK_DIVIDE, Fout=Fvco/CLKOUT#_DIVIDE
parameter
CLKFBOUT_DIV_REF
=
3
,
// To get 300MHz for the reference clock
parameter
CLKFBOUT_DIV_REF
=
3
,
// To get 300MHz for the reference clock
`
endif
`
endif
parameter
DIVCLK_DIVIDE
=
1
,
//
| 3
parameter
DIVCLK_DIVIDE
=
1
,
//
parameter
CLKFBOUT_PHASE
=
0.000
,
parameter
CLKFBOUT_PHASE
=
0.000
,
parameter
SDCLK_PHASE
=
0.000
,
parameter
SDCLK_PHASE
=
0.000
,
parameter
CLK_PHASE
=
0.000
,
parameter
CLK_PHASE
=
0.000
,
...
@@ -83,13 +83,17 @@ module ddrc_test01_testbench #(
...
@@ -83,13 +83,17 @@ module ddrc_test01_testbench #(
parameter
WBUF_DELAY_REL_MASK
=
'h3ff, // address mask to set extra delay
parameter
WBUF_DELAY_REL_MASK
=
'h3ff, // address mask to set extra delay
parameter PAGES_REL = '
h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter PAGES_REL = '
h023
,
// address to set buffer pages {port1_page[1:0],port1_int_page[1:0],port0_page[1:0],port0_int_page[1:0]}
parameter
PAGES_REL_MASK
=
'h3ff, // address mask to set DQM and DQS patterns
parameter
PAGES_REL_MASK
=
'h3ff, // address mask to set DQM and DQS patterns
parameter CMDA_EN_REL = '
h024
,
// address to enable('h82
3)/disable('h822
) command/address outputs
parameter CMDA_EN_REL = '
h024
,
// address to enable('h82
5)/disable('h824
) command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe, // address mask for command/address outputs
parameter
CMDA_EN_REL_MASK
=
'h3fe, // address mask for command/address outputs
parameter SDRST_ACT_REL = '
h026
,
// address to activate('h82
5)/deactivate('h8242
) active-low reset signal to DDR3 memory
parameter SDRST_ACT_REL = '
h026
,
// address to activate('h82
7)/deactivate('h826
) active-low reset signal to DDR3 memory
parameter
SDRST_ACT_REL_MASK
=
'h3fe, // address mask for reset DDR3
parameter
SDRST_ACT_REL_MASK
=
'h3fe, // address mask for reset DDR3
parameter CKE_EN_REL = '
h028
,
// address to enable('h82
7)/disable('h826
) CKE signal to memory
parameter CKE_EN_REL = '
h028
,
// address to enable('h82
9)/disable('h828
) CKE signal to memory
parameter
CKE_EN_REL_MASK
=
'h3fe, // address mask for command/address outputs
parameter
CKE_EN_REL_MASK
=
'h3fe, // address mask for command/address outputs
parameter EXTRA_REL = '
h02a
,
// address to set extra parameters (currently just inv_clk_div)
parameter DCI_RST_REL = '
h02a
,
// address to activate('h82b)/deactivate('h82a) Zynq DCI calibrate circuitry
parameter
DCI_RST_REL_MASK
=
'h3fe, // address mask for DCI calibrate circuitry
parameter DLY_RST_REL = '
h02a
,
// address to activate('h82d)/deactivate('h82c) delay calibration circuitry
parameter
DLY_RST_REL_MASK
=
'h3fe, // address mask for delay calibration circuitry
parameter EXTRA_REL = '
h02e
,
// address to set extra parameters (currently just inv_clk_div)
parameter
EXTRA_REL_MASK
=
'h3ff, // address mask for extra parameters
parameter
EXTRA_REL_MASK
=
'h3ff, // address mask for extra parameters
// simulation-specific parameters
// simulation-specific parameters
...
@@ -128,8 +132,14 @@ module ddrc_test01_testbench #(
...
@@ -128,8 +132,14 @@ module ddrc_test01_testbench #(
localparam BASEADDR_CMDA_EN = BASEADDR_CTRL | (CMDA_EN_REL<<2); // 'h024, address to enable('h825)/disable('h824) command/address outputs
localparam BASEADDR_CMDA_EN = BASEADDR_CTRL | (CMDA_EN_REL<<2); // 'h024, address to enable('h825)/disable('h824) command/address outputs
localparam BASEADDR_SDRST_ACT = BASEADDR_CTRL | (SDRST_ACT_REL<<2); // 'h026 address to activate('h827)/deactivate('h826) active-low reset signal to DDR3 memory
localparam BASEADDR_SDRST_ACT = BASEADDR_CTRL | (SDRST_ACT_REL<<2); // 'h026 address to activate('h827)/deactivate('h826) active-low reset signal to DDR3 memory
localparam BASEADDR_CKE_EN = BASEADDR_CTRL | (CKE_EN_REL<<2); // 'h028
localparam BASEADDR_CKE_EN = BASEADDR_CTRL | (CKE_EN_REL<<2); // 'h028
// SuppressWarnings VEditor
localparam BASEADDR_DCI_RST = BASEADDR_CTRL | (DCI_RST_REL<<2); // 'h02a (+1 - enable)
// SuppressWarnings VEditor
localparam BASEADDR_DLY_RST = BASEADDR_CTRL | (DLY_RST_REL<<2); // 'h02c (+1 - enable)
// SuppressWarnings VEditor
// SuppressWarnings VEditor
localparam BASEADDR_EXTRA = BASEADDR_CTRL | (EXTRA_REL<<2); // 'h02
a
, address to set extra parameters (currently just inv_clk_div)
localparam BASEADDR_EXTRA = BASEADDR_CTRL | (EXTRA_REL<<2); // 'h02
e
, address to set extra parameters (currently just inv_clk_div)
localparam BASEADDRESS_LANE0_ODELAY = BASEADDR_DLY_LD;
localparam BASEADDRESS_LANE0_ODELAY = BASEADDR_DLY_LD;
localparam BASEADDRESS_LANE0_IDELAY = BASEADDR_DLY_LD+('h10<<2);
localparam BASEADDRESS_LANE0_IDELAY = BASEADDR_DLY_LD+('h10<<2);
...
@@ -583,9 +593,12 @@ assign bresp= ddrc_test01_i.ps7_i.MAXIGP0BRESP;
...
@@ -583,9 +593,12 @@ assign bresp= ddrc_test01_i.ps7_i.MAXIGP0BRESP;
.SDRST_ACT_REL_MASK (SDRST_ACT_REL_MASK),
.SDRST_ACT_REL_MASK (SDRST_ACT_REL_MASK),
.CKE_EN_REL (CKE_EN_REL),
.CKE_EN_REL (CKE_EN_REL),
.CKE_EN_REL_MASK (CKE_EN_REL_MASK),
.CKE_EN_REL_MASK (CKE_EN_REL_MASK),
.DCI_RST_REL (DCI_RST_REL),
.DCI_RST_REL_MASK (DCI_RST_REL_MASK),
.DLY_RST_REL (DLY_RST_REL),
.DLY_RST_REL_MASK (DLY_RST_REL_MASK),
.EXTRA_REL (EXTRA_REL),
.EXTRA_REL (EXTRA_REL),
.EXTRA_REL_MASK (EXTRA_REL_MASK)
.EXTRA_REL_MASK (EXTRA_REL_MASK)
) ddrc_test01_i (
) ddrc_test01_i (
.SDRST (SDRST), // DDR3 reset (active low)
.SDRST (SDRST), // DDR3 reset (active low)
.SDCLK (SDCLK), // output
.SDCLK (SDCLK), // output
...
@@ -1070,7 +1083,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1070,7 +1083,7 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(5,0); // tMOD
data <= encode_seq_skip(5,0
,0,0
); // tMOD
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1201,7 +1214,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1201,7 +1214,7 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(2,0
); // tWR = 15ns (6 cycles for 2.5ns) from end of write (not write command)
data <= encode_seq_skip(2,0
,1,0); // keep dci enabled
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1218,19 +1231,37 @@ simul_axi_read simul_axi_read_i(
...
@@ -1218,19 +1231,37 @@ simul_axi_read simul_axi_read_i(
1'b0, // phy_dq_en_in;
1'b0, // phy_dq_en_in;
1'b0, // phy_dqs_en_in;
1'b0, // phy_dqs_en_in;
1'b0, // phy_dqs_toggle_en;
1'b0, // phy_dqs_toggle_en;
1'b
0
, // phy_dci_en_in; // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b
1
, // phy_dci_en_in; // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b0, // phy_buf_wr; // connect to external buffer
1'b0, // phy_buf_wr; // connect to external buffer
1'b0, // phy_buf_rd; // connect to external buffer
1'b0, // phy_buf_rd; // connect to external buffer
1'b0); // add NOP after the current command, keep other data
1'b0); // add NOP after the current command, keep other data
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(5,0); // tMOD
data <= encode_seq_skip(5,0,1,0 ); // tMOD (keep DCI enabled)
@(posedge CLK)
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
// Turn off DCI
data <= encode_seq_word(
15'h0, // [14:0] phy_addr_in;
mr3_norm[17:15], // [ 2:0] phy_bank_in; //TODO: debug!
3'b000, // [ 2:0] phy_rcw_in; // {ras,cas,we}, positive
1'b0, // phy_odt_in; // may be optimized?
1'b0, // phy_cke_inv; // may be optimized?
1'b0, // phy_sel_in == 1;
1'b0, // phy_dq_en_in;
1'b0, // phy_dqs_en_in;
1'b0, // phy_dqs_toggle_en;
1'b0, // phy_dci_en_in;
1'b0, // phy_buf_wr; // connect to external buffer
1'b0, // phy_buf_rd; // connect to external buffer
1'b0); // add NOP after the current command, keep other data
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(0,1
); // end of sequence
data <= encode_seq_skip(0,1
,0,0); // end of sequence (no dci, no odt)
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1268,7 +1299,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1268,7 +1299,7 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// see if pause is needed . See when buffer read should be started - maybe before WR command
// see if pause is needed . See when buffer read should be started - maybe before WR command
data <= encode_seq_skip(1,0
); // tRCD
data <= encode_seq_skip(1,0
,0,0);
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1398,12 +1429,13 @@ simul_axi_read simul_axi_read_i(
...
@@ -1398,12 +1429,13 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// tRTP = 4*tCK is already satisfied, no skip here
data <= encode_seq_skip(2,0); // tWR = 15ns (6 cycles for 2.5ns) from end of write (not write command)
/*
data <= encode_seq_skip(1,0,1,0); // keep DCI // What delay is needed tRTP (4 tCK or 7.5ns)
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
*/
// precharge
// precharge
data <= {
data <= {
ra[14:0],
ra[14:0],
...
@@ -1415,7 +1447,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1415,7 +1447,7 @@ simul_axi_read simul_axi_read_i(
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_toggle_en;
1'b0, // phy_dqs_toggle_en;
1'b
0, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b
1, // phy_dci_en_in, // keep DCI enabled
1'b0, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // add NOP after the current command, keep other data
1'b0, // add NOP after the current command, keep other data
...
@@ -1425,12 +1457,12 @@ simul_axi_read simul_axi_read_i(
...
@@ -1425,12 +1457,12 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(2,0
); //
data <= encode_seq_skip(2,0
,1,0); // keep DCI
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(0,1
); // end of sequence
data <= encode_seq_skip(0,1
,0,0); // end of sequence . TODO: verify DCI is disabled here - yes, OK
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1468,7 +1500,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1468,7 +1500,7 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// see if pause is needed . See when buffer read should be started - maybe before WR command
// see if pause is needed . See when buffer read should be started - maybe before WR command
data <= encode_seq_skip(1,0); // tRCD
data <= encode_seq_skip(1,0
,0,0
); // tRCD
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1478,8 +1510,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1478,8 +1510,8 @@ simul_axi_read simul_axi_read_i(
{5'b0,ca[9:0]},
{5'b0,ca[9:0]},
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b011, // phy_rcw_in[2:0], // {ras,cas,we}
3'b011, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b1, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1498,8 +1530,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1498,8 +1530,8 @@ simul_axi_read simul_axi_read_i(
15'b0, // skip 0
15'b0, // skip 0
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1521,8 +1553,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1521,8 +1553,8 @@ simul_axi_read simul_axi_read_i(
{5'b0,ca[9:0]} + (i<<3),
{5'b0,ca[9:0]} + (i<<3),
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b011, // phy_rcw_in[2:0], // {ras,cas,we}
3'b011, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b1, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1544,7 +1576,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1544,7 +1576,7 @@ simul_axi_read simul_axi_read_i(
15'b0, // skip 0
15'b0, // skip 0
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0
, // phy_odt_in, // may be optimized?
1'b
1
, // phy_odt_in, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1564,8 +1596,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1564,8 +1596,8 @@ simul_axi_read simul_axi_read_i(
15'b0, // skip 0
15'b0, // skip 0
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1585,8 +1617,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1585,8 +1617,8 @@ simul_axi_read simul_axi_read_i(
15'b0, // skip 0
15'b0, // skip 0
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
3'b000, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1600,13 +1632,13 @@ simul_axi_read simul_axi_read_i(
...
@@ -1600,13 +1632,13 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// ODT off, it has latency
data <= encode_seq_skip(2,0); // tWR = 15ns (6 cycles for 2.5ns) from end of write (not write command)
data <= encode_seq_skip(2,0
,0,0
); // tWR = 15ns (6 cycles for 2.5ns) from end of write (not write command)
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// precharge
// precharge
, ODT off
data <= {
data <= {
ra[14:0],
ra[14:0],
ba[2:0], //phy_bank_in[2:0],
ba[2:0], //phy_bank_in[2:0],
...
@@ -1627,12 +1659,12 @@ simul_axi_read simul_axi_read_i(
...
@@ -1627,12 +1659,12 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(2,0); //
data <= encode_seq_skip(2,0
,0,0
); //
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(0,1); // end of sequence
data <= encode_seq_skip(0,1
,0,0
); // end of sequence
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1687,7 +1719,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1687,7 +1719,7 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(13,0); // tWLDQSEN=25tCK
data <= encode_seq_skip(13,0
,0,0
); // tWLDQSEN=25tCK
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1697,8 +1729,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -1697,8 +1729,8 @@ simul_axi_read simul_axi_read_i(
dqs_low_rpt, // 16 tCK
dqs_low_rpt, // 16 tCK
3'b0, //phy_bank_in[2:0],
3'b0, //phy_bank_in[2:0],
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0, // phy_odt_in, // may be optimized?
1'b
1, // phy_odt_in,
1'b0, // phy_cke_inv,
// may be optimized?
1'b0, // phy_cke_inv,
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -1712,10 +1744,6 @@ simul_axi_read simul_axi_read_i(
...
@@ -1712,10 +1744,6 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// data <= encode_seq_skip(2,0); // Adjust skip
// @(posedge CLK)
// axi_write_single(cmd_addr, data);
// cmd_addr <= cmd_addr + 4;
// Toggle DQS as needed for write leveling, write to buffer
// Toggle DQS as needed for write leveling, write to buffer
data <= { // encode_seq_skip(nrep,0); // Adjust skip
data <= { // encode_seq_skip(nrep,0); // Adjust skip
...
@@ -1723,13 +1751,13 @@ simul_axi_read simul_axi_read_i(
...
@@ -1723,13 +1751,13 @@ simul_axi_read simul_axi_read_i(
nrep_minus_1[CMD_PAUSE_BITS-1:0],
nrep_minus_1[CMD_PAUSE_BITS-1:0],
3'b0, //phy_bank_in[2:0],
3'b0, //phy_bank_in[2:0],
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0
, // phy_odt_in, // may be optimized?
1'b
1
, // phy_odt_in, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_toggle_en;
1'b1, // phy_dqs_toggle_en;
1'b
0
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b
1
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b1, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b1, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // add NOP after the current command, keep other data
1'b0, // add NOP after the current command, keep other data
...
@@ -1743,13 +1771,13 @@ simul_axi_read simul_axi_read_i(
...
@@ -1743,13 +1771,13 @@ simul_axi_read simul_axi_read_i(
15'h4, // 4 cycles
15'h4, // 4 cycles
3'b0, //phy_bank_in[2:0],
3'b0, //phy_bank_in[2:0],
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
1'b
0
, // phy_odt_in, // may be optimized?
1'b
1
, // phy_odt_in, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_cke_inv, // may be optimized?
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_en_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b1, // phy_dqs_toggle_en;
1'b1, // phy_dqs_toggle_en;
1'b
0
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b
1
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b0, // phy_buf_wr, // no write
1'b0, // phy_buf_wr, // no write
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // add NOP after the current command, keep other data
1'b0, // add NOP after the current command, keep other data
...
@@ -1760,14 +1788,14 @@ simul_axi_read simul_axi_read_i(
...
@@ -1760,14 +1788,14 @@ simul_axi_read simul_axi_read_i(
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(2,0
); // Adjust skip
data <= encode_seq_skip(2,0
,1,1); // Keep DCI and ODT active
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// exit write leveling mode
// exit write leveling mode
, ODT off, DCI off
data <= encode_seq_word(
data <= encode_seq_word(
mr1_norm[14:0], // [14:0] phy_addr_in;
mr1_norm[14:0], // [14:0] phy_addr_in;
mr1_norm[17:15], // [ 2:0] phy_bank_in; //TODO: debug!
mr1_norm[17:15], // [ 2:0] phy_bank_in; //TODO: debug!
...
@@ -1786,12 +1814,12 @@ simul_axi_read simul_axi_read_i(
...
@@ -1786,12 +1814,12 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(5,0); // tMOD
data <= encode_seq_skip(5,0
,0,0
); // tMOD
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// Ready for normal operation
// Ready for normal operation
data <= encode_seq_skip(10,1); // sequence done bit, skip length is ignored
data <= encode_seq_skip(10,1
,0,0
); // sequence done bit, skip length is ignored
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1857,7 +1885,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1857,7 +1885,7 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(1,0); // 6 cycles between mrs commands
data <= encode_seq_skip(1,0
,0,0
); // 6 cycles between mrs commands
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1879,7 +1907,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1879,7 +1907,7 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// TODO: function - does not check arguments number
// TODO: function - does not check arguments number
data <= encode_seq_skip(0,0); // 5 cycles between mrs commands (next command has phy_sel_in == 1)
data <= encode_seq_skip(0,0
,0,0
); // 5 cycles between mrs commands (next command has phy_sel_in == 1)
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1901,7 +1929,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1901,7 +1929,7 @@ simul_axi_read simul_axi_read_i(
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(2,0); // 7 cycles between mrs commands ( prev. command had phy_sel_in == 1)
data <= encode_seq_skip(2,0
,0,0
); // 7 cycles between mrs commands ( prev. command had phy_sel_in == 1)
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1924,7 +1952,7 @@ simul_axi_read simul_axi_read_i(
...
@@ -1924,7 +1952,7 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(5,0); // tMOD = 12 CK or 15ns, (tMOD/2)-1
data <= encode_seq_skip(5,0
,0,0
); // tMOD = 12 CK or 15ns, (tMOD/2)-1
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -1947,12 +1975,12 @@ simul_axi_read simul_axi_read_i(
...
@@ -1947,12 +1975,12 @@ simul_axi_read simul_axi_read_i(
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
data <= encode_seq_skip(256,0); // 512 clock cycles after ZQCL
data <= encode_seq_skip(256,0
,0,0
); // 512 clock cycles after ZQCL
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
// Ready for normal operation
// Ready for normal operation
data <= encode_seq_skip(10,1); // sequence done bit, skip length is ignored
data <= encode_seq_skip(10,1
,0,0
); // sequence done bit, skip length is ignored
@(posedge CLK)
@(posedge CLK)
axi_write_single(cmd_addr, data);
axi_write_single(cmd_addr, data);
cmd_addr <= cmd_addr + 4;
cmd_addr <= cmd_addr + 4;
...
@@ -2023,6 +2051,8 @@ simul_axi_read simul_axi_read_i(
...
@@ -2023,6 +2051,8 @@ simul_axi_read simul_axi_read_i(
function [31:0] encode_seq_skip;
function [31:0] encode_seq_skip;
input [CMD_PAUSE_BITS-1:0] skip;
input [CMD_PAUSE_BITS-1:0] skip;
input done;
input done;
input dci_en;
input odt_en;
begin
begin
encode_seq_skip={
encode_seq_skip={
{14-CMD_DONE_BIT{1'b0}},
{14-CMD_DONE_BIT{1'b0}},
...
@@ -2030,13 +2060,13 @@ simul_axi_read simul_axi_read_i(
...
@@ -2030,13 +2060,13 @@ simul_axi_read simul_axi_read_i(
skip[CMD_PAUSE_BITS-1:0],
skip[CMD_PAUSE_BITS-1:0],
3'b0, //phy_bank_in[2:0],
3'b0, //phy_bank_in[2:0],
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
3'b0, // phy_rcw_in[2:0], // {ras,cas,we}
1'b0, // phy_odt_in, // may be optimized?
odt_en, // phy_odt_in,
1'b0, // phy_cke_in, // may be optimized?
1'b0, // phy_cke_in, // may be optimized?
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_sel_in, // first/second half-cycle, other will be nop (cke+odt applicable to both)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dq_en_in, //phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, //phy_dqs_tri_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b0, // phy_dqs_en_in, //phy_dqs_tri_in, // tristate DQS lines (internal timing sequencer for 0->1 and 1->0)
1'b0, //enable toggle DQS according to the pattern
1'b0, //enable toggle DQS according to the pattern
1'b0
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
dci_en
, // phy_dci_en_in, //phy_dci_in, // DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
1'b0, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_wr, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // phy_buf_rd, // connect to external buffer (but only if not paused)
1'b0, // add NOP after the current command, keep other data
1'b0, // add NOP after the current command, keep other data
...
...
phy/ddrc_sequencer.v
View file @
6176aa7b
...
@@ -111,6 +111,8 @@ module ddrc_sequencer #(
...
@@ -111,6 +111,8 @@ module ddrc_sequencer #(
// extras
// extras
input
cmda_en
,
// enable (!tristate) command and address lines // not likely to be used
input
cmda_en
,
// enable (!tristate) command and address lines // not likely to be used
input
ddr_rst
,
// generate reset to DDR3 memory (active high)
input
ddr_rst
,
// generate reset to DDR3 memory (active high)
input
dci_rst
,
// active high - reset DCI circuitry
input
dly_rst
,
// active high - delay calibration circuitry
input
ddr_cke
,
// DDR clock enable , XOR-ed with command bit
input
ddr_cke
,
// DDR clock enable , XOR-ed with command bit
input
inv_clk_div
,
input
inv_clk_div
,
input
[
7
:
0
]
dqs_pattern
,
// 8'h55
input
[
7
:
0
]
dqs_pattern
,
// 8'h55
...
@@ -380,6 +382,8 @@ module ddrc_sequencer #(
...
@@ -380,6 +382,8 @@ module ddrc_sequencer #(
.
buf_rd
(
buf_rd
)
,
// output
.
buf_rd
(
buf_rd
)
,
// output
.
cmda_en
(
cmda_en
)
,
// input
.
cmda_en
(
cmda_en
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
dci_rst
(
dci_rst
)
,
// input
.
dly_rst
(
dly_rst
)
,
// input
.
ddr_cke
(
ddr_cke
)
,
// input
.
ddr_cke
(
ddr_cke
)
,
// input
.
inv_clk_div
(
inv_clk_div
)
,
// input
.
inv_clk_div
(
inv_clk_div
)
,
// input
.
dqs_pattern
(
dqs_pattern
)
,
// input[7:0]
.
dqs_pattern
(
dqs_pattern
)
,
// input[7:0]
...
...
phy/phy_cmd.v
View file @
6176aa7b
...
@@ -97,6 +97,8 @@ module phy_cmd#(
...
@@ -97,6 +97,8 @@ module phy_cmd#(
// input cmda_tri, // tristate command and address lines // not likely to be used
// input cmda_tri, // tristate command and address lines // not likely to be used
input
cmda_en
,
// tristate command and address lines // not likely to be used
input
cmda_en
,
// tristate command and address lines // not likely to be used
input
ddr_rst
,
// generate reset to DDR3 memory (active high)
input
ddr_rst
,
// generate reset to DDR3 memory (active high)
input
dci_rst
,
// active high - reset DCI circuitry
input
dly_rst
,
// active high - delay calibration circuitry
input
ddr_cke
,
// DDR clock enable , XOR-ed with command bit
input
ddr_cke
,
// DDR clock enable , XOR-ed with command bit
input
inv_clk_div
,
input
inv_clk_div
,
input
[
7
:
0
]
dqs_pattern
,
// 8'h55
input
[
7
:
0
]
dqs_pattern
,
// 8'h55
...
@@ -180,7 +182,7 @@ module phy_cmd#(
...
@@ -180,7 +182,7 @@ module phy_cmd#(
phy_addr_in
,
phy_addr_in
,
phy_bank_in
,
phy_bank_in
,
phy_rcw_pos
,
// {ras,cas,we}
phy_rcw_pos
,
// {ras,cas,we}
phy_odt_in
,
//
may be optimized?
phy_odt_in
,
//
phy_cke_dis
,
// disable cke (0 - enable), also controlled by a command bit ddr_cke (XOR-ed)
phy_cke_dis
,
// disable cke (0 - enable), also controlled by a command bit ddr_cke (XOR-ed)
phy_sel_in
,
// fitst/second half-cycle, oter will be nop (cke+odt applicable to both)
phy_sel_in
,
// fitst/second half-cycle, oter will be nop (cke+odt applicable to both)
phy_dq_en_in
,
//phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
phy_dq_en_in
,
//phy_dq_tri_in, // tristate DQ lines (internal timing sequencer for 0->1 and 1->0)
...
@@ -248,7 +250,7 @@ module phy_cmd#(
...
@@ -248,7 +250,7 @@ module phy_cmd#(
assign
phy_dqs_tri
=
(
dqs_tri_prev
==
phy_dqs_tri_in
)
?{{
8
{
phy_dqs_tri_in
}}}:
assign
phy_dqs_tri
=
(
dqs_tri_prev
==
phy_dqs_tri_in
)
?{{
8
{
phy_dqs_tri_in
}}}:
(
dqs_tri_prev
?{
dqs_tri_on_pattern
,
dqs_tri_on_pattern
}:{
dqs_tri_off_pattern
,
dqs_tri_off_pattern
}
)
;
(
dqs_tri_prev
?{
dqs_tri_on_pattern
,
dqs_tri_on_pattern
}:{
dqs_tri_off_pattern
,
dqs_tri_off_pattern
}
)
;
assign
phy_dci_dis_dq
=
phy_dci_in
;
// DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
assign
phy_dci_dis_dq
=
phy_dci_in
;
// DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
assign
phy_dci_dis_dqs
=
phy_dci_in
;
// DCI disable, both DQ and DQS lines (internal logic and timing sequencer for 0->1 and 1->0)
assign
phy_dci_dis_dqs
=
phy_dci_in
||
phy_odt_cur
;
// In write leveling mode phy_dci_in = 0, phy_odt_cur=1 - use DCI on DQ only, no DQS
assign
locked
=
locked_r2
;
assign
locked
=
locked_r2
;
assign
ps_rdy
=
ps_rdy_r2
;
assign
ps_rdy
=
ps_rdy_r2
;
...
@@ -380,6 +382,8 @@ module phy_cmd#(
...
@@ -380,6 +382,8 @@ module phy_cmd#(
.
rst_in
(
rst_in
)
,
// input
.
rst_in
(
rst_in
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
ddr_rst
(
ddr_rst
)
,
// input
.
dci_rst
(
dci_rst
)
,
// input
.
dly_rst
(
dly_rst
)
,
// input
.
in_a
(
phy_addr
[
2
*
ADDRESS_NUMBER
-
1
:
0
])
,
// input[29:0]
.
in_a
(
phy_addr
[
2
*
ADDRESS_NUMBER
-
1
:
0
])
,
// input[29:0]
.
in_ba
(
phy_bank
[
5
:
0
])
,
// input[5:0]
.
in_ba
(
phy_bank
[
5
:
0
])
,
// input[5:0]
.
in_we
(
{
phy_rcw
[
3
]
,
phy_rcw
[
0
]
}
)
,
// input[1:0]
.
in_we
(
{
phy_rcw
[
3
]
,
phy_rcw
[
0
]
}
)
,
// input[1:0]
...
...
phy/phy_top.v
View file @
6176aa7b
...
@@ -77,6 +77,9 @@ module phy_top #(
...
@@ -77,6 +77,9 @@ module phy_top #(
output
mclk
,
// same as clk_div, through separate BUFG and static phase adjust
output
mclk
,
// same as clk_div, through separate BUFG and static phase adjust
input
rst_in
,
// reset delays/serdes
input
rst_in
,
// reset delays/serdes
input
ddr_rst
,
// active high - generate NRST to memory
input
ddr_rst
,
// active high - generate NRST to memory
input
dci_rst
,
// active high - reset DCI circuitry
input
dly_rst
,
// active high - delay calibration circuitry
input
[
2
*
ADDRESS_NUMBER
-
1
:
0
]
in_a
,
// input address, 2 bits per signal (first, second) (29:0) for 4Gb device
input
[
2
*
ADDRESS_NUMBER
-
1
:
0
]
in_a
,
// input address, 2 bits per signal (first, second) (29:0) for 4Gb device
input
[
5
:
0
]
in_ba
,
// input bank address, 2 bits per signal (first, second)
input
[
5
:
0
]
in_ba
,
// input bank address, 2 bits per signal (first, second)
input
[
1
:
0
]
in_we
,
// input WE, 2 bits (first, second)
input
[
1
:
0
]
in_we
,
// input WE, 2 bits (first, second)
...
@@ -108,7 +111,8 @@ module phy_top #(
...
@@ -108,7 +111,8 @@ module phy_top #(
output
[
PHASE_WIDTH
-
1
:
0
]
ps_out
output
[
PHASE_WIDTH
-
1
:
0
]
ps_out
)
;
)
;
reg
rst
=
1'b0
;
reg
rst
=
1'b0
;
always
@
(
posedge
clk_div
or
posedge
rst_in
)
begin
// always @(posedge clk_div or posedge rst_in) begin // got min hold violation
always
@
(
negedge
clk_div
or
posedge
rst_in
)
begin
if
(
rst_in
)
rst
<=
1'b1
;
if
(
rst_in
)
rst
<=
1'b1
;
else
rst
<=
1'b0
;
else
rst
<=
1'b0
;
end
end
...
@@ -118,8 +122,8 @@ module phy_top #(
...
@@ -118,8 +122,8 @@ module phy_top #(
wire
ld_mmcm
=
(
dly_addr
[
6
:
0
]
==
7'h60
)
&&
ld_delay
;
wire
ld_mmcm
=
(
dly_addr
[
6
:
0
]
==
7'h60
)
&&
ld_delay
;
wire
clkfb_ref
,
clk_ref_pre
;
wire
clkfb_ref
,
clk_ref_pre
;
wire
clk_ref
;
// 200MHz/300Mhz to calibrate I/O delays
wire
clk_ref
;
// 200MHz/300Mhz to calibrate I/O delays
wire
locked_mmcm
,
locked_pll
,
dly_ready
;
wire
locked_mmcm
,
locked_pll
,
dly_ready
,
dci_ready
;
assign
locked
=
locked_mmcm
&&
locked_pll
&&
dly_ready
;
// both PLL ready, I/O delay calibrated
assign
locked
=
locked_mmcm
&&
locked_pll
&&
dly_ready
&&
dci_ready
;
// both PLL ready, I/O delay calibrated
/* memory reset */
/* memory reset */
obuf
#(
obuf
#(
...
@@ -345,15 +349,19 @@ BUFG mclk_i (.O(mclk),.I(mclk_pre) );
...
@@ -345,15 +349,19 @@ BUFG mclk_i (.O(mclk),.I(mclk_pre) );
.
clkfbout
(
clkfb_ref
)
,
// output
.
clkfbout
(
clkfb_ref
)
,
// output
.
locked
(
locked_pll
)
// output
.
locked
(
locked_pll
)
// output
)
;
)
;
// Does it need to be re-calibrated periodically
?
// Does it need to be re-calibrated periodically
- yes when temperature changes, same as dci_reset
idelay_ctrl
#
(
idelay_ctrl
#
(
.
IODELAY_GRP
(
"IODELAY_MEMORY"
)
.
IODELAY_GRP
(
"IODELAY_MEMORY"
)
)
idelay_ctrl_i
(
)
idelay_ctrl_i
(
.
refclk
(
clk_ref
)
,
.
refclk
(
clk_ref
)
,
.
rst
(
rst
)
,
.
rst
(
rst
||
dly_
rst
)
,
.
rdy
(
dly_ready
)
.
rdy
(
dly_ready
)
)
;
)
;
dci_reset
dci_reset_i
(
.
reset
(
rst
||
dci_rst
)
,
// input
.
ready
(
dci_ready
)
// output
)
;
endmodule
endmodule
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment