Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x393_sata
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_sata
Commits
fb82aa54
Commit
fb82aa54
authored
Feb 15, 2016
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eliminated all phy errors, working on remaining in ll
parent
78da3183
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1253 additions
and
191 deletions
+1253
-191
.project
.project
+17
-17
ahci_fis_receive.v
ahci/ahci_fis_receive.v
+3
-3
ahci_fis_transmit.v
ahci/ahci_fis_transmit.v
+1
-1
ahci_fsm.v
ahci/ahci_fsm.v
+1
-1
ahci_sata_layers.v
ahci/ahci_sata_layers.v
+73
-37
ahci_top.v
ahci/ahci_top.v
+20
-8
freq_meter.v
ahci/freq_meter.v
+67
-0
sata_ahci_top.v
ahci/sata_ahci_top.v
+19
-5
action_decoder.v
generated/action_decoder.v
+1
-1
condition_mux.v
generated/condition_mux.v
+1
-1
ahci_fsm_sequence.py
helpers/ahci_fsm_sequence.py
+5
-2
elastic1632.v
host/elastic1632.v
+54
-29
gtx_8x10enc.v
host/gtx_8x10enc.v
+1
-0
gtx_wrap.v
host/gtx_wrap.v
+7
-4
link.v
host/link.v
+138
-13
sata_phy.v
host/sata_phy.v
+12
-5
ahxi_fsm_code.vh
includes/ahxi_fsm_code.vh
+2
-2
x393sata.py
py393sata/x393sata.py
+41
-5
tb_ahci_01.sav
tb_ahci_01.sav
+790
-57
No files found.
.project
View file @
fb82aa54
...
...
@@ -52,87 +52,87 @@
<link>
<name>
vivado_logs/VivadoBitstream.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoBitstream-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoBitstream-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoOpt.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOpt-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOpt-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoOptPhys.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOptPhys-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOptPhys-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoOptPower.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOptPower-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoOptPower-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoPlace.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoPlace-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoPlace-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoRoute.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoRoute-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoRoute-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoSynthesis.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoSynthesis-2016021
301201161
4.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoSynthesis-2016021
417015128
4.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoTimimgSummaryReportImplemented.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportImplemented-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportImplemented-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoTimimgSummaryReportSynthesis.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportSynthesis-2016021
301201161
4.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportSynthesis-2016021
417015128
4.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoTimingReportImplemented.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportImplemented-2016021
3012011614
.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportImplemented-2016021
4170313831
.log
</location>
</link>
<link>
<name>
vivado_logs/VivadoTimingReportSynthesis.log
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportSynthesis-2016021
301201161
4.log
</location>
<location>
/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportSynthesis-2016021
417015128
4.log
</location>
</link>
<link>
<name>
vivado_state/x393_sata-opt-phys.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-phys-2016021
3012011614
.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-phys-2016021
4170313831
.dcp
</location>
</link>
<link>
<name>
vivado_state/x393_sata-opt-power.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-power-2016021
3012011614
.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-power-2016021
4170313831
.dcp
</location>
</link>
<link>
<name>
vivado_state/x393_sata-opt.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-2016021
3012011614
.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-2016021
4170313831
.dcp
</location>
</link>
<link>
<name>
vivado_state/x393_sata-place.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-place-2016021
3012011614
.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-place-2016021
4170313831
.dcp
</location>
</link>
<link>
<name>
vivado_state/x393_sata-route.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-route-2016021
3012011614
.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-route-2016021
4170313831
.dcp
</location>
</link>
<link>
<name>
vivado_state/x393_sata-synth.dcp
</name>
<type>
1
</type>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-synth-2016021
301201161
4.dcp
</location>
<location>
/home/andrey/git/x393_sata/vivado_state/x393_sata-synth-2016021
417015128
4.dcp
</location>
</link>
</linkedResources>
</projectDescription>
ahci/ahci_fis_receive.v
View file @
fb82aa54
...
...
@@ -182,10 +182,10 @@ localparam DATA_TYPE_ERR = 3;
wire
reg_we_w
;
reg
[
3
:
0
]
store_sig
;
reg
[
5
:
0
]
reg_ds
;
reg
[
5
:
0
]
reg_ds
;
//Unused?
reg
[
4
:
0
]
reg_ps
;
reg
reg_d2h
;
reg
[
1
:
0
]
reg_sdb
;
reg
reg_d2h
;
//unused?
reg
[
1
:
0
]
reg_sdb
;
//unused?
reg
[
31
:
2
]
xfer_cntr_r
;
reg
[
31
:
2
]
prdbc_r
;
...
...
ahci/ahci_fis_transmit.v
View file @
fb82aa54
...
...
@@ -53,7 +53,7 @@ module ahci_fis_transmit #(
input
xmit_err
,
//
input
syncesc_recv
,
// These two inputs interrupt transmit
input
xrdy_collision
,
output
[
2
:
0
]
dx_err
,
// bit 0 - syncesc_recv, 1 -
xmit_err
, 2 - collision (valid @ xmit_err and later, reset by new command)
output
[
2
:
0
]
dx_err
,
// bit 0 - syncesc_recv, 1 -
R_ERR (was xmit_err)
, 2 - collision (valid @ xmit_err and later, reset by new command)
output
[
15
:
0
]
ch_prdtl
,
// Physical region descriptor table length (in entries, 0 is 0)
output
ch_c
,
// Clear busy upon R_OK for this FIS
...
...
ahci/ahci_fsm.v
View file @
fb82aa54
...
...
@@ -225,7 +225,7 @@ module ahci_fsm
// output dmaCntrZero, // DMA counter is zero - would be a duplicate to the one in receive module and dwords_sent output
// input syncesc_recv, // These two inputs interrupt transmit
// input xmit_err, //
input
[
2
:
0
]
dx_err
,
// bit 0 - syncesc_recv, 1 -
xmit_err
, 2 - X_RDY/X_RDY collision (valid @ xmit_err and later, reset by new command)
input
[
2
:
0
]
dx_err
,
// bit 0 - syncesc_recv, 1 -
R_ERR (was xmit_err)
, 2 - X_RDY/X_RDY collision (valid @ xmit_err and later, reset by new command)
/// input [15:0] ch_prdtl, // Physical region descriptor table length (in entries, 0 is 0)
input
ch_c
,
// Clear busy upon R_OK for this FIS
...
...
ahci/ahci_sata_layers.v
View file @
fb82aa54
...
...
@@ -26,8 +26,12 @@ module ahci_sata_layers #(
parameter
DATASCOPE_START_BIT
=
14
,
// bit of DRP "other_control" to start recording after 0->1 (needs DRP)
parameter
DATASCOPE_POST_MEAS
=
16
,
// number of measurements to perform after event
`endif
parameter
BITS_TO_START_XMIT
=
6
,
// wait H2D FIFO to have 1 << BITS_TO_START_XMIT to start FIS transmission (or all FIS fits)
parameter
DATA_BYTE_WIDTH
=
4
parameter
BITS_TO_START_XMIT
=
6
,
// wait H2D FIFO to have 1 << BITS_TO_START_XMIT to start FIS transmission (or all FIS fits)
parameter
DATA_BYTE_WIDTH
=
4
,
parameter
ELASTIC_DEPTH
=
4
,
//5, With 4/7 got infrequent overflows!
parameter
ELASTIC_OFFSET
=
7
,
// 5 //10
parameter
FREQ_METER_WIDTH
=
12
)(
input
exrst
,
// master reset that resets PLL and GTX
input
reliable_clk
,
// use aclk that runs independently of the GTX
...
...
@@ -114,9 +118,10 @@ module ahci_sata_layers #(
output
drp_rdy
,
output
[
15
:
0
]
drp_do
,
`endif
output
[
FREQ_METER_WIDTH
-
1
:
0
]
xclk_period
,
// relative (to 2*clk) xclk period
output
[
31
:
0
]
debug_phy
,
output
[
31
:
0
]
debug_link
output
[
31
:
0
]
debug_link
,
input
hclk
// just for testing
)
;
...
...
@@ -202,11 +207,11 @@ module ahci_sata_layers #(
wire
rxelsfull
;
wire
rxelsempty
;
wire
xclk
;
// output receive clock, just to measure frequency
// wire [FREQ_METER_WIDTH - 1:0] xclk_period; // relative (to 2*clk) xclk period
wire
debug_detected_alignp
;
// oob detects ALIGNp, but not the link layer
wire
[
31
:
0
]
debug_phy0
;
// assign debug_sata = {link_established, phy_ready, debug_phy[29:16],debug_link[15:0]}; //
// assign debug_sata = debug_link[31:0]; //
/// assign debug_sata = debug_phy;
...
...
@@ -248,6 +253,24 @@ module ahci_sata_layers #(
assign
serr_EM
=
phy_ready
&&
(
0
)
;
// RWC: Communication between the device and host was lost but re-established
assign
serr_EI
=
phy_ready
&&
(
0
)
;
// RWC: Recovered Data integrity Error
reg
[
1
:
0
]
debug_last_d2h_type_in
;
always
@
(
posedge
clk
)
begin
if
(
d2h_fifo_wr
)
debug_last_d2h_type_in
<=
d2h_type_in
;
end
assign
debug_phy
=
{
h2d_type_out
[
1
:
0
]
,
h2d_type
[
1
:
0
]
,
ll_h2d_last
,
d2h_valid
,
d2h_type
[
1
:
0
]
,
debug_last_d2h_type_in
,
d2h_type_in
[
1
:
0
]
,
debug_phy0
[
19
:
0
]
};
/*
// Data/type FIFO, device -> host
output [31:0] d2h_data, // FIFO input data
output [ 1:0] d2h_mask, // set to 2'b11
output [ 1:0] d2h_type, // 0 - data, 1 - FIS head, 2 - R_OK, 3 - R_ERR (last two - after data, so ignore data with R_OK/R_ERR)
output d2h_valid, // Data available from the transport layer in FIFO
output d2h_many, // Multiple DWORDs available from the transport layer in FIFO
input d2h_ready, // This module or DMA consumes DWORD
*/
// .comreset_send (comreset_send), // input
// .cominit_got (cominit_got), // output wire
// .comwake_got (serr_DW), // output wire
...
...
@@ -338,43 +361,46 @@ module ahci_sata_layers #(
.
DATASCOPE_START_BIT
(
DATASCOPE_START_BIT
)
,
.
DATASCOPE_POST_MEAS
(
DATASCOPE_POST_MEAS
)
,
`endif
.
DATA_BYTE_WIDTH
(
4
)
.
DATA_BYTE_WIDTH
(
DATA_BYTE_WIDTH
)
,
.
ELASTIC_DEPTH
(
ELASTIC_DEPTH
)
,
.
ELASTIC_OFFSET
(
ELASTIC_OFFSET
)
)
phy
(
.
extrst
(
exrst
)
,
// input wire
.
clk
(
clk
)
,
// output wire
.
rst
(
rst
)
,
// output wire
.
reliable_clk
(
reliable_clk
)
,
// input wire
.
phy_ready
(
phy_ready
)
,
// output wire
.
gtx_ready
(
gtx_ready
)
,
// output wire
.
debug_cnt
()
,
// output[11:0] wire
.
extclk_p
(
extclk_p
)
,
// input wire
.
extclk_n
(
extclk_n
)
,
// input wire
.
txp_out
(
txp_out
)
,
// output wire
.
txn_out
(
txn_out
)
,
// output wire
.
rxp_in
(
rxp_in
)
,
// input wire
.
rxn_in
(
rxn_in
)
,
// input wire
.
ll_data_out
(
ph2ll_data_out
)
,
// output[31:0] wire
.
ll_charisk_out
(
ph2ll_charisk_out
)
,
// output[3:0] wire
.
ll_err_out
(
ph2ll_err_out
)
,
// output[3:0] wire
.
ll_data_in
(
ll2ph_data_in
)
,
// input[31:0] wire
.
ll_charisk_in
(
ll2ph_charisk_in
)
,
// input[3:0] wire
.
set_offline
(
set_offline
)
,
// input
.
comreset_send
(
comreset_send
)
,
// input
.
cominit_got
(
cominit_got
)
,
// output wire
.
comwake_got
(
serr_DW
)
,
// output wire
.
rxelsfull
(
rxelsfull
)
,
// output wire
.
rxelsempty
(
rxelsempty
)
,
// output wire
.
extrst
(
exrst
)
,
// input wire
.
clk
(
clk
)
,
// output wire
.
rst
(
rst
)
,
// output wire
.
reliable_clk
(
reliable_clk
)
,
// input wire
.
phy_ready
(
phy_ready
)
,
// output wire
.
gtx_ready
(
gtx_ready
)
,
// output wire
.
debug_cnt
()
,
// output[11:0] wire
.
extclk_p
(
extclk_p
)
,
// input wire
.
extclk_n
(
extclk_n
)
,
// input wire
.
txp_out
(
txp_out
)
,
// output wire
.
txn_out
(
txn_out
)
,
// output wire
.
rxp_in
(
rxp_in
)
,
// input wire
.
rxn_in
(
rxn_in
)
,
// input wire
.
ll_data_out
(
ph2ll_data_out
)
,
// output[31:0] wire
.
ll_charisk_out
(
ph2ll_charisk_out
)
,
// output[3:0] wire
.
ll_err_out
(
ph2ll_err_out
)
,
// output[3:0] wire
.
ll_data_in
(
ll2ph_data_in
)
,
// input[31:0] wire
.
ll_charisk_in
(
ll2ph_charisk_in
)
,
// input[3:0] wire
.
set_offline
(
set_offline
)
,
// input
.
comreset_send
(
comreset_send
)
,
// input
.
cominit_got
(
cominit_got
)
,
// output wire
.
comwake_got
(
serr_DW
)
,
// output wire
.
rxelsfull
(
rxelsfull
)
,
// output wire
.
rxelsempty
(
rxelsempty
)
,
// output wire
.
cplllock_debug
()
,
.
usrpll_locked_debug
()
,
.
re_aligned
(
serr_DS
)
,
// output reg
.
cplllock_debug
()
,
.
usrpll_locked_debug
()
,
.
re_aligned
(
serr_DS
)
,
// output reg
.
xclk
(
xclk
)
,
// output receive clock, just to measure frequency
`ifdef
USE_DATASCOPE
.
datascope_clk
(
datascope_clk
)
,
// output
.
datascope_waddr
(
datascope_waddr
)
,
// output[9:0]
.
datascope_we
(
datascope_we
)
,
// output
.
datascope_di
(
datascope_di
)
,
// output[31:0]
.
datascope_trig
(
ll_frame_ackn
)
,
// input datascope external trigger
.
datascope_trig
(
ll_
incom_invalidate
)
,
// ll_
frame_ackn), // input datascope external trigger
`endif
`ifdef
USE_DRP
...
...
@@ -387,7 +413,7 @@ module ahci_sata_layers #(
.
drp_rdy
(
drp_rdy
)
,
// output
.
drp_do
(
drp_do
)
,
// output[15:0]
`endif
.
debug_sata
(
debug_phy
)
.
debug_sata
(
debug_phy
0
)
,.
debug_detected_alignp
(
debug_detected_alignp
)
)
;
...
...
@@ -459,5 +485,15 @@ module ahci_sata_layers #(
.
data_in
(
{
d2h_type_in
,
ll_d2h_mask_out
,
ll_d2h_data_out
}
)
// input[35:0]
)
;
freq_meter
#(
.
WIDTH
(
FREQ_METER_WIDTH
)
,
.
PRESCALE
(
1
)
)
freq_meter_i
(
.
rst
(
rst
)
,
// input
.
clk
(
clk
)
,
// input
.
xclk
(
xclk
)
,
// hclk), //xclk), // input
.
dout
(
xclk_period
)
// output[11:0] reg
)
;
endmodule
ahci/ahci_top.v
View file @
fb82aa54
...
...
@@ -27,7 +27,9 @@ module ahci_top#(
parameter
READ_CT_LATENCY
=
2
,
// 0 if ct_rdata is available with reg_re/reg_addr, 2 with re/regen
parameter
ADDRESS_BITS
=
10
,
// number of memory address bits - now fixed. Low half - RO/RW/RWC,RW1 (2-cycle write), 2-nd just RW (single-cycle)
parameter
HBA_RESET_BITS
=
9
,
// duration of HBA reset in aclk periods (9: ~10usec)
parameter
RESET_TO_FIRST_ACCESS
=
1
// keep port reset until first R/W any register by software
parameter
RESET_TO_FIRST_ACCESS
=
1
,
// keep port reset until first R/W any register by software
parameter
FREQ_METER_WIDTH
=
12
)(
input
aclk
,
// clock - should be buffered
input
arst
,
// @aclk sync reset, active high
...
...
@@ -200,7 +202,7 @@ module ahci_top#(
input
drp_rdy
,
input
[
15
:
0
]
drp_do
,
`endif
input
[
FREQ_METER_WIDTH
-
1
:
0
]
xclk_period
,
// relative (to 2*clk) xclk period
input
[
31
:
0
]
debug_in_phy
,
input
[
31
:
0
]
debug_in_link
...
...
@@ -379,7 +381,7 @@ module ahci_top#(
wire
fsnd_clearCmdToIssue
;
// From CFIS:SUCCESS
// State variables fsm <- ahc_fis_transmit
wire
fsnd_pCmdToIssue
;
// AHCI port variable
wire
[
2
:
0
]
fsnd_dx_err
;
// bit 0 - syncesc_recv, 1 -
xmit_err
2 - X-RDY/X_RDY collision (valid @ xmit_err and later, reset by new command)
wire
[
2
:
0
]
fsnd_dx_err
;
// bit 0 - syncesc_recv, 1 -
R_ERR (was xmit_err)
2 - X-RDY/X_RDY collision (valid @ xmit_err and later, reset by new command)
wire
fsnd_ch_c
;
// Clear busy upon R_OK for this FIS
wire
fsnd_ch_b
;
// Built-in self test command
wire
fsnd_ch_r
;
// reset - may need to send SYNC escape before this command
...
...
@@ -649,7 +651,7 @@ module ahci_top#(
/// .xmit_busy (fsnd_busy), // input
.
clearCmdToIssue
(
fsnd_clearCmdToIssue
)
,
// output // From CFIS:SUCCESS
.
pCmdToIssue
(
fsnd_pCmdToIssue
)
,
// input
.
dx_err
(
fsnd_dx_err
)
,
// input[
1
:0]
.
dx_err
(
fsnd_dx_err
)
,
// input[
2
:0]
/// .ch_prdtl (prdtl), // input[15:0]
.
ch_c
(
fsnd_ch_c
)
,
// input
.
ch_b
(
fsnd_ch_b
)
,
// input
...
...
@@ -723,10 +725,18 @@ module ahci_top#(
.
was_hba_rst
(
was_hba_rst
)
,
// output
.
was_port_rst
(
was_port_rst
)
,
// output
.
debug_in0
(
debug_dma
)
,
// input[31:0]
.
debug_in1
(
debug_dma1
)
,
// debug_in_link), // input[31:0]
// .debug_in1 ({xclk_period[7:0], // lower 8 bits of 12-bit value. Same frequency would be 0x800 (msb opposite to 3 next bits)
// debug_dma1[23:0]}), // debug_in_link), // input[31:0]
.
debug_in1
(
{
2'b0
,
debug_in_link
[
13
:
8
]
,
debug_dma1
[
23
:
0
]
}
)
,
// debug_in_link), // input[31:0]
.
debug_in2
(
debug_in_phy
)
,
// input[31:0] // debug from phy/link
// .debug_in3 ({22'b0, last_jump_addr[9:0]}) // input[31:0]// Last jump address in the AHDCI sequencer
.
debug_in3
(
{
3'b0
,
debug_in_link
[
4
:
0
]
,
14'b0
,
last_jump_addr
[
9
:
0
]
}
)
// input[31:0]// Last jump address in the AHDCI sequencer
.
debug_in3
(
{
3'b0
,
debug_in_link
[
4
:
0
]
,
frcv_busy
,
frcv_ok
,
// 2'b0,
datascope_waddr
[
9
:
0
]
,
frcv_err
,
frcv_ferr
,
// 2'b0,
last_jump_addr
[
9
:
0
]
}
)
// input[31:0]// Last jump address in the AHDCI sequencer
`ifdef
USE_DRP
,.
drp_en
(
drp_en
)
,
// output reg
...
...
@@ -1083,8 +1093,10 @@ wire [9:0] xmit_dbg_01;
// assign datascope_we = (datascope_run[0] && h2d_valid && h2d_ready) || (datascope_run == 2);
// assign datascope_di = datascope_run[0]? {h2d_data[31:0]} : {16'hffff,{16-ADDRESS_BITS{1'b0}},datascope_waddr_r};
assign
datascope_we
=
(
datascope_run
[
0
]
&&
h2d_valid
&&
h2d_ready
)
||
(
datascope_run
==
2
)
||
d2h_ready
;
assign
datascope_di
=
d2h_ready
?
{
d2h_type
,
d2h_data
[
29
:
0
]
}:
(
datascope_run
[
0
]
?
{
h2d_data
[
31
:
0
]
}
:
{
16'hffff
,{
16
-
ADDRESS_BITS
{
1'b0
}},
datascope_waddr_r
}
)
;
// assign datascope_we = (datascope_run[0] && h2d_valid && h2d_ready) || (datascope_run == 2) || d2h_ready;
// assign datascope_di = d2h_ready? {d2h_type, d2h_data[29:0]}:(datascope_run[0]? {h2d_data[31:0]} : {16'hffff,{16-ADDRESS_BITS{1'b0}},datascope_waddr_r});
assign
datascope_we
=
(
datascope_run
[
0
]
&&
h2d_valid
&&
h2d_ready
)
||
fsnd_done
||
d2h_ready
;
assign
datascope_di
=
d2h_ready
?
{
d2h_type
,
d2h_data
[
29
:
0
]
}:
(
datascope_run
[
0
]
?
{
h2d_data
[
31
:
0
]
}
:
{
13'hffff
,
fsnd_dx_err
[
2
:
0
]
,{
16
-
ADDRESS_BITS
{
1'b0
}},
datascope_waddr_r
}
)
;
/// assign datascope_we = |datascope_run;
/*
assign datascope_di = datascope_run[0]? {h2d_type, // 2 bits
...
...
ahci/freq_meter.v
0 → 100644
View file @
fb82aa54
/*******************************************************************************
* Module: freq_meter
* Date:2016-02-13
* Author: andrey
* Description: Measure device clock frequency to set the local clock
*
* Copyright (c) 2016 Elphel, Inc .
* freq_meter.v is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* freq_meter.v is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> .
*******************************************************************************/
`timescale
1
ns
/
1
ps
module
freq_meter
#(
parameter
WIDTH
=
12
,
// width of the result
parameter
PRESCALE
=
1
// 0 same frequency, +1 - xclk is tvice faster, -1 - twice slower
)(
input
rst
,
input
clk
,
input
xclk
,
output
reg
[
WIDTH
-
1
:
0
]
dout
)
;
localparam
TIMER_WIDTH
=
WIDTH
-
PRESCALE
;
reg
[
TIMER_WIDTH
-
1
:
0
]
timer
;
reg
[
WIDTH
-
1
:
0
]
counter
;
wire
restart
;
reg
[
3
:
0
]
run_xclk
;
always
@
(
posedge
clk
)
begin
if
(
rst
||
restart
)
timer
<=
0
;
else
if
(
!
timer
[
TIMER_WIDTH
-
1
])
timer
<=
timer
+
1
;
if
(
restart
)
dout
<=
counter
;
// it is stopped before copying
end
always
@
(
posedge
xclk
)
begin
run_xclk
<=
{
run_xclk
[
2
:
0
]
,
~
timer
[
TIMER_WIDTH
-
1
]
&
~
rst
};
if
(
run_xclk
[
2
])
counter
<=
counter
+
1
;
else
if
(
run_xclk
[
1
])
counter
<=
0
;
end
pulse_cross_clock
#(
.
EXTRA_DLY
(
0
)
)
xclk2clk_i
(
.
rst
(
rst
)
,
// input
.
src_clk
(
xclk
)
,
// input
.
dst_clk
(
clk
)
,
// input
.
in_pulse
(
!
run_xclk
[
2
]
&&
run_xclk
[
3
])
,
// input
.
out_pulse
(
restart
)
,
// output
.
busy
()
// output
)
;
endmodule
ahci/sata_ahci_top.v
View file @
fb82aa54
...
...
@@ -46,7 +46,12 @@
`endif
parameter
HBA_RESET_BITS
=
9
,
// duration of HBA reset in aclk periods (9: ~10usec)
parameter
RESET_TO_FIRST_ACCESS
=
1
// keep port reset until first R/W any register by software
parameter
RESET_TO_FIRST_ACCESS
=
1
,
// keep port reset until first R/W any register by software
parameter
BITS_TO_START_XMIT
=
6
,
// wait H2D FIFO to have 1 << BITS_TO_START_XMIT to start FIS transmission (or all FIS fits)
parameter
DATA_BYTE_WIDTH
=
4
,
parameter
ELASTIC_DEPTH
=
4
,
// 4, //5, With 4/7 got infrequent overflows!
parameter
ELASTIC_OFFSET
=
7
,
// 5 //10
parameter
FREQ_METER_WIDTH
=
16
)(
output
wire
sata_clk
,
output
wire
sata_rst
,
...
...
@@ -228,6 +233,8 @@
reg
[
2
:
0
]
nhrst_r
;
wire
hrst
=
!
nhrst_r
[
2
]
;
wire
[
FREQ_METER_WIDTH
-
1
:
0
]
xclk_period
;
`ifdef
USE_DATASCOPE
// Datascope interface (write to memory that can be software-read)
wire
datascope_clk
;
...
...
@@ -261,7 +268,8 @@
// .READ_CT_LATENCY (READ_CT_LATENCY),
.
ADDRESS_BITS
(
ADDRESS_BITS
)
,
.
HBA_RESET_BITS
(
HBA_RESET_BITS
)
,
.
RESET_TO_FIRST_ACCESS
(
RESET_TO_FIRST_ACCESS
)
.
RESET_TO_FIRST_ACCESS
(
RESET_TO_FIRST_ACCESS
)
,
.
FREQ_METER_WIDTH
(
FREQ_METER_WIDTH
)
)
ahci_top_i
(
.
aclk
(
ACLK
)
,
// input
.
arst
(
arst
)
,
// input
...
...
@@ -403,7 +411,8 @@
.
drp_di
(
drp_di
)
,
// output[15:0] reg
.
drp_rdy
(
drp_rdy
)
,
// input
.
drp_do
(
drp_do
)
,
// input[15:0]
`endif
`endif
.
xclk_period
(
xclk_period
)
,
// input[11:0]
.
debug_in_phy
(
debug_phy
)
,
// input[31:0]
.
debug_in_link
(
debug_link
)
// input[31:0]
)
;
...
...
@@ -414,8 +423,11 @@
.
DATASCOPE_START_BIT
(
DATASCOPE_START_BIT
)
,
// bit of DRP "other_control" to start recording after 0->1 (needs DRP)
.
DATASCOPE_POST_MEAS
(
DATASCOPE_POST_MEAS
)
,
// number of measurements to perform after event
`endif
.
BITS_TO_START_XMIT
(
6
)
,
.
DATA_BYTE_WIDTH
(
4
)
.
BITS_TO_START_XMIT
(
BITS_TO_START_XMIT
)
,
.
DATA_BYTE_WIDTH
(
DATA_BYTE_WIDTH
)
,
.
ELASTIC_DEPTH
(
ELASTIC_DEPTH
)
,
.
ELASTIC_OFFSET
(
ELASTIC_OFFSET
)
,
.
FREQ_METER_WIDTH
(
FREQ_METER_WIDTH
)
)
ahci_sata_layers_i
(
.
exrst
(
exrst
)
,
// input
.
reliable_clk
(
reliable_clk
)
,
// input
...
...
@@ -485,8 +497,10 @@
.
drp_rdy
(
drp_rdy
)
,
// output
.
drp_do
(
drp_do
)
,
// output[15:0]
`endif
.
xclk_period
(
xclk_period
)
,
// output[11:0]
.
debug_phy
(
debug_phy
)
,
// output[31:0]
.
debug_link
(
debug_link
)
// output[31:0]
,.
hclk
(
hclk
)
)
;
...
...
generated/action_decoder.v
View file @
fb82aa54
/*******************************************************************************
* Module: action_decoder
* Date:2016-02-
07
* Date:2016-02-
13
* Author: auto-generated file, see ahci_fsm_sequence.py
* Description: Decode sequencer code to 1-hot actions
*******************************************************************************/
...
...
generated/condition_mux.v
View file @
fb82aa54
/*******************************************************************************
* Module: condition_mux
* Date:2016-02-
07
* Date:2016-02-
13
* Author: auto-generated file, see ahci_fsm_sequence.py
* Description: Select condition
*******************************************************************************/
...
...
helpers/ahci_fsm_sequence.py
View file @
fb82aa54
...
...
@@ -240,9 +240,12 @@ sequence = [{LBL:'POR', ADDR: 0x0, ACT: NOP},
{
IF
:
'X_RDY_COLLISION'
,
GOTO
:
'P:Idle'
},
# 2. x_rdy_collision_pend
{
IF
:
'SYNCESC_ERR'
,
GOTO
:
'ERR:SyncEscapeRecv'
},
# 4. dx_err[0] (reset by new command)
{
IF
:
'FIS_OK'
,
GOTO
:
'CFIS:Success'
},
# 5. fis_ok
{
GOTO
:
'ERR:Non-Fatal'
},
# 6
# {IF: 'FIS_OK', GOTO:'CFIS:Success'}, # 5. fis_ok - wrong, it was for received FISes
# { GOTO:'ERR:Non-Fatal'}, # 6
{
IF
:
'TX_ERR'
,
GOTO
:
'ERR:Non-Fatal'
},
# dx_err[1] - R_ERR received - non-fatal, retransmit
{
GOTO
:
'CFIS:Success'
},
# No errors, R_OK received
{
LBL
:
'CFIS:Success'
,
ACT
:
'CLEAR_CMD_TO_ISSUE'
},
# clearCmdToIssue
{
IF
:
'CTBA_B'
,
GOTO
:
'BIST:TestOngoing'
},
# 1. ch_b
{
IF
:
'CTBA_C'
,
GOTO
:
'CFIS:ClearCI'
},
# 2. ch_c
...
...
host/elastic1632.v
View file @
fb82aa54
...
...
@@ -58,27 +58,34 @@ reg msb_in_r; // input contains MSB
reg
inc_waddr
;
reg
[
DEPTH_LOG2
:
0
]
waddr
;
wire
[
DEPTH_LOG2
-
1
:
0
]
waddr_minus
=
waddr
[
DEPTH_LOG2
-
1
:
0
]
-
1
;
//reg [DEPTH_LOG2:0] raddr;
wire
[
DEPTH_LOG2
:
0
]
raddr_w
;
reg
[
DEPTH_LOG2
:
0
]
raddr_r
;
reg
[
44
:
0
]
fifo_ram
[
0
:
FIFO_DEPTH
-
1
]
;
reg
[
0
:
0
]
prealign_ram
[
0
:
FIFO_DEPTH
-
1
]
;
reg
[
FIFO_DEPTH
-
1
:
0
]
fill
;
wire
[
FIFO_DEPTH
-
1
:
0
]
fill_out
;
wire
[
FIFO_DEPTH
-
1
:
0
]
fill_out_more
;
// "pessimistic"
wire
[
FIFO_DEPTH
-
1
:
0
]
fill_out_less
;
// "optimistic"
wire
[
FIFO_DEPTH
-
1
:
0
]
fill_1
;
reg
[
2
:
0
]
aligned_rclk
;
reg
[
1
:
0
]
dav_rclk
;
wire
skip_rclk
;
wire
add_rclk
;
//wire [44:0] rdata = fifo_ram[raddr[DEPTH_LOG2-1:0]];
reg
[
1
:
0
]
dav_rclk
;
// FIFO has more than level
reg
[
1
:
0
]
dav_rclk_more
;
// FIFO has more than (level + 1)
reg
[
1
:
0
]
dav_rclk_less
;
// FIFO has more than (level - 1)
wire
skip_rclk
;
// skip 1 align primitive
wire
skip_rclk2
;
// skip 2 align primitives
//wire add_rclk; // insert 1 align primitive (to add2 - do this twice)
//wire add_rclk2; // skip 2 ALIGNp (just twice using add_rclk || add_rclk2_r
reg
[
1
:
0
]
add_rclk_r
;
reg
[
44
:
0
]
rdata_r
;
//wire align_out = rdata[44];
wire
align_out
=
rdata_r
[
44
]
;
//wire pre_align_out = prealign_ram[raddr[DEPTH_LOG2-1:0]];
reg
pre_align_out_r
;
reg
align_out_r
;
//
reg align_out_r;
reg
[
2
:
0
]
correct_r
;
wire
correct
=
align_out
&&
(
!
align_out_r
||
(
pre_align_out_r
&&
!
correct_r
[
2
]))
;
//wire correct = align_out && (!align_out_r || (pre_align_out_r && !correct_r[2]));
wire
correct_stream
=
align_out
&&
pre_align_out_r
&&
!
correct_r
[
2
]
;
// correct during continuous align steram - by 1 only
wire
correct_first
=
pre_align_out_r
&&
!
align_out
;
// next will be ALIGNp, may skip both
wire
correct
=
correct_stream
||
correct_first
;
reg
[
1
:
0
]
full_0
;
// full at waddr = waddr
reg
[
1
:
0
]
full_1
;
// full at waddr = raddr+1
...
...
@@ -89,18 +96,27 @@ wire is_alignp_w = ({data_in, data_in_r} == ALIGN_PRIM) &&
(
{
charisk_in
,
charisk_in_r
}
==
4'h1
)
&&
(
{
notintable_in
,
notintable_in_r
}
==
0
)
&&
(
{
disperror_in
,
disperror_in_r
}
==
0
)
;
`ifdef
SIMULATION
wire
[
DEPTH_LOG2
:
0
]
dbg_diff
=
waddr
-
raddr_r
;
// SuppressThisWarning VEditor Not used, just for viewing in simulator
wire
dbg_dav1
=
dav_rclk
[
1
]
;
// SuppressThisWarning VEditor Not used, just for viewing in simulator
wire
dbg_full0
=
full_0
[
1
]
;
// SuppressThisWarning VEditor Not used, just for viewing in simulator
wire
dbg_full1
=
full_1
[
1
]
;
// SuppressThisWarning VEditor Not used, just for viewing in simulator
reg
[
31
:
0
]
dbg_di
;
// SuppressThisWarning VEditor Not used, just for viewing in simulator
always
@
(
posedge
wclk
)
begin
if
(
msb_in_r
)
dbg_di
<=
{
data_in
,
data_in_r
};
end
`endif
wire
[
DEPTH_LOG2
:
0
]
dbg_diff
=
waddr
-
raddr_r
;
wire
dbg_dav1
=
dav_rclk
[
1
]
;
wire
dbg_full0
=
full_0
[
1
]
;
wire
dbg_full1
=
full_1
[
1
]
;
genvar
ii
;
generate
for
(
ii
=
0
;
ii
<
FIFO_DEPTH
;
ii
=
ii
+
1
)
begin:
gen_fill_out
assign
fill_out
[
ii
]
=
fill
[(
ii
+
CORR_OFFSET
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
CORR_OFFSET
)
>=
FIFO_DEPTH
)
;
assign
fill_1
[
ii
]
=
fill
[(
ii
+
1
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
1
)
>=
FIFO_DEPTH
)
;
assign
fill_out
[
ii
]
=
fill
[(
ii
+
CORR_OFFSET
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
CORR_OFFSET
)
>=
FIFO_DEPTH
)
;
assign
fill_out_more
[
ii
]
=
fill
[(
ii
+
CORR_OFFSET
+
1
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
CORR_OFFSET
+
1
)
>=
FIFO_DEPTH
)
;
assign
fill_out_less
[
ii
]
=
fill
[(
ii
+
CORR_OFFSET
-
1
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
CORR_OFFSET
-
1
)
>=
FIFO_DEPTH
)
;
assign
fill_1
[
ii
]
=
fill
[(
ii
+
1
)
&
(
FIFO_DEPTH
-
1
)]
^
((
ii
+
1
)
>=
FIFO_DEPTH
)
;
end
endgenerate
...
...
@@ -133,16 +149,14 @@ always @(posedge wclk) begin
if
(
!
aligned32_in_r
)
fill
<=
0
;
else
if
(
msb_in_r
)
fill
<={
fill
[
FIFO_DEPTH
-
2
:
0
]
,~
waddr
[
DEPTH_LOG2
]
};
end
// FIFO read clock domain - system synchronous, 75MHz for SATA2
localparam
[
DEPTH_LOG2
:
0
]
SIZED0
=
0
;
localparam
[
DEPTH_LOG2
:
0
]
SIZED1
=
1
;
localparam
[
DEPTH_LOG2
:
0
]
SIZED2
=
2
;
// assign raddr_w = aligned_rclk[1]? ( raddr_r + (add_rclk? 0 : (skip_rclk ? 2 : 1))) : 0;
assign
raddr_w
=
aligned_rclk
[
1
]
?
(
raddr_r
+
(
add_rclk
?
SIZED0
:
(
skip_rclk
?
SIZED2
:
SIZED1
)))
:
SIZED0
;
localparam
[
DEPTH_LOG2
:
0
]
SIZED3
=
3
;
assign
raddr_w
=
aligned_rclk
[
1
]
?
(
raddr_r
+
(
add_rclk_r
[
0
]
?
SIZED0
:
(
skip_rclk
?
(
skip_rclk2
?
SIZED3
:
SIZED2
)
:
SIZED1
)))
:
SIZED0
;
always
@
(
posedge
rclk
)
begin
...
...
@@ -156,35 +170,46 @@ always @(posedge rclk) begin
else
aligned_rclk
<=
{
aligned_rclk
[
1
:
0
]
,
fill
[
OFFSET
-
2
]
|
aligned_rclk
[
0
]
};
if
(
!
aligned32_in_r
)
dav_rclk
<=
0
;
// else dav_rclk <= {dav_rclk[0],fill_out[raddr[DEPTH_LOG2-1:0]] ^ raddr[DEPTH_LOG2]};
else
dav_rclk
<=
{
dav_rclk
[
0
]
,
fill_out
[
raddr_r
[
DEPTH_LOG2
-
1
:
0
]]
^
raddr_r
[
DEPTH_LOG2
]
};
if
(
!
aligned32_in_r
)
dav_rclk_more
<=
0
;
else
dav_rclk_more
<=
{
dav_rclk_more
[
0
]
,
fill_out_more
[
raddr_r
[
DEPTH_LOG2
-
1
:
0
]]
^
raddr_r
[
DEPTH_LOG2
]
};
if
(
!
aligned32_in_r
)
dav_rclk_less
<=
0
;
else
dav_rclk_less
<=
{
dav_rclk_less
[
0
]
,
fill_out_less
[
raddr_r
[
DEPTH_LOG2
-
1
:
0
]]
^
raddr_r
[
DEPTH_LOG2
]
};
if
(
!
aligned32_in_r
)
full_0
<=
1
;
// else full_0 <= {full_0[0], fill[raddr[DEPTH_LOG2-1:0]] ^ raddr[DEPTH_LOG2]};
else
full_0
<=
{
full_0
[
0
]
,
fill
[
raddr_r
[
DEPTH_LOG2
-
1
:
0
]]
^
raddr_r
[
DEPTH_LOG2
]
};
if
(
!
aligned32_in_r
)
full_1
<=
1
;
// else full_1 <= {full_1[0], fill_1[raddr[DEPTH_LOG2-1:0]] ^ raddr[DEPTH_LOG2]};
else
full_1
<=
{
full_1
[
0
]
,
fill_1
[
raddr_r
[
DEPTH_LOG2
-
1
:
0
]]
^
raddr_r
[
DEPTH_LOG2
]
};
// if (!aligned_rclk[1]) raddr <=0;
// else if (!add_rclk) raddr <= raddr + (skip_rclk ? 2 : 1);
disperror_out
<=
rdata_r
[
43
:
40
]
;
notintable_out
<=
rdata_r
[
39
:
36
]
;
charisk_out
<=
rdata_r
[
35
:
32
]
;
data_out
<=
rdata_r
[
31
:
0
]
;
align_out_r
<=
align_out
;
//
align_out_r <= align_out;
if
(
correct
||
!
aligned_rclk
)
correct_r
<=
~
0
;
else
correct_r
<=
correct_r
<<
1
;
// add_rclk2_r <=add_rclk2;
if
(
correct_first
)
add_rclk_r
<=
{~
dav_rclk_less
[
1
]
,
~
dav_rclk
[
1
]
};
else
if
(
correct_stream
)
add_rclk_r
<=
{
1'b0
,
~
dav_rclk
[
1
]
};
else
add_rclk_r
<=
add_rclk_r
>>
1
;
end
assign
skip_rclk
=
correct
&&
dav_rclk
[
1
]
;
assign
add_rclk
=
correct
&&
!
dav_rclk
[
1
]
;
//assign skip_rclk = correct && dav_rclk[1];
//assign add_rclk = correct && !dav_rclk[1];
assign
skip_rclk
=
correct
&&
dav_rclk
[
1
]
;
assign
skip_rclk2
=
correct_first
&&
dav_rclk_more
[
1
]
;
//assign add_rclk = correct && !dav_rclk[1];
//assign add_rclk2 = correct_first && !dav_rclk_less[1];
assign
isaligned_out
=
aligned_rclk
[
2
]
;
assign
full
=
aligned_rclk
&&
full_1
[
1
]
&&
!
full_0
[
1
]
;
assign
empty
=
aligned_rclk
&&
!
full_1
[
1
]
&&
full_0
[
1
]
;
...
...
host/gtx_8x10enc.v
View file @
fb82aa54
...
...
@@ -139,6 +139,7 @@ always @ (posedge clk)
else
begin
// got xxxx or 0000, both cases tell us addresses were bad
$
display
(
"Error in %m: bad incoming data: 1) K = %h, Data = %h 2) K = %h, Data = %h"
,
addr0_rr
[
8
]
,
addr0_rr
[
7
:
0
]
,
addr1_rr
[
8
]
,
addr1_rr
[
7
:
0
])
;
repeat
(
10
)
@
(
posedge
clk
)
;
$
finish
;
end
`endif
// CHECKERS_ENABLED
...
...
host/gtx_wrap.v
View file @
fb82aa54
...
...
@@ -51,8 +51,8 @@ module gtx_wrap #(
parameter
RXDFELPMRESET_TIME
=
7'hf
,
parameter
RXISCANRESET_TIME
=
5'h1
,
parameter
ELASTIC_DEPTH
=
4
,
//5,
parameter
ELASTIC_OFFSET
=
7
// 5 //10
parameter
ELASTIC_DEPTH
=
4
,
//5, With 4/7 got infrequent overflows!
parameter
ELASTIC_OFFSET
=
7
// 5 //10
)
(
output
reg
debug
=
0
,
...
...
@@ -104,7 +104,10 @@ module gtx_wrap #(
output
wire
dbg_rxcdrlock
,
output
wire
dbg_rxdlysresetdone
,
output
wire
[
1
:
0
]
txbufstatus
output
wire
[
1
:
0
]
txbufstatus
,
output
xclk
// just to measure frequency to set the local clock
`ifdef
USE_DATASCOPE
// Datascope interface (write to memory that can be software-read)
,
output
datascope_clk
,
...
...
@@ -385,7 +388,7 @@ gtx_8x10enc gtx_8x10enc(
* RX PCS part: comma detect + align module, 10/8 decoder, elastic buffer, interface resynchronisation
* all modules before elastic buffer shall work on a restored clock - xclk
*/
wire
xclk
;
// wire xclk; make it output to measure frequency
// assuming GTX interface width = 20 bits
// comma aligner
wire
[
19
:
0
]
rxdata_comma_out
;
...
...
host/link.v
View file @
fb82aa54
...
...
@@ -174,14 +174,31 @@ end
reg
data_txing
;
// if there are still some data to transmit and the transaction wasn't cancelled
reg
data_txing_r
;
// if there are still some data to transmit and the transaction wasn't cancelled
wire
data_txing
=
data_txing_r
&
~
state_send_crc
;
// does not work with ALIGNp pair
/*
always @ (posedge clk) begin
/// data_txing <= rst | (data_last_in & data_strobe_out | dword_val & rcvd_dword[CODE_DMATP]) ? 1'b0 : frame_req ? 1'b1 : data_txing;
if (rst ||
(data_last_in && data_strobe_out) ||
(dword_val && rcvd_dword[CODE_DMATP])) data_txing <= 0;
else if (frame_req) data_txing <= 1;
end
end
*/
// Trying alternative, as SM sometimes got stuck in state_send_data, last was set
// Make it safe
always
@
(
posedge
clk
)
begin
/// data_txing <= rst | (data_last_in & data_strobe_out | dword_val & rcvd_dword[CODE_DMATP]) ? 1'b0 : frame_req ? 1'b1 : data_txing;
if
(
rst
)
data_txing_r
<=
0
;
else
if
(
frame_req
)
data_txing_r
<=
1
;
else
if
(
state_send_crc
)
data_txing_r
<=
0
;
end
// fsm
// states and transitions are taken from the doc, "Link Layer State Machine" chapter
// power mode states are not implemented. TODO insert them as an additional branch of fsm
...
...
@@ -215,6 +232,13 @@ reg state_rcvr_goodcrc; // GoodCRC
reg
state_rcvr_goodend
;
// GoodEnd
reg
state_rcvr_badend
;
// BadEnd
// handling single-cycle incom_ack_good/incom_ack_bad when they arrive at alignes_pair
reg
incom_ack_good_pend
;
reg
incom_ack_bad_pend
;
wire
incom_ack_good_or_pend
=
incom_ack_good
||
incom_ack_good_pend
;
wire
incom_ack_bad_or_pend
=
incom_ack_bad
||
incom_ack_bad_pend
;
wire
set_sync_esc
;
wire
set_nocommerr
;
wire
set_nocomm
;
...
...
@@ -286,7 +310,7 @@ assign state_idle = ~state_sync_esc
// got an escaping primitive = request to cancel the transmission
wire
got_escape
;
assign
got_escape
=
dword_val
&
rcvd_dword
[
CODE_SYNCP
]
;
assign
got_escape
=
dword_val
&
rcvd_dword
[
CODE_SYNCP
]
;
// escaping is done
assign
sync_escape_ack
=
state_sync_esc
;
...
...
@@ -323,6 +347,14 @@ assign alignes_pair = phy_ready && (alignes_pair_0 | alignes_pair_1);
always
@
(
posedge
clk
)
begin
link_bad_crc
<=
state_rcvr_eof
&
crc_bad
;
if
(
incom_ack_good
)
incom_ack_good_pend
<=
1
;
// else if (!state_rcvr_goodend && !state_rcvr_goodcrc) incom_ack_good_pend <= 0;
else
if
(
!
state_rcvr_goodcrc
)
incom_ack_good_pend
<=
0
;
if
(
incom_ack_bad
)
incom_ack_bad_pend
<=
1
;
// else if (!state_rcvr_badend && !state_rcvr_goodcrc) incom_ack_bad_pend <= 0; // didn't like it even with good crc
else
if
(
!
state_rcvr_goodcrc
)
incom_ack_bad_pend
<=
0
;
// didn't like it even with good crc
end
// Whole transitions table, literally from doc pages 311-328
...
...
@@ -359,10 +391,10 @@ assign set_rcvr_eof = state_rcvr_data & dword_val & rcvd_dword[CODE_E
|
state_rcvr_rhold
&
dword_val
&
rcvd_dword
[
CODE_EOFP
]
|
state_rcvr_shold
&
dword_val
&
rcvd_dword
[
CODE_EOFP
]
;
assign
set_rcvr_goodcrc
=
state_rcvr_eof
&
crc_good
;
assign
set_rcvr_goodend
=
state_rcvr_goodcrc
&
incom_ack_good
;
assign
set_rcvr_goodend
=
state_rcvr_goodcrc
&
incom_ack_good
_or_pend
;
// incom_ack_good; // may arrive at aligns_pair
assign
set_rcvr_badend
=
state_rcvr_data
&
dword_val
&
rcvd_dword
[
CODE_WTRMP
]
|
state_rcvr_eof
&
crc_bad
|
state_rcvr_goodcrc
&
incom_ack_bad
;
|
state_rcvr_goodcrc
&
incom_ack_bad
_or_pend
;
// incom_ack_bad; // may arrive at aligns_pair
assign
clr_sync_esc
=
set_nocommerr
|
set_reset
|
dword_val
&
(
rcvd_dword
[
CODE_RRDYP
]
|
rcvd_dword
[
CODE_SYNCP
])
;
assign
clr_nocommerr
=
set_reset
|
set_nocomm
;
...
...
@@ -379,7 +411,8 @@ assign clr_send_rhold = set_nocommerr | set_reset | set_sync_esc | set_sen
assign
clr_send_shold
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
set_send_data
|
set_send_rhold
|
set_send_crc
|
got_escape
;
assign
clr_send_crc
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
set_send_eof
|
got_escape
;
assign
clr_send_eof
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
set_wait
|
got_escape
;
assign
clr_wait
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
frame_done
|
got_escape
;
assign
clr_wait
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
frame_done
|
got_escape
;
/*
assign clr_rcvr_wait = set_nocommerr | set_reset | set_sync_esc | set_rcvr_rdy | dword_val & ~rcvd_dword[CODE_XRDYP];
assign clr_rcvr_rdy = set_nocommerr | set_reset | set_sync_esc | set_rcvr_data | dword_val & ~rcvd_dword[CODE_XRDYP] & ~rcvd_dword[CODE_SOFP];
assign clr_rcvr_data = set_nocommerr | set_reset | set_sync_esc | set_rcvr_rhold | set_rcvr_shold | set_rcvr_eof | set_rcvr_badend | got_escape;
...
...
@@ -387,6 +420,15 @@ assign clr_rcvr_rhold = set_nocommerr | set_reset | set_sync_esc | set_rcv
assign clr_rcvr_shold = set_nocommerr | set_reset | set_sync_esc | set_rcvr_data | set_rcvr_eof | got_escape;
assign clr_rcvr_eof = set_nocommerr | set_reset | set_sync_esc | set_rcvr_goodcrc | set_rcvr_badend;
assign clr_rcvr_goodcrc = set_nocommerr | set_reset | set_sync_esc | set_rcvr_goodend | set_rcvr_badend | got_escape;
*/
assign
clr_rcvr_wait
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*| set_rcvr_rdy */
|
(
dword_val
&
~
rcvd_dword
[
CODE_XRDYP
])
;
assign
clr_rcvr_rdy
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*| set_rcvr_data */
|
(
dword_val
&
~
rcvd_dword
[
CODE_XRDYP
]
&
~
rcvd_dword
[
CODE_SOFP
])
;
assign
clr_rcvr_data
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*| set_rcvr_rhold | set_rcvr_shold | set_rcvr_eof */
|
set_rcvr_badend
|
got_escape
;
assign
clr_rcvr_rhold
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*| set_rcvr_data | set_rcvr_eof | set_rcvr_shold */
|
got_escape
;
assign
clr_rcvr_shold
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*| set_rcvr_data | set_rcvr_eof */
|
got_escape
;
assign
clr_rcvr_eof
=
set_nocommerr
|
set_reset
|
set_sync_esc
/*|set_rcvr_goodcrc | set_rcvr_badend*/
;
assign
clr_rcvr_goodcrc
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
/*set_rcvr_goodend | set_rcvr_badend |*/
got_escape
;
assign
clr_rcvr_goodend
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
got_escape
;
assign
clr_rcvr_badend
=
set_nocommerr
|
set_reset
|
set_sync_esc
|
got_escape
;
...
...
@@ -409,6 +451,38 @@ begin
state_send_crc
<=
(
state_send_crc
|
set_send_crc
&
~
alignes_pair
)
&
~
(
clr_send_crc
&
~
alignes_pair
)
&
~
rst
;
state_send_eof
<=
(
state_send_eof
|
set_send_eof
&
~
alignes_pair
)
&
~
(
clr_send_eof
&
~
alignes_pair
)
&
~
rst
;
state_wait
<=
(
state_wait
|
set_wait
&
~
alignes_pair
)
&
~
(
clr_wait
&
~
alignes_pair
)
&
~
rst
;
// Andrey: most receiver states can not wait for transmitting aligns_pair. What host sends in this states matters when confirmed by the device
// So it seems OK if alignes_pair will just overwrite whatever host was going to send in these state.
// Care should be taken only for transitions between these states and others (transmit) that need to wait for alignes_pair to finish
// set_* are considered fast (no wait), clr_* - slow (to non-receive states), next opeartors use OR-ed "set_*" in immediate transitions
// to other states, clr_* - to other states
// rdy->data, data->eof
state_rcvr_wait
<=
(
state_rcvr_wait
|
(
set_rcvr_wait
&
~
alignes_pair
))
&
~
(
set_rcvr_rdy
|
(
clr_rcvr_wait
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_rdy
<=
(
state_rcvr_rdy
|
set_rcvr_rdy
)
&
~
(
set_rcvr_data
|
(
clr_rcvr_rdy
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_data
<=
(
state_rcvr_data
|
set_rcvr_data
)
&
~
(
set_rcvr_shold
|
set_rcvr_shold
|
set_rcvr_eof
|
(
clr_rcvr_data
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_rhold
<=
(
state_rcvr_rhold
|
set_rcvr_rhold
)
&
~
(
set_rcvr_data
|
set_rcvr_shold
|
set_rcvr_eof
|
(
clr_rcvr_rhold
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_shold
<=
(
state_rcvr_shold
|
set_rcvr_shold
)
&
~
(
set_rcvr_data
|
set_rcvr_eof
|
(
clr_rcvr_shold
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_eof
<=
(
state_rcvr_eof
|
set_rcvr_eof
)
&
~
(
set_rcvr_goodcrc
|
state_rcvr_badend
|
(
clr_rcvr_eof
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_goodcrc
<=
(
state_rcvr_goodcrc
|
set_rcvr_goodcrc
)
&
~
(
set_rcvr_goodend
|
set_rcvr_badend
|
(
clr_rcvr_goodcrc
&
~
alignes_pair
))
&
~
rst
;
state_rcvr_goodend
<=
(
state_rcvr_goodend
|
set_rcvr_goodend
)
&
~
(
clr_rcvr_goodend
&
~
alignes_pair
)
&
~
rst
;
state_rcvr_badend
<=
(
state_rcvr_badend
|
set_rcvr_badend
)
&
~
(
clr_rcvr_badend
&
~
alignes_pair
)
&
~
rst
;
/*
state_rcvr_wait <= (state_rcvr_wait | set_rcvr_wait & ~alignes_pair) & ~(clr_rcvr_wait & ~alignes_pair) & ~rst;
state_rcvr_rdy <= (state_rcvr_rdy | set_rcvr_rdy & ~alignes_pair) & ~(clr_rcvr_rdy & ~alignes_pair) & ~rst;
state_rcvr_data <= (state_rcvr_data | set_rcvr_data & ~alignes_pair) & ~(clr_rcvr_data & ~alignes_pair) & ~rst;
...
...
@@ -418,12 +492,19 @@ begin
state_rcvr_goodcrc <= (state_rcvr_goodcrc | set_rcvr_goodcrc & ~alignes_pair) & ~(clr_rcvr_goodcrc & ~alignes_pair) & ~rst;
state_rcvr_goodend <= (state_rcvr_goodend | set_rcvr_goodend & ~alignes_pair) & ~(clr_rcvr_goodend & ~alignes_pair) & ~rst;
state_rcvr_badend <= (state_rcvr_badend | set_rcvr_badend & ~alignes_pair) & ~(clr_rcvr_badend & ~alignes_pair) & ~rst;
*/
end
// flag if incoming request to terminate current transaction came from TL
reg
incom_stop_f
;
always
@
(
posedge
clk
)
incom_stop_f
<=
rst
|
incom_done
|
~
frame_busy
?
1'b0
:
incom_stop_req
?
1'b1
:
incom_stop_f
;
// incom_stop_f <= rst | incom_done | ~frame_busy ? 1'b0 : incom_stop_req ? 1'b1 : incom_stop_f;
if
(
rst
)
incom_stop_f
<=
0
;
else
if
(
incom_stop_req
)
incom_stop_f
<=
1
;
else
if
(
incom_done
|
~
frame_busy
)
incom_stop_f
<=
0
;
// form data to phy
reg
[
DATA_BYTE_WIDTH
*
8
-
1
:
0
]
to_phy_data
;
...
...
@@ -618,24 +699,51 @@ assign data_last_out = set_rcvr_eof;
// gives a strobe everytime data is present and we're at a corresponding state.
assign
data_strobe_out
=
select_prim
[
CODE_DATA
]
;
// Just to make output signals single-cycel regardless of alignes_pair and remove dependence on SM code
wire
frame_rej_w
;
wire
incom_start_w
;
wire
incom_done_w
;
wire
incom_invalidate_w
;
reg
frame_rej_r
;
reg
incom_start_r
;
reg
incom_done_r
;
reg
incom_invalidate_r
;
assign
frame_rej
=
frame_rej_w
&&
!
frame_rej_r
;
assign
incom_start
=
incom_start_w
&&
!
incom_start_r
;
assign
incom_done
=
incom_done_w
&&
!
incom_done_r
;
assign
incom_invalidate
=
incom_invalidate_w
&&
!
incom_invalidate_r
;
always
@
(
posedge
clk
)
begin
frame_rej_r
<=
frame_rej_w
;
incom_start_r
<=
incom_start_w
;
incom_done_r
<=
incom_done_w
;
incom_invalidate_r
<=
incom_invalidate_w
;
end
// assign phy data outputs
assign
phy_data_out
=
to_phy_data
;
assign
phy_isk_out
=
to_phy_isk
;
assign
frame_busy
=
~
state_idle
;
assign
frame_ack
=
state_send_sof
;
assign
frame_rej
=
set_rcvr_wait
&
state_send_rdy
&
~
alignes_pair
;
assign
frame_rej
_w
=
set_rcvr_wait
&
state_send_rdy
;
// & ~alignes_pair; // OK to mask with
// incoming fises detected
assign
incom_start
=
set_rcvr_wait
&
~
alignes_pair
;
assign
incom_start
_w
=
set_rcvr_wait
;
//
& ~alignes_pair;
// ... and processed
assign
incom_done
=
set_rcvr_goodcrc
&
~
alignes_pair
;
assign
incom_done
_w
=
set_rcvr_goodcrc
;
//
& ~alignes_pair;
// or the FIS had errors
//assign incom_invalidate = state_rcvr_eof & crc_bad & ~alignes_pair | state_rcvr_data & dword_val & rcvd_dword[CODE_WTRMP]
// | (state_rcvr_wait | state_rcvr_rdy | state_rcvr_data | state_rcvr_rhold | state_rcvr_shold | state_rcvr_eof | state_rcvr_goodcrc) & got_escape;
// Separating different types of errors, sync_escape from other problems. TODO: route individual errors to set SERR bits
assign
incom_invalidate
=
state_rcvr_eof
&
crc_bad
&
~
alignes_pair
|
state_rcvr_data
&
dword_val
&
rcvd_dword
[
CODE_WTRMP
]
;
assign
incom_sync_escape
=
(
state_rcvr_wait
|
state_rcvr_rdy
|
state_rcvr_data
|
state_rcvr_rhold
|
state_rcvr_shold
|
state_rcvr_eof
|
state_rcvr_goodcrc
)
&
got_escape
;
//assign incom_invalidate = (state_rcvr_eof & crc_bad & ~alignes_pair) | // CRC mismatch
// (state_rcvr_data & dword_val & rcvd_dword[CODE_WTRMP]);
assign
incom_invalidate_w
=
(
state_rcvr_eof
&
crc_bad
)
|
// CRC mismatch
(
state_rcvr_data
&
dword_val
&
rcvd_dword
[
CODE_WTRMP
])
;
// missed EOF?
assign
incom_sync_escape
=
(
state_rcvr_wait
|
state_rcvr_rdy
|
state_rcvr_data
|
state_rcvr_rhold
|
state_rcvr_shold
|
state_rcvr_eof
|
state_rcvr_goodcrc
)
&
got_escape
;
// shows that incoming primitive or data is ready to be processed // TODO somehow move alignes_pair into dword_val
assign
dword_val
=
|
rcvd_dword
&
phy_ready
&
~
rcvd_dword
[
CODE_ALIGNP
]
;
...
...
@@ -682,10 +790,17 @@ assign rcvd_dword[CODE_CONTP] = phy_isk_in_r[0] && ~(|phy_isk_in_r[DATA_BYTE_W
// CONTp (*_r0 is one cycle ahead of *_r)
//assign is_cont_p_w = phy_isk_in_r0[0] == 1'b1 & ~|phy_isk_in_r[DATA_BYTE_WIDTH-1:1] & prim_data[CODE_CONTP ] == phy_data_in_r0;
//assign is_non_cont_non_align_p_w = phy_isk_in_r0[0] == 1'b1 & ~|phy_isk_in_r[DATA_BYTE_WIDTH-1:1] & prim_data[CODE_CONTP ] != phy_data_in_r0;
/*
assign is_cont_p_w = phy_isk_in_r0[0] && !(|phy_isk_in_r[DATA_BYTE_WIDTH-1:1]) && (prim_data[CODE_CONTP ] == phy_data_in_r0);
assign is_align_p_w = phy_isk_in_r0[0] && !(|phy_isk_in_r[DATA_BYTE_WIDTH-1:1]) && (prim_data[CODE_ALIGNP ] == phy_data_in_r0);
assign is_non_cont_non_align_p_w = phy_isk_in_r0[0] && !(|phy_isk_in_r[DATA_BYTE_WIDTH-1:1]) && (prim_data[CODE_CONTP ] != phy_data_in_r0)
&& (prim_data[CODE_ALIGNP ] != phy_data_in_r0);
*/
// Following is processed one cycle ahead of the others to replace CONTp junk with the replaced repeated primitives
assign
is_cont_p_w
=
phy_isk_in_r0
[
0
]
&&
!
(
|
phy_isk_in_r0
[
DATA_BYTE_WIDTH
-
1
:
1
])
&&
(
prim_data
[
CODE_CONTP
]
==
phy_data_in_r0
)
;
assign
is_align_p_w
=
phy_isk_in_r0
[
0
]
&&
!
(
|
phy_isk_in_r0
[
DATA_BYTE_WIDTH
-
1
:
1
])
&&
(
prim_data
[
CODE_ALIGNP
]
==
phy_data_in_r0
)
;
assign
is_non_cont_non_align_p_w
=
phy_isk_in_r0
[
0
]
&&
!
(
|
phy_isk_in_r0
[
DATA_BYTE_WIDTH
-
1
:
1
])
&&
(
prim_data
[
CODE_CONTP
]
!=
phy_data_in_r0
)
&&
(
prim_data
[
CODE_ALIGNP
]
!=
phy_data_in_r0
)
;
// phy level errors handling TODO
...
...
@@ -899,8 +1014,18 @@ reg state_rcvr_badend; // BadEnd
///assign debug_out = debug_unknown_dword; // first unknown dword
assign
debug_out
[
4
:
0
]
=
debug_states_encoded
;
assign
debug_out
[
15
:
5
]
=
debug_to_first_err
[
14
:
4
]
;
//
assign debug_out[15: 5] = debug_to_first_err[14:4];
assign
debug_out
[
31
:
16
]
=
debug_rcvd_dword
;
assign
debug_out
[
7
:
5
]
=
0
;
assign
debug_out
[
15
:
8
]
=
{
2'b0
,
state_send_data
,
data_txing
,
data_val_in
,
data_last_in
,
dword_val
,
~
rcvd_dword
[
CODE_SYNCP
]
};
/*
assign set_send_crc = state_send_data & data_txing & data_val_in & data_last_in & dword_val & ~rcvd_dword[CODE_SYNCP]
| state_send_data & dword_val & rcvd_dword[CODE_DMATP];
*/
//assign debug_out[STATES_COUNT - 1:0] = debug_states_visited;
...
...
host/sata_phy.v
View file @
fb82aa54
...
...
@@ -39,7 +39,9 @@ module sata_phy #(
parameter
DATASCOPE_START_BIT
=
14
,
// bit of DRP "other_control" to start recording after 0->1 (needs DRP)
parameter
DATASCOPE_POST_MEAS
=
16
,
// number of measurements to perform after event
`endif
parameter
DATA_BYTE_WIDTH
=
4
parameter
DATA_BYTE_WIDTH
=
4
,
parameter
ELASTIC_DEPTH
=
4
,
//5, With 4/7 got infrequent overflows!
parameter
ELASTIC_OFFSET
=
7
// 5 //10
)
(
// initial reset, resets PLL. After pll is locked, an internal sata reset is generated.
...
...
@@ -88,6 +90,7 @@ module sata_phy #(
output
cplllock_debug
,
output
usrpll_locked_debug
,
output
re_aligned
,
// re-aligned after alignment loss
output
xclk
,
// just to measure frequency to set the local clock
`ifdef
USE_DATASCOPE
// Datascope interface (write to memory that can be software-read)
...
...
@@ -488,7 +491,10 @@ gtx_wrap #(
.
RXCDRPHRESET_TIME
(
RXCDRPHRESET_TIME
)
,
.
RXCDRFREQRESET_TIME
(
RXCDRFREQRESET_TIME
)
,
.
RXDFELPMRESET_TIME
(
RXDFELPMRESET_TIME
)
,
.
RXISCANRESET_TIME
(
RXISCANRESET_TIME
)
.
RXISCANRESET_TIME
(
RXISCANRESET_TIME
)
,
.
ELASTIC_DEPTH
(
ELASTIC_DEPTH
)
,
// with 4/7 infrequent full !
.
ELASTIC_OFFSET
(
ELASTIC_OFFSET
)
)
gtx_wrap
(
...
...
@@ -537,7 +543,8 @@ gtx_wrap
.
dbg_rx_clocks_aligned
(
dbg_rx_clocks_aligned
)
,
.
dbg_rxcdrlock
(
dbg_rxcdrlock
)
,
.
dbg_rxdlysresetdone
(
dbg_rxdlysresetdone
)
,
.
txbufstatus
(
txbufstatus
[
1
:
0
])
.
txbufstatus
(
txbufstatus
[
1
:
0
])
,
.
xclk
(
xclk
)
// output receive clock, just to measure frequency
`ifdef
USE_DATASCOPE
,.
datascope_clk
(
datascope_clk
)
,
// output
.
datascope_waddr
(
datascope_waddr
)
,
// output[9:0]
...
...
@@ -671,9 +678,9 @@ assign debug_sata[23:20] = debug_cntr4;
//assign debug_sata = {8'b0, dbg_clk_align_cntr, 1'b0, dbg_rxdlysresetdone, rxelecidle, dbg_rxcdrlock, rxelsfull, rxelsempty, dbg_rxphaligndone, dbg_rx_clocks_aligned};
`ifdef
USE_DATASCOPE
assign
debug_sata
=
{
txbufstatus
[
1
:
0
]
,
rxelecidle
,
dbg_rxcdrlock
,
rxelsfull
,
rxelsempty
,
dbg_rxphaligndone
,
dbg_rx_clocks_aligned
,
error_count
,
error_count
[
11
:
0
]
,
2'b0
,
datascope_waddr
};
datascope_waddr
[
9
:
0
]
};
`else
assign
debug_sata
=
{
8'b0
,
dbg_clk_align_cntr
,
txbufstatus
[
1
:
0
]
,
rxelecidle
,
dbg_rxcdrlock
,
rxelsfull
,
rxelsempty
,
dbg_rxphaligndone
,
dbg_rx_clocks_aligned
};
`endif
...
...
includes/ahxi_fsm_code.vh
View file @
fb82aa54
...
...
@@ -4,8 +4,8 @@
, .INIT_03 (256'h845284BE44374C682C4214190012003900880018000A02080022001901020090)
, .INIT_04 (256'h00190110003901100019144601020030020202040039B07D707A041000398C6B)
, .INIT_05 (256'h64540C2504580000004E24FB250200C0004C24FB250200C0005C000000390000)
, .INIT_06 (256'h
A471
50F8903900A00104006B0202005000E2A89368F018E918CB98A758D73882)
, .INIT_07 (256'h0060003900000039B07D00000050004400220039B07D707A307730F001080
102
)
, .INIT_06 (256'h
D102
50F8903900A00104006B0202005000E2A89368F018E918CB98A758D73882)
, .INIT_07 (256'h0060003900000039B07D00000050004400220039B07D707A307730F001080
071
)
, .INIT_08 (256'h00050091C88F002200240091288B28FE000C0110008624FB25020240009CD0FB)
, .INIT_09 (256'h48A528A128FE00140039487F0CAD28FE0110009724FB25020140005004020091)
, .INIT_0A (256'h8839089C040800AD011000AB24FB250200C000500081005048A5002200240039)
...
...
py393sata/x393sata.py
View file @
fb82aa54
...
...
@@ -534,11 +534,15 @@ class x393sata(object):
break
sleep
(
0.1
)
else
:
print
(
"
Failed to get interrupt
"
)
print
(
"
\n
====================== Failed to get interrupt ============================
"
)
self
.
reg_status
()
print
(
"_=mem.mem_dump (0x
%
x, 0x4,4)"
%
(
MAXI1_ADDR
+
DBG_OFFS
))
self
.
x393_mem
.
mem_dump
(
MAXI1_ADDR
+
DBG_OFFS
,
0x4
,
4
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0xa0
,
4
)
raise
Exception
(
"Failed to get interrupt"
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0x20
,
4
)
...
...
@@ -616,14 +620,28 @@ class x393sata(object):
self
.
parse_register
(
group_range
=
[
'HBA_PORT__PxIS'
],
skip0
=
True
,
dword
=
None
)
if
istat
!=
1
:
#DHRS interrupt (for PIO - 2)
print
(
"
\n
======================Got wrong interrupt ============================"
)
self
.
reg_status
()
print
(
"_=mem.mem_dump (0x
%
x, 0x4,4)"
%
(
MAXI1_ADDR
+
DBG_OFFS
))
self
.
x393_mem
.
mem_dump
(
MAXI1_ADDR
+
DBG_OFFS
,
0x4
,
4
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0xa0
,
4
)
raise
Exception
(
"Failed to get interrupt"
)
break
sleep
(
0.1
)
else
:
print
(
"
Failed to get interrupt
"
)
print
(
"
\n
====================== Failed to get interrupt ============================
"
)
self
.
reg_status
()
print
(
"_=mem.mem_dump (0x
%
x, 0x4,4)"
%
(
MAXI1_ADDR
+
DBG_OFFS
))
self
.
x393_mem
.
mem_dump
(
MAXI1_ADDR
+
DBG_OFFS
,
0x4
,
4
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0xa0
,
4
)
raise
Exception
(
"Failed to get interrupt"
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0xa0
,
4
)
...
...
@@ -705,12 +723,15 @@ class x393sata(object):
break
sleep
(
0.1
)
else
:
print
(
"
Failed to get interrupt
"
)
print
(
"
\n
====================== Failed to get interrupt ============================
"
)
self
.
reg_status
()
print
(
"_=mem.mem_dump (0x
%
x, 0x4,4)"
%
(
MAXI1_ADDR
+
DBG_OFFS
))
self
.
x393_mem
.
mem_dump
(
MAXI1_ADDR
+
DBG_OFFS
,
0x4
,
4
)
self
.
x393_mem
.
mem_dump
(
MAXI1_ADDR
+
DBG_OFFS
,
0x4
,
4
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0xa0
,
4
)
raise
Exception
(
"Failed to get interrupt"
)
print
(
"Datascope (debug) data:"
)
print
(
"_=mem.mem_dump (0x
%
x, 0x20,4)"
%
(
DATASCOPE_ADDR
))
self
.
x393_mem
.
mem_dump
(
DATASCOPE_ADDR
,
0x20
,
4
)
...
...
@@ -1062,6 +1083,15 @@ sata.reg_status(),sata.reset_ie(),sata.err_count()
'0x3'
for block in range (38,255):
print("
\n
======== Reading block
%
d ==============="
%
block)
sata.arm_logger()
sata.dd_read_dma(block, 1)
_=mem.mem_dump (0x80000ff0, 4,4)
sata.reg_status(),sata.reset_ie(),sata.err_count()
for block in range (1,255):
sata.dd_read_dma(block, 1)
...
...
@@ -1075,6 +1105,12 @@ for block in range (1,255):
_=mem.mem_dump (0x80001000, 0x100,4)
sata.reg_status(),sata.reset_ie(),sata.err_count()
for block in range (45,255):
print("
\n
======== Reading block
%
d ==============="
%
block)
sata.arm_logger()
sata.dd_read_dma(block, 1)
_=mem.mem_dump (0x80000ff0, 4,4)
sata.reg_status(),sata.reset_ie(),sata.err_count()
#sata.drp (0x20b,0x81), sata.drp (0x20b,0x4081)
...
...
tb_ahci_01.sav
View file @
fb82aa54
[*]
[*] GTKWave Analyzer v3.3.66 (w)1999-2015 BSI
[*] S
at Feb 13 07:29:00
2016
[*] S
un Feb 14 23:58:57
2016
[*]
[dumpfile] "/home/andrey/git/x393_sata/simulation/tb_ahci-2016021
1141748402
.fst"
[dumpfile_mtime] "
Thu Feb 11 21:19:18
2016"
[dumpfile_size] 105
1845
9
[dumpfile] "/home/andrey/git/x393_sata/simulation/tb_ahci-2016021
4134023147
.fst"
[dumpfile_mtime] "
Sun Feb 14 20:41:46
2016"
[dumpfile_size] 105
9103
9
[savefile] "/home/andrey/git/x393_sata/tb_ahci_01.sav"
[timestart]
515575
00
[timestart]
148769
00
[size] 1823 1180
[pos]
0
0
*-16.
563877 51888300
29549854 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[pos]
2026
0
*-16.
443789 15151294
29549854 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] tb_ahci.
[treeopen] tb_ahci.axi_read_addr.
[treeopen] tb_ahci.dev.linkMonitorFIS.
...
...
@@ -60,15 +60,659 @@
[treeopen] tb_ahci.simul_axi_hp_wr_i.wdata_i.
[treeopen] tb_ahci.simul_axi_read_i.
[sst_width] 296
[signals_width]
313
[signals_width]
252
[sst_expanded] 1
[sst_vpaned_height] 573
@820
tb_ahci.TESTBENCH_TITLE[639:0]
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.oob_ctrl.oob.HOST_OOB_TITLE[639:0]
tb_ahci.DEVICE_TITLE[639:0]
@c00820
tb_ahci.dev.DEV_TITLE[639:0]
@28
(0)tb_ahci.dev.DEV_TITLE[639:0]
(1)tb_ahci.dev.DEV_TITLE[639:0]
(2)tb_ahci.dev.DEV_TITLE[639:0]
(3)tb_ahci.dev.DEV_TITLE[639:0]
(4)tb_ahci.dev.DEV_TITLE[639:0]
(5)tb_ahci.dev.DEV_TITLE[639:0]
(6)tb_ahci.dev.DEV_TITLE[639:0]
(7)tb_ahci.dev.DEV_TITLE[639:0]
(8)tb_ahci.dev.DEV_TITLE[639:0]
(9)tb_ahci.dev.DEV_TITLE[639:0]
(10)tb_ahci.dev.DEV_TITLE[639:0]
(11)tb_ahci.dev.DEV_TITLE[639:0]
(12)tb_ahci.dev.DEV_TITLE[639:0]
(13)tb_ahci.dev.DEV_TITLE[639:0]
(14)tb_ahci.dev.DEV_TITLE[639:0]
(15)tb_ahci.dev.DEV_TITLE[639:0]
(16)tb_ahci.dev.DEV_TITLE[639:0]
(17)tb_ahci.dev.DEV_TITLE[639:0]
(18)tb_ahci.dev.DEV_TITLE[639:0]
(19)tb_ahci.dev.DEV_TITLE[639:0]
(20)tb_ahci.dev.DEV_TITLE[639:0]
(21)tb_ahci.dev.DEV_TITLE[639:0]
(22)tb_ahci.dev.DEV_TITLE[639:0]
(23)tb_ahci.dev.DEV_TITLE[639:0]
(24)tb_ahci.dev.DEV_TITLE[639:0]
(25)tb_ahci.dev.DEV_TITLE[639:0]
(26)tb_ahci.dev.DEV_TITLE[639:0]
(27)tb_ahci.dev.DEV_TITLE[639:0]
(28)tb_ahci.dev.DEV_TITLE[639:0]
(29)tb_ahci.dev.DEV_TITLE[639:0]
(30)tb_ahci.dev.DEV_TITLE[639:0]
(31)tb_ahci.dev.DEV_TITLE[639:0]
(32)tb_ahci.dev.DEV_TITLE[639:0]
(33)tb_ahci.dev.DEV_TITLE[639:0]
(34)tb_ahci.dev.DEV_TITLE[639:0]
(35)tb_ahci.dev.DEV_TITLE[639:0]
(36)tb_ahci.dev.DEV_TITLE[639:0]
(37)tb_ahci.dev.DEV_TITLE[639:0]
(38)tb_ahci.dev.DEV_TITLE[639:0]
(39)tb_ahci.dev.DEV_TITLE[639:0]
(40)tb_ahci.dev.DEV_TITLE[639:0]
(41)tb_ahci.dev.DEV_TITLE[639:0]
(42)tb_ahci.dev.DEV_TITLE[639:0]
(43)tb_ahci.dev.DEV_TITLE[639:0]
(44)tb_ahci.dev.DEV_TITLE[639:0]
(45)tb_ahci.dev.DEV_TITLE[639:0]
(46)tb_ahci.dev.DEV_TITLE[639:0]
(47)tb_ahci.dev.DEV_TITLE[639:0]
(48)tb_ahci.dev.DEV_TITLE[639:0]
(49)tb_ahci.dev.DEV_TITLE[639:0]
(50)tb_ahci.dev.DEV_TITLE[639:0]
(51)tb_ahci.dev.DEV_TITLE[639:0]
(52)tb_ahci.dev.DEV_TITLE[639:0]
(53)tb_ahci.dev.DEV_TITLE[639:0]
(54)tb_ahci.dev.DEV_TITLE[639:0]
(55)tb_ahci.dev.DEV_TITLE[639:0]
(56)tb_ahci.dev.DEV_TITLE[639:0]
(57)tb_ahci.dev.DEV_TITLE[639:0]
(58)tb_ahci.dev.DEV_TITLE[639:0]
(59)tb_ahci.dev.DEV_TITLE[639:0]
(60)tb_ahci.dev.DEV_TITLE[639:0]
(61)tb_ahci.dev.DEV_TITLE[639:0]
(62)tb_ahci.dev.DEV_TITLE[639:0]
(63)tb_ahci.dev.DEV_TITLE[639:0]
(64)tb_ahci.dev.DEV_TITLE[639:0]
(65)tb_ahci.dev.DEV_TITLE[639:0]
(66)tb_ahci.dev.DEV_TITLE[639:0]
(67)tb_ahci.dev.DEV_TITLE[639:0]
(68)tb_ahci.dev.DEV_TITLE[639:0]
(69)tb_ahci.dev.DEV_TITLE[639:0]
(70)tb_ahci.dev.DEV_TITLE[639:0]
(71)tb_ahci.dev.DEV_TITLE[639:0]
(72)tb_ahci.dev.DEV_TITLE[639:0]
(73)tb_ahci.dev.DEV_TITLE[639:0]
(74)tb_ahci.dev.DEV_TITLE[639:0]
(75)tb_ahci.dev.DEV_TITLE[639:0]
(76)tb_ahci.dev.DEV_TITLE[639:0]
(77)tb_ahci.dev.DEV_TITLE[639:0]
(78)tb_ahci.dev.DEV_TITLE[639:0]
(79)tb_ahci.dev.DEV_TITLE[639:0]
(80)tb_ahci.dev.DEV_TITLE[639:0]
(81)tb_ahci.dev.DEV_TITLE[639:0]
(82)tb_ahci.dev.DEV_TITLE[639:0]
(83)tb_ahci.dev.DEV_TITLE[639:0]
(84)tb_ahci.dev.DEV_TITLE[639:0]
(85)tb_ahci.dev.DEV_TITLE[639:0]
(86)tb_ahci.dev.DEV_TITLE[639:0]
(87)tb_ahci.dev.DEV_TITLE[639:0]
(88)tb_ahci.dev.DEV_TITLE[639:0]
(89)tb_ahci.dev.DEV_TITLE[639:0]
(90)tb_ahci.dev.DEV_TITLE[639:0]
(91)tb_ahci.dev.DEV_TITLE[639:0]
(92)tb_ahci.dev.DEV_TITLE[639:0]
(93)tb_ahci.dev.DEV_TITLE[639:0]
(94)tb_ahci.dev.DEV_TITLE[639:0]
(95)tb_ahci.dev.DEV_TITLE[639:0]
(96)tb_ahci.dev.DEV_TITLE[639:0]
(97)tb_ahci.dev.DEV_TITLE[639:0]
(98)tb_ahci.dev.DEV_TITLE[639:0]
(99)tb_ahci.dev.DEV_TITLE[639:0]
(100)tb_ahci.dev.DEV_TITLE[639:0]
(101)tb_ahci.dev.DEV_TITLE[639:0]
(102)tb_ahci.dev.DEV_TITLE[639:0]
(103)tb_ahci.dev.DEV_TITLE[639:0]
(104)tb_ahci.dev.DEV_TITLE[639:0]
(105)tb_ahci.dev.DEV_TITLE[639:0]
(106)tb_ahci.dev.DEV_TITLE[639:0]
(107)tb_ahci.dev.DEV_TITLE[639:0]
(108)tb_ahci.dev.DEV_TITLE[639:0]
(109)tb_ahci.dev.DEV_TITLE[639:0]
(110)tb_ahci.dev.DEV_TITLE[639:0]
(111)tb_ahci.dev.DEV_TITLE[639:0]
(112)tb_ahci.dev.DEV_TITLE[639:0]
(113)tb_ahci.dev.DEV_TITLE[639:0]
(114)tb_ahci.dev.DEV_TITLE[639:0]
(115)tb_ahci.dev.DEV_TITLE[639:0]
(116)tb_ahci.dev.DEV_TITLE[639:0]
(117)tb_ahci.dev.DEV_TITLE[639:0]
(118)tb_ahci.dev.DEV_TITLE[639:0]
(119)tb_ahci.dev.DEV_TITLE[639:0]
(120)tb_ahci.dev.DEV_TITLE[639:0]
(121)tb_ahci.dev.DEV_TITLE[639:0]
(122)tb_ahci.dev.DEV_TITLE[639:0]
(123)tb_ahci.dev.DEV_TITLE[639:0]
(124)tb_ahci.dev.DEV_TITLE[639:0]
(125)tb_ahci.dev.DEV_TITLE[639:0]
(126)tb_ahci.dev.DEV_TITLE[639:0]
(127)tb_ahci.dev.DEV_TITLE[639:0]
(128)tb_ahci.dev.DEV_TITLE[639:0]
(129)tb_ahci.dev.DEV_TITLE[639:0]
(130)tb_ahci.dev.DEV_TITLE[639:0]
(131)tb_ahci.dev.DEV_TITLE[639:0]
(132)tb_ahci.dev.DEV_TITLE[639:0]
(133)tb_ahci.dev.DEV_TITLE[639:0]
(134)tb_ahci.dev.DEV_TITLE[639:0]
(135)tb_ahci.dev.DEV_TITLE[639:0]
(136)tb_ahci.dev.DEV_TITLE[639:0]
(137)tb_ahci.dev.DEV_TITLE[639:0]
(138)tb_ahci.dev.DEV_TITLE[639:0]
(139)tb_ahci.dev.DEV_TITLE[639:0]
(140)tb_ahci.dev.DEV_TITLE[639:0]
(141)tb_ahci.dev.DEV_TITLE[639:0]
(142)tb_ahci.dev.DEV_TITLE[639:0]
(143)tb_ahci.dev.DEV_TITLE[639:0]
(144)tb_ahci.dev.DEV_TITLE[639:0]
(145)tb_ahci.dev.DEV_TITLE[639:0]
(146)tb_ahci.dev.DEV_TITLE[639:0]
(147)tb_ahci.dev.DEV_TITLE[639:0]
(148)tb_ahci.dev.DEV_TITLE[639:0]
(149)tb_ahci.dev.DEV_TITLE[639:0]
(150)tb_ahci.dev.DEV_TITLE[639:0]
(151)tb_ahci.dev.DEV_TITLE[639:0]
(152)tb_ahci.dev.DEV_TITLE[639:0]
(153)tb_ahci.dev.DEV_TITLE[639:0]
(154)tb_ahci.dev.DEV_TITLE[639:0]
(155)tb_ahci.dev.DEV_TITLE[639:0]
(156)tb_ahci.dev.DEV_TITLE[639:0]
(157)tb_ahci.dev.DEV_TITLE[639:0]
(158)tb_ahci.dev.DEV_TITLE[639:0]
(159)tb_ahci.dev.DEV_TITLE[639:0]
(160)tb_ahci.dev.DEV_TITLE[639:0]
(161)tb_ahci.dev.DEV_TITLE[639:0]
(162)tb_ahci.dev.DEV_TITLE[639:0]
(163)tb_ahci.dev.DEV_TITLE[639:0]
(164)tb_ahci.dev.DEV_TITLE[639:0]
(165)tb_ahci.dev.DEV_TITLE[639:0]
(166)tb_ahci.dev.DEV_TITLE[639:0]
(167)tb_ahci.dev.DEV_TITLE[639:0]
(168)tb_ahci.dev.DEV_TITLE[639:0]
(169)tb_ahci.dev.DEV_TITLE[639:0]
(170)tb_ahci.dev.DEV_TITLE[639:0]
(171)tb_ahci.dev.DEV_TITLE[639:0]
(172)tb_ahci.dev.DEV_TITLE[639:0]
(173)tb_ahci.dev.DEV_TITLE[639:0]
(174)tb_ahci.dev.DEV_TITLE[639:0]
(175)tb_ahci.dev.DEV_TITLE[639:0]
(176)tb_ahci.dev.DEV_TITLE[639:0]
(177)tb_ahci.dev.DEV_TITLE[639:0]
(178)tb_ahci.dev.DEV_TITLE[639:0]
(179)tb_ahci.dev.DEV_TITLE[639:0]
(180)tb_ahci.dev.DEV_TITLE[639:0]
(181)tb_ahci.dev.DEV_TITLE[639:0]
(182)tb_ahci.dev.DEV_TITLE[639:0]
(183)tb_ahci.dev.DEV_TITLE[639:0]
(184)tb_ahci.dev.DEV_TITLE[639:0]
(185)tb_ahci.dev.DEV_TITLE[639:0]
(186)tb_ahci.dev.DEV_TITLE[639:0]
(187)tb_ahci.dev.DEV_TITLE[639:0]
(188)tb_ahci.dev.DEV_TITLE[639:0]
(189)tb_ahci.dev.DEV_TITLE[639:0]
(190)tb_ahci.dev.DEV_TITLE[639:0]
(191)tb_ahci.dev.DEV_TITLE[639:0]
(192)tb_ahci.dev.DEV_TITLE[639:0]
(193)tb_ahci.dev.DEV_TITLE[639:0]
(194)tb_ahci.dev.DEV_TITLE[639:0]
(195)tb_ahci.dev.DEV_TITLE[639:0]
(196)tb_ahci.dev.DEV_TITLE[639:0]
(197)tb_ahci.dev.DEV_TITLE[639:0]
(198)tb_ahci.dev.DEV_TITLE[639:0]
(199)tb_ahci.dev.DEV_TITLE[639:0]
(200)tb_ahci.dev.DEV_TITLE[639:0]
(201)tb_ahci.dev.DEV_TITLE[639:0]
(202)tb_ahci.dev.DEV_TITLE[639:0]
(203)tb_ahci.dev.DEV_TITLE[639:0]
(204)tb_ahci.dev.DEV_TITLE[639:0]
(205)tb_ahci.dev.DEV_TITLE[639:0]
(206)tb_ahci.dev.DEV_TITLE[639:0]
(207)tb_ahci.dev.DEV_TITLE[639:0]
(208)tb_ahci.dev.DEV_TITLE[639:0]
(209)tb_ahci.dev.DEV_TITLE[639:0]
(210)tb_ahci.dev.DEV_TITLE[639:0]
(211)tb_ahci.dev.DEV_TITLE[639:0]
(212)tb_ahci.dev.DEV_TITLE[639:0]
(213)tb_ahci.dev.DEV_TITLE[639:0]
(214)tb_ahci.dev.DEV_TITLE[639:0]
(215)tb_ahci.dev.DEV_TITLE[639:0]
(216)tb_ahci.dev.DEV_TITLE[639:0]
(217)tb_ahci.dev.DEV_TITLE[639:0]
(218)tb_ahci.dev.DEV_TITLE[639:0]
(219)tb_ahci.dev.DEV_TITLE[639:0]
(220)tb_ahci.dev.DEV_TITLE[639:0]
(221)tb_ahci.dev.DEV_TITLE[639:0]
(222)tb_ahci.dev.DEV_TITLE[639:0]
(223)tb_ahci.dev.DEV_TITLE[639:0]
(224)tb_ahci.dev.DEV_TITLE[639:0]
(225)tb_ahci.dev.DEV_TITLE[639:0]
(226)tb_ahci.dev.DEV_TITLE[639:0]
(227)tb_ahci.dev.DEV_TITLE[639:0]
(228)tb_ahci.dev.DEV_TITLE[639:0]
(229)tb_ahci.dev.DEV_TITLE[639:0]
(230)tb_ahci.dev.DEV_TITLE[639:0]
(231)tb_ahci.dev.DEV_TITLE[639:0]
(232)tb_ahci.dev.DEV_TITLE[639:0]
(233)tb_ahci.dev.DEV_TITLE[639:0]
(234)tb_ahci.dev.DEV_TITLE[639:0]
(235)tb_ahci.dev.DEV_TITLE[639:0]
(236)tb_ahci.dev.DEV_TITLE[639:0]
(237)tb_ahci.dev.DEV_TITLE[639:0]
(238)tb_ahci.dev.DEV_TITLE[639:0]
(239)tb_ahci.dev.DEV_TITLE[639:0]
(240)tb_ahci.dev.DEV_TITLE[639:0]
(241)tb_ahci.dev.DEV_TITLE[639:0]
(242)tb_ahci.dev.DEV_TITLE[639:0]
(243)tb_ahci.dev.DEV_TITLE[639:0]
(244)tb_ahci.dev.DEV_TITLE[639:0]
(245)tb_ahci.dev.DEV_TITLE[639:0]
(246)tb_ahci.dev.DEV_TITLE[639:0]
(247)tb_ahci.dev.DEV_TITLE[639:0]
(248)tb_ahci.dev.DEV_TITLE[639:0]
(249)tb_ahci.dev.DEV_TITLE[639:0]
(250)tb_ahci.dev.DEV_TITLE[639:0]
(251)tb_ahci.dev.DEV_TITLE[639:0]
(252)tb_ahci.dev.DEV_TITLE[639:0]
(253)tb_ahci.dev.DEV_TITLE[639:0]
(254)tb_ahci.dev.DEV_TITLE[639:0]
(255)tb_ahci.dev.DEV_TITLE[639:0]
(256)tb_ahci.dev.DEV_TITLE[639:0]
(257)tb_ahci.dev.DEV_TITLE[639:0]
(258)tb_ahci.dev.DEV_TITLE[639:0]
(259)tb_ahci.dev.DEV_TITLE[639:0]
(260)tb_ahci.dev.DEV_TITLE[639:0]
(261)tb_ahci.dev.DEV_TITLE[639:0]
(262)tb_ahci.dev.DEV_TITLE[639:0]
(263)tb_ahci.dev.DEV_TITLE[639:0]
(264)tb_ahci.dev.DEV_TITLE[639:0]
(265)tb_ahci.dev.DEV_TITLE[639:0]
(266)tb_ahci.dev.DEV_TITLE[639:0]
(267)tb_ahci.dev.DEV_TITLE[639:0]
(268)tb_ahci.dev.DEV_TITLE[639:0]
(269)tb_ahci.dev.DEV_TITLE[639:0]
(270)tb_ahci.dev.DEV_TITLE[639:0]
(271)tb_ahci.dev.DEV_TITLE[639:0]
(272)tb_ahci.dev.DEV_TITLE[639:0]
(273)tb_ahci.dev.DEV_TITLE[639:0]
(274)tb_ahci.dev.DEV_TITLE[639:0]
(275)tb_ahci.dev.DEV_TITLE[639:0]
(276)tb_ahci.dev.DEV_TITLE[639:0]
(277)tb_ahci.dev.DEV_TITLE[639:0]
(278)tb_ahci.dev.DEV_TITLE[639:0]
(279)tb_ahci.dev.DEV_TITLE[639:0]
(280)tb_ahci.dev.DEV_TITLE[639:0]
(281)tb_ahci.dev.DEV_TITLE[639:0]
(282)tb_ahci.dev.DEV_TITLE[639:0]
(283)tb_ahci.dev.DEV_TITLE[639:0]
(284)tb_ahci.dev.DEV_TITLE[639:0]
(285)tb_ahci.dev.DEV_TITLE[639:0]
(286)tb_ahci.dev.DEV_TITLE[639:0]
(287)tb_ahci.dev.DEV_TITLE[639:0]
(288)tb_ahci.dev.DEV_TITLE[639:0]
(289)tb_ahci.dev.DEV_TITLE[639:0]
(290)tb_ahci.dev.DEV_TITLE[639:0]
(291)tb_ahci.dev.DEV_TITLE[639:0]
(292)tb_ahci.dev.DEV_TITLE[639:0]
(293)tb_ahci.dev.DEV_TITLE[639:0]
(294)tb_ahci.dev.DEV_TITLE[639:0]
(295)tb_ahci.dev.DEV_TITLE[639:0]
(296)tb_ahci.dev.DEV_TITLE[639:0]
(297)tb_ahci.dev.DEV_TITLE[639:0]
(298)tb_ahci.dev.DEV_TITLE[639:0]
(299)tb_ahci.dev.DEV_TITLE[639:0]
(300)tb_ahci.dev.DEV_TITLE[639:0]
(301)tb_ahci.dev.DEV_TITLE[639:0]
(302)tb_ahci.dev.DEV_TITLE[639:0]
(303)tb_ahci.dev.DEV_TITLE[639:0]
(304)tb_ahci.dev.DEV_TITLE[639:0]
(305)tb_ahci.dev.DEV_TITLE[639:0]
(306)tb_ahci.dev.DEV_TITLE[639:0]
(307)tb_ahci.dev.DEV_TITLE[639:0]
(308)tb_ahci.dev.DEV_TITLE[639:0]
(309)tb_ahci.dev.DEV_TITLE[639:0]
(310)tb_ahci.dev.DEV_TITLE[639:0]
(311)tb_ahci.dev.DEV_TITLE[639:0]
(312)tb_ahci.dev.DEV_TITLE[639:0]
(313)tb_ahci.dev.DEV_TITLE[639:0]
(314)tb_ahci.dev.DEV_TITLE[639:0]
(315)tb_ahci.dev.DEV_TITLE[639:0]
(316)tb_ahci.dev.DEV_TITLE[639:0]
(317)tb_ahci.dev.DEV_TITLE[639:0]
(318)tb_ahci.dev.DEV_TITLE[639:0]
(319)tb_ahci.dev.DEV_TITLE[639:0]
(320)tb_ahci.dev.DEV_TITLE[639:0]
(321)tb_ahci.dev.DEV_TITLE[639:0]
(322)tb_ahci.dev.DEV_TITLE[639:0]
(323)tb_ahci.dev.DEV_TITLE[639:0]
(324)tb_ahci.dev.DEV_TITLE[639:0]
(325)tb_ahci.dev.DEV_TITLE[639:0]
(326)tb_ahci.dev.DEV_TITLE[639:0]
(327)tb_ahci.dev.DEV_TITLE[639:0]
(328)tb_ahci.dev.DEV_TITLE[639:0]
(329)tb_ahci.dev.DEV_TITLE[639:0]
(330)tb_ahci.dev.DEV_TITLE[639:0]
(331)tb_ahci.dev.DEV_TITLE[639:0]
(332)tb_ahci.dev.DEV_TITLE[639:0]
(333)tb_ahci.dev.DEV_TITLE[639:0]
(334)tb_ahci.dev.DEV_TITLE[639:0]
(335)tb_ahci.dev.DEV_TITLE[639:0]
(336)tb_ahci.dev.DEV_TITLE[639:0]
(337)tb_ahci.dev.DEV_TITLE[639:0]
(338)tb_ahci.dev.DEV_TITLE[639:0]
(339)tb_ahci.dev.DEV_TITLE[639:0]
(340)tb_ahci.dev.DEV_TITLE[639:0]
(341)tb_ahci.dev.DEV_TITLE[639:0]
(342)tb_ahci.dev.DEV_TITLE[639:0]
(343)tb_ahci.dev.DEV_TITLE[639:0]
(344)tb_ahci.dev.DEV_TITLE[639:0]
(345)tb_ahci.dev.DEV_TITLE[639:0]
(346)tb_ahci.dev.DEV_TITLE[639:0]
(347)tb_ahci.dev.DEV_TITLE[639:0]
(348)tb_ahci.dev.DEV_TITLE[639:0]
(349)tb_ahci.dev.DEV_TITLE[639:0]
(350)tb_ahci.dev.DEV_TITLE[639:0]
(351)tb_ahci.dev.DEV_TITLE[639:0]
(352)tb_ahci.dev.DEV_TITLE[639:0]
(353)tb_ahci.dev.DEV_TITLE[639:0]
(354)tb_ahci.dev.DEV_TITLE[639:0]
(355)tb_ahci.dev.DEV_TITLE[639:0]
(356)tb_ahci.dev.DEV_TITLE[639:0]
(357)tb_ahci.dev.DEV_TITLE[639:0]
(358)tb_ahci.dev.DEV_TITLE[639:0]
(359)tb_ahci.dev.DEV_TITLE[639:0]
(360)tb_ahci.dev.DEV_TITLE[639:0]
(361)tb_ahci.dev.DEV_TITLE[639:0]
(362)tb_ahci.dev.DEV_TITLE[639:0]
(363)tb_ahci.dev.DEV_TITLE[639:0]
(364)tb_ahci.dev.DEV_TITLE[639:0]
(365)tb_ahci.dev.DEV_TITLE[639:0]
(366)tb_ahci.dev.DEV_TITLE[639:0]
(367)tb_ahci.dev.DEV_TITLE[639:0]
(368)tb_ahci.dev.DEV_TITLE[639:0]
(369)tb_ahci.dev.DEV_TITLE[639:0]
(370)tb_ahci.dev.DEV_TITLE[639:0]
(371)tb_ahci.dev.DEV_TITLE[639:0]
(372)tb_ahci.dev.DEV_TITLE[639:0]
(373)tb_ahci.dev.DEV_TITLE[639:0]
(374)tb_ahci.dev.DEV_TITLE[639:0]
(375)tb_ahci.dev.DEV_TITLE[639:0]
(376)tb_ahci.dev.DEV_TITLE[639:0]
(377)tb_ahci.dev.DEV_TITLE[639:0]
(378)tb_ahci.dev.DEV_TITLE[639:0]
(379)tb_ahci.dev.DEV_TITLE[639:0]
(380)tb_ahci.dev.DEV_TITLE[639:0]
(381)tb_ahci.dev.DEV_TITLE[639:0]
(382)tb_ahci.dev.DEV_TITLE[639:0]
(383)tb_ahci.dev.DEV_TITLE[639:0]
(384)tb_ahci.dev.DEV_TITLE[639:0]
(385)tb_ahci.dev.DEV_TITLE[639:0]
(386)tb_ahci.dev.DEV_TITLE[639:0]
(387)tb_ahci.dev.DEV_TITLE[639:0]
(388)tb_ahci.dev.DEV_TITLE[639:0]
(389)tb_ahci.dev.DEV_TITLE[639:0]
(390)tb_ahci.dev.DEV_TITLE[639:0]
(391)tb_ahci.dev.DEV_TITLE[639:0]
(392)tb_ahci.dev.DEV_TITLE[639:0]
(393)tb_ahci.dev.DEV_TITLE[639:0]
(394)tb_ahci.dev.DEV_TITLE[639:0]
(395)tb_ahci.dev.DEV_TITLE[639:0]
(396)tb_ahci.dev.DEV_TITLE[639:0]
(397)tb_ahci.dev.DEV_TITLE[639:0]
(398)tb_ahci.dev.DEV_TITLE[639:0]
(399)tb_ahci.dev.DEV_TITLE[639:0]
(400)tb_ahci.dev.DEV_TITLE[639:0]
(401)tb_ahci.dev.DEV_TITLE[639:0]
(402)tb_ahci.dev.DEV_TITLE[639:0]
(403)tb_ahci.dev.DEV_TITLE[639:0]
(404)tb_ahci.dev.DEV_TITLE[639:0]
(405)tb_ahci.dev.DEV_TITLE[639:0]
(406)tb_ahci.dev.DEV_TITLE[639:0]
(407)tb_ahci.dev.DEV_TITLE[639:0]
(408)tb_ahci.dev.DEV_TITLE[639:0]
(409)tb_ahci.dev.DEV_TITLE[639:0]
(410)tb_ahci.dev.DEV_TITLE[639:0]
(411)tb_ahci.dev.DEV_TITLE[639:0]
(412)tb_ahci.dev.DEV_TITLE[639:0]
(413)tb_ahci.dev.DEV_TITLE[639:0]
(414)tb_ahci.dev.DEV_TITLE[639:0]
(415)tb_ahci.dev.DEV_TITLE[639:0]
(416)tb_ahci.dev.DEV_TITLE[639:0]
(417)tb_ahci.dev.DEV_TITLE[639:0]
(418)tb_ahci.dev.DEV_TITLE[639:0]
(419)tb_ahci.dev.DEV_TITLE[639:0]
(420)tb_ahci.dev.DEV_TITLE[639:0]
(421)tb_ahci.dev.DEV_TITLE[639:0]
(422)tb_ahci.dev.DEV_TITLE[639:0]
(423)tb_ahci.dev.DEV_TITLE[639:0]
(424)tb_ahci.dev.DEV_TITLE[639:0]
(425)tb_ahci.dev.DEV_TITLE[639:0]
(426)tb_ahci.dev.DEV_TITLE[639:0]
(427)tb_ahci.dev.DEV_TITLE[639:0]
(428)tb_ahci.dev.DEV_TITLE[639:0]
(429)tb_ahci.dev.DEV_TITLE[639:0]
(430)tb_ahci.dev.DEV_TITLE[639:0]
(431)tb_ahci.dev.DEV_TITLE[639:0]
(432)tb_ahci.dev.DEV_TITLE[639:0]
(433)tb_ahci.dev.DEV_TITLE[639:0]
(434)tb_ahci.dev.DEV_TITLE[639:0]
(435)tb_ahci.dev.DEV_TITLE[639:0]
(436)tb_ahci.dev.DEV_TITLE[639:0]
(437)tb_ahci.dev.DEV_TITLE[639:0]
(438)tb_ahci.dev.DEV_TITLE[639:0]
(439)tb_ahci.dev.DEV_TITLE[639:0]
(440)tb_ahci.dev.DEV_TITLE[639:0]
(441)tb_ahci.dev.DEV_TITLE[639:0]
(442)tb_ahci.dev.DEV_TITLE[639:0]
(443)tb_ahci.dev.DEV_TITLE[639:0]
(444)tb_ahci.dev.DEV_TITLE[639:0]
(445)tb_ahci.dev.DEV_TITLE[639:0]
(446)tb_ahci.dev.DEV_TITLE[639:0]
(447)tb_ahci.dev.DEV_TITLE[639:0]
(448)tb_ahci.dev.DEV_TITLE[639:0]
(449)tb_ahci.dev.DEV_TITLE[639:0]
(450)tb_ahci.dev.DEV_TITLE[639:0]
(451)tb_ahci.dev.DEV_TITLE[639:0]
(452)tb_ahci.dev.DEV_TITLE[639:0]
(453)tb_ahci.dev.DEV_TITLE[639:0]
(454)tb_ahci.dev.DEV_TITLE[639:0]
(455)tb_ahci.dev.DEV_TITLE[639:0]
(456)tb_ahci.dev.DEV_TITLE[639:0]
(457)tb_ahci.dev.DEV_TITLE[639:0]
(458)tb_ahci.dev.DEV_TITLE[639:0]
(459)tb_ahci.dev.DEV_TITLE[639:0]
(460)tb_ahci.dev.DEV_TITLE[639:0]
(461)tb_ahci.dev.DEV_TITLE[639:0]
(462)tb_ahci.dev.DEV_TITLE[639:0]
(463)tb_ahci.dev.DEV_TITLE[639:0]
(464)tb_ahci.dev.DEV_TITLE[639:0]
(465)tb_ahci.dev.DEV_TITLE[639:0]
(466)tb_ahci.dev.DEV_TITLE[639:0]
(467)tb_ahci.dev.DEV_TITLE[639:0]
(468)tb_ahci.dev.DEV_TITLE[639:0]
(469)tb_ahci.dev.DEV_TITLE[639:0]
(470)tb_ahci.dev.DEV_TITLE[639:0]
(471)tb_ahci.dev.DEV_TITLE[639:0]
(472)tb_ahci.dev.DEV_TITLE[639:0]
(473)tb_ahci.dev.DEV_TITLE[639:0]
(474)tb_ahci.dev.DEV_TITLE[639:0]
(475)tb_ahci.dev.DEV_TITLE[639:0]
(476)tb_ahci.dev.DEV_TITLE[639:0]
(477)tb_ahci.dev.DEV_TITLE[639:0]
(478)tb_ahci.dev.DEV_TITLE[639:0]
(479)tb_ahci.dev.DEV_TITLE[639:0]
(480)tb_ahci.dev.DEV_TITLE[639:0]
(481)tb_ahci.dev.DEV_TITLE[639:0]
(482)tb_ahci.dev.DEV_TITLE[639:0]
(483)tb_ahci.dev.DEV_TITLE[639:0]
(484)tb_ahci.dev.DEV_TITLE[639:0]
(485)tb_ahci.dev.DEV_TITLE[639:0]
(486)tb_ahci.dev.DEV_TITLE[639:0]
(487)tb_ahci.dev.DEV_TITLE[639:0]
(488)tb_ahci.dev.DEV_TITLE[639:0]
(489)tb_ahci.dev.DEV_TITLE[639:0]
(490)tb_ahci.dev.DEV_TITLE[639:0]
(491)tb_ahci.dev.DEV_TITLE[639:0]
(492)tb_ahci.dev.DEV_TITLE[639:0]
(493)tb_ahci.dev.DEV_TITLE[639:0]
(494)tb_ahci.dev.DEV_TITLE[639:0]
(495)tb_ahci.dev.DEV_TITLE[639:0]
(496)tb_ahci.dev.DEV_TITLE[639:0]
(497)tb_ahci.dev.DEV_TITLE[639:0]
(498)tb_ahci.dev.DEV_TITLE[639:0]
(499)tb_ahci.dev.DEV_TITLE[639:0]
(500)tb_ahci.dev.DEV_TITLE[639:0]
(501)tb_ahci.dev.DEV_TITLE[639:0]
(502)tb_ahci.dev.DEV_TITLE[639:0]
(503)tb_ahci.dev.DEV_TITLE[639:0]
(504)tb_ahci.dev.DEV_TITLE[639:0]
(505)tb_ahci.dev.DEV_TITLE[639:0]
(506)tb_ahci.dev.DEV_TITLE[639:0]
(507)tb_ahci.dev.DEV_TITLE[639:0]
(508)tb_ahci.dev.DEV_TITLE[639:0]
(509)tb_ahci.dev.DEV_TITLE[639:0]
(510)tb_ahci.dev.DEV_TITLE[639:0]
(511)tb_ahci.dev.DEV_TITLE[639:0]
(512)tb_ahci.dev.DEV_TITLE[639:0]
(513)tb_ahci.dev.DEV_TITLE[639:0]
(514)tb_ahci.dev.DEV_TITLE[639:0]
(515)tb_ahci.dev.DEV_TITLE[639:0]
(516)tb_ahci.dev.DEV_TITLE[639:0]
(517)tb_ahci.dev.DEV_TITLE[639:0]
(518)tb_ahci.dev.DEV_TITLE[639:0]
(519)tb_ahci.dev.DEV_TITLE[639:0]
(520)tb_ahci.dev.DEV_TITLE[639:0]
(521)tb_ahci.dev.DEV_TITLE[639:0]
(522)tb_ahci.dev.DEV_TITLE[639:0]
(523)tb_ahci.dev.DEV_TITLE[639:0]
(524)tb_ahci.dev.DEV_TITLE[639:0]
(525)tb_ahci.dev.DEV_TITLE[639:0]
(526)tb_ahci.dev.DEV_TITLE[639:0]
(527)tb_ahci.dev.DEV_TITLE[639:0]
(528)tb_ahci.dev.DEV_TITLE[639:0]
(529)tb_ahci.dev.DEV_TITLE[639:0]
(530)tb_ahci.dev.DEV_TITLE[639:0]
(531)tb_ahci.dev.DEV_TITLE[639:0]
(532)tb_ahci.dev.DEV_TITLE[639:0]
(533)tb_ahci.dev.DEV_TITLE[639:0]
(534)tb_ahci.dev.DEV_TITLE[639:0]
(535)tb_ahci.dev.DEV_TITLE[639:0]
(536)tb_ahci.dev.DEV_TITLE[639:0]
(537)tb_ahci.dev.DEV_TITLE[639:0]
(538)tb_ahci.dev.DEV_TITLE[639:0]
(539)tb_ahci.dev.DEV_TITLE[639:0]
(540)tb_ahci.dev.DEV_TITLE[639:0]
(541)tb_ahci.dev.DEV_TITLE[639:0]
(542)tb_ahci.dev.DEV_TITLE[639:0]
(543)tb_ahci.dev.DEV_TITLE[639:0]
(544)tb_ahci.dev.DEV_TITLE[639:0]
(545)tb_ahci.dev.DEV_TITLE[639:0]
(546)tb_ahci.dev.DEV_TITLE[639:0]
(547)tb_ahci.dev.DEV_TITLE[639:0]
(548)tb_ahci.dev.DEV_TITLE[639:0]
(549)tb_ahci.dev.DEV_TITLE[639:0]
(550)tb_ahci.dev.DEV_TITLE[639:0]
(551)tb_ahci.dev.DEV_TITLE[639:0]
(552)tb_ahci.dev.DEV_TITLE[639:0]
(553)tb_ahci.dev.DEV_TITLE[639:0]
(554)tb_ahci.dev.DEV_TITLE[639:0]
(555)tb_ahci.dev.DEV_TITLE[639:0]
(556)tb_ahci.dev.DEV_TITLE[639:0]
(557)tb_ahci.dev.DEV_TITLE[639:0]
(558)tb_ahci.dev.DEV_TITLE[639:0]
(559)tb_ahci.dev.DEV_TITLE[639:0]
(560)tb_ahci.dev.DEV_TITLE[639:0]
(561)tb_ahci.dev.DEV_TITLE[639:0]
(562)tb_ahci.dev.DEV_TITLE[639:0]
(563)tb_ahci.dev.DEV_TITLE[639:0]
(564)tb_ahci.dev.DEV_TITLE[639:0]
(565)tb_ahci.dev.DEV_TITLE[639:0]
(566)tb_ahci.dev.DEV_TITLE[639:0]
(567)tb_ahci.dev.DEV_TITLE[639:0]
(568)tb_ahci.dev.DEV_TITLE[639:0]
(569)tb_ahci.dev.DEV_TITLE[639:0]
(570)tb_ahci.dev.DEV_TITLE[639:0]
(571)tb_ahci.dev.DEV_TITLE[639:0]
(572)tb_ahci.dev.DEV_TITLE[639:0]
(573)tb_ahci.dev.DEV_TITLE[639:0]
(574)tb_ahci.dev.DEV_TITLE[639:0]
(575)tb_ahci.dev.DEV_TITLE[639:0]
(576)tb_ahci.dev.DEV_TITLE[639:0]
(577)tb_ahci.dev.DEV_TITLE[639:0]
(578)tb_ahci.dev.DEV_TITLE[639:0]
(579)tb_ahci.dev.DEV_TITLE[639:0]
(580)tb_ahci.dev.DEV_TITLE[639:0]
(581)tb_ahci.dev.DEV_TITLE[639:0]
(582)tb_ahci.dev.DEV_TITLE[639:0]
(583)tb_ahci.dev.DEV_TITLE[639:0]
(584)tb_ahci.dev.DEV_TITLE[639:0]
(585)tb_ahci.dev.DEV_TITLE[639:0]
(586)tb_ahci.dev.DEV_TITLE[639:0]
(587)tb_ahci.dev.DEV_TITLE[639:0]
(588)tb_ahci.dev.DEV_TITLE[639:0]
(589)tb_ahci.dev.DEV_TITLE[639:0]
(590)tb_ahci.dev.DEV_TITLE[639:0]
(591)tb_ahci.dev.DEV_TITLE[639:0]
(592)tb_ahci.dev.DEV_TITLE[639:0]
(593)tb_ahci.dev.DEV_TITLE[639:0]
(594)tb_ahci.dev.DEV_TITLE[639:0]
(595)tb_ahci.dev.DEV_TITLE[639:0]
(596)tb_ahci.dev.DEV_TITLE[639:0]
(597)tb_ahci.dev.DEV_TITLE[639:0]
(598)tb_ahci.dev.DEV_TITLE[639:0]
(599)tb_ahci.dev.DEV_TITLE[639:0]
(600)tb_ahci.dev.DEV_TITLE[639:0]
(601)tb_ahci.dev.DEV_TITLE[639:0]
(602)tb_ahci.dev.DEV_TITLE[639:0]
(603)tb_ahci.dev.DEV_TITLE[639:0]
(604)tb_ahci.dev.DEV_TITLE[639:0]
(605)tb_ahci.dev.DEV_TITLE[639:0]
(606)tb_ahci.dev.DEV_TITLE[639:0]
(607)tb_ahci.dev.DEV_TITLE[639:0]
(608)tb_ahci.dev.DEV_TITLE[639:0]
(609)tb_ahci.dev.DEV_TITLE[639:0]
(610)tb_ahci.dev.DEV_TITLE[639:0]
(611)tb_ahci.dev.DEV_TITLE[639:0]
(612)tb_ahci.dev.DEV_TITLE[639:0]
(613)tb_ahci.dev.DEV_TITLE[639:0]
(614)tb_ahci.dev.DEV_TITLE[639:0]
(615)tb_ahci.dev.DEV_TITLE[639:0]
(616)tb_ahci.dev.DEV_TITLE[639:0]
(617)tb_ahci.dev.DEV_TITLE[639:0]
(618)tb_ahci.dev.DEV_TITLE[639:0]
(619)tb_ahci.dev.DEV_TITLE[639:0]
(620)tb_ahci.dev.DEV_TITLE[639:0]
(621)tb_ahci.dev.DEV_TITLE[639:0]
(622)tb_ahci.dev.DEV_TITLE[639:0]
(623)tb_ahci.dev.DEV_TITLE[639:0]
(624)tb_ahci.dev.DEV_TITLE[639:0]
(625)tb_ahci.dev.DEV_TITLE[639:0]
(626)tb_ahci.dev.DEV_TITLE[639:0]
(627)tb_ahci.dev.DEV_TITLE[639:0]
(628)tb_ahci.dev.DEV_TITLE[639:0]
(629)tb_ahci.dev.DEV_TITLE[639:0]
(630)tb_ahci.dev.DEV_TITLE[639:0]
(631)tb_ahci.dev.DEV_TITLE[639:0]
(632)tb_ahci.dev.DEV_TITLE[639:0]
(633)tb_ahci.dev.DEV_TITLE[639:0]
(634)tb_ahci.dev.DEV_TITLE[639:0]
(635)tb_ahci.dev.DEV_TITLE[639:0]
(636)tb_ahci.dev.DEV_TITLE[639:0]
(637)tb_ahci.dev.DEV_TITLE[639:0]
(638)tb_ahci.dev.DEV_TITLE[639:0]
(639)tb_ahci.dev.DEV_TITLE[639:0]
@1401200
-group_end
@28
tb_ahci.CLK
tb_ahci.RST
tb_ahci.AR_SET_CMD_r
...
...
@@ -133,20 +777,8 @@ tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_addr[9:0]
@28
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.aclk
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.axibram_read_i.dev_ready
@c00022
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
@28
(0)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(1)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(2)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(3)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(4)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(5)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(6)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(7)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(8)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(9)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
(10)tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0]
@c00200
-tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr
@1401200
-group_end
@800028
...
...
@@ -965,7 +1597,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_g
-drp
@1401200
-axi_ahci_regs
@c0020
1
@c0020
0
-ahci_fsm
@28
tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.dma_abort_done
...
...
@@ -1232,9 +1864,9 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_pend_r[1:0]
@28
tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_ackn
tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_from_st
@140120
1
@140120
0
-ahci_fsm
@
c
00200
@
8
00200
-ahci_fis_receive
@22
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.hba_data_in[31:0]
...
...
@@ -1284,12 +1916,14 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.is_data_fis
@22
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.reg_ps[4:0]
@28
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.wreg_we_r
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.dwords_over
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_rec_run
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.dma_in_ready
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_end_w
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.data_in_ready
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.wreg_we_r
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.hba_data_in_ready
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_end_w
@800028
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_end_r[1:0]
@28
...
...
@@ -1330,7 +1964,7 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_dcount[3:0]
(3)tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_dcount[3:0]
@1001200
-group_end
@1
401
200
@1
000
200
-ahci_fis_receive
@c00200
-ahci_fis_transmit
...
...
@@ -2794,8 +3428,19 @@ tb_ahci.simul_axi_hp_rd_i.rdata_i.out_full
-
@1401200
-ahci_dma
@
c
00200
@
8
00200
-link
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.ll_d2h_valid
tb_ahci.dut.sata_top.ahci_sata_layers_i.fis_over_r
tb_ahci.dut.sata_top.ahci_sata_layers_i.d2h_fifo_wr
tb_ahci.dut.sata_top.ahci_sata_layers_i.d2h_type_in[1:0]
@29
tb_ahci.dut.sata_top.ahci_sata_layers_i.ll_incom_done
@200
-
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_ack
@c00022
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.debug_out[31:0]
@28
...
...
@@ -2879,9 +3524,14 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.select_prim[15:0]
@1401200
-group_end
-group_end
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.crc_dword[31:0]
@200
-
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.incom_ack_good
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.incom_ack_good_or_pend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.incom_ack_good_pend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_ready
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.set_send_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.rst
...
...
@@ -2890,33 +3540,64 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.alignes_pair
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.incom_done
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.crc_good
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.set_rcvr_goodend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.clr_rcvr_goodend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.set_nocommerr
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.set_reset
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.set_sync_esc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.got_escape
@200
-
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_data_in[31:0]
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_data_in_r0[31:0]
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_data_in_r[31:0]
@c00022
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in[3:0]
@28
(0)tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in[3:0]
(1)tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in[3:0]
(2)tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in[3:0]
(3)tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in[3:0]
@1401200
-group_end
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in_r0[3:0]
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.is_align_p_w
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.phy_isk_in_r[3:0]
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.is_cont_p_w
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.is_non_cont_non_align_p_w
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.last_not_cont_di[31:0]
@800200
-states
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_align
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_idle
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_
nocomm
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_
sync_esc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_nocommerr
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_badend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_eof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_goodcrc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_goodend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_rdy
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_rhold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_shold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_wait
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_nocomm
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_align
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_reset
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_crc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_eof
[color] 2
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_rdy
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_sof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_rhold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_shold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_
sof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_s
ync_esc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_
crc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_s
end_eof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_wait
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_wait
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_rdy
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_rhold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_shold
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_eof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_goodcrc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_goodend
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_badend
@1000200
-states
@28
...
...
@@ -3173,10 +3854,19 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.alignes_pair
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_req
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_ack
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_busy
@1
401
200
@1
000
200
-link
@
c
00200
@
8
00200
-phy
-gtx_8x10enc
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_8x10enc.inisk[1:0]
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_8x10enc.indata[15:0]
@200
-
@1000200
-gtx_8x10enc
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.txdata[31:0]
@28
...
...
@@ -3333,8 +4023,9 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_g
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_gpl.channel.rx.dataiface.wordcounter[31:0]
@1401200
-GTXE2_GPL
@1000200
-phy
@
c
00200
@
8
00200
-comma
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_comma_align.indata[19:0]
...
...
@@ -3344,7 +4035,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_comma_align.comma
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_comma_align.comma_detected
@200
-
@1
401
200
@1
000
200
-comma
@c00200
-elastic_slow
...
...
@@ -3354,14 +4045,12 @@ tb_ahci.elastic1632_slow_i.rclk
[color] 3
tb_ahci.elastic1632_fast_i.rclk
tb_ahci.elastic1632_slow_i.is_alignp_w
@22
tb_ahci.elastic1632_slow_i.data_in[15:0]
tb_ahci.elastic1632_slow_i.data_in_r[15:0]
@28
tb_ahci.elastic1632_slow_i.charisk_in[1:0]
tb_ahci.elastic1632_slow_i.isaligned_in
tb_ahci.elastic1632_slow_i.aligned32_in_r
@22
[color] 3
tb_ahci.elastic1632_slow_i.dbg_di[31:0]
tb_ahci.elastic1632_slow_i.data_out[31:0]
tb_ahci.elastic1632_slow_i.charisk_out[3:0]
@28
...
...
@@ -3433,7 +4122,6 @@ tb_ahci.elastic1632_slow_i.full_0[1:0]
tb_ahci.elastic1632_slow_i.full_1[1:0]
@28
tb_ahci.elastic1632_slow_i.align_out
tb_ahci.elastic1632_slow_i.align_out_r
tb_ahci.elastic1632_slow_i.correct
@800028
tb_ahci.elastic1632_slow_i.correct_r[2:0]
...
...
@@ -3444,8 +4132,8 @@ tb_ahci.elastic1632_slow_i.correct_r[2:0]
@1001200
-group_end
@28
tb_ahci.elastic1632_slow_i.add_rclk
tb_ahci.elastic1632_slow_i.skip_rclk
tb_ahci.elastic1632_slow_i.skip_rclk2
@8022
tb_ahci.elastic1632_slow_i.waddr[4:0]
tb_ahci.elastic1632_slow_i.raddr_r[4:0]
...
...
@@ -3471,6 +4159,8 @@ tb_ahci.elastic1632_fast_i.charisk_in_r[1:0]
@28
tb_ahci.elastic1632_fast_i.isaligned_in
@22
[color] 3
tb_ahci.elastic1632_fast_i.dbg_di[31:0]
tb_ahci.elastic1632_fast_i.data_out[31:0]
tb_ahci.elastic1632_fast_i.charisk_out[3:0]
@28
...
...
@@ -3492,10 +4182,16 @@ tb_ahci.elastic1632_fast_i.full_0[1:0]
tb_ahci.elastic1632_fast_i.full_1[1:0]
@28
tb_ahci.elastic1632_fast_i.align_out
tb_ahci.elastic1632_fast_i.align_out_r
tb_ahci.elastic1632_fast_i.correct
tb_ahci.elastic1632_fast_i.add_rclk
tb_ahci.elastic1632_fast_i.skip_rclk
tb_ahci.elastic1632_fast_i.skip_rclk2
@800028
tb_ahci.elastic1632_fast_i.add_rclk_r[1:0]
@28
(0)tb_ahci.elastic1632_fast_i.add_rclk_r[1:0]
(1)tb_ahci.elastic1632_fast_i.add_rclk_r[1:0]
@1001200
-group_end
@c00028
tb_ahci.elastic1632_fast_i.correct_r[2:0]
@28
...
...
@@ -3672,8 +4368,18 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.txreset
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.rxreset
@1401200
-sipo_meas
@
c
00200
@
8
00200
-gtx
-elastic
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.elastic1632_i.dbg_di[31:0]
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.elastic1632_i.data_out[31:0]
@8022
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.elastic1632_i.dbg_diff[4:0]
@200
-
@1000200
-elastic
@28
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.drp_we
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.drp_en
...
...
@@ -3786,6 +4492,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.txdata_enc_out[19:0]
-
@1401200
-gtx8x10enc
@1000200
-gtx
@c00200
-device
...
...
@@ -3876,6 +4583,11 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_transmit_i.ct_re_r[2:0]
tb_ahci.dut.sata_top.ahci_top_i.fsnd_cfis_xmit
@200
-
@28
tb_ahci.dut.sata_top.ahci_top_i.fsnd_done
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_transmit_busy
tb_ahci.dut.sata_top.ahci_top_i.xmit_err
tb_ahci.dut.sata_top.ahci_top_i.xmit_ok
@22
tb_ahci.dut.sata_top.ahci_top_i.h2d_data[31:0]
@28
...
...
@@ -3931,5 +4643,26 @@ tb_ahci.dut.sata_top.ahci_top_i.datascope_waddr_r[9:0]
tb_ahci.dut.sata_top.ahci_top_i.datascope_we
@1401200
-datascope
@c00200
-frequency_meter
@200
-
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.clk
tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.restart
tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.rst
@800022
tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.run_xclk[3:0]
@28
(0)tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.run_xclk[3:0]
(1)tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.run_xclk[3:0]
(2)tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.run_xclk[3:0]
(3)tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.run_xclk[3:0]
@1001200
-group_end
@28
tb_ahci.dut.sata_top.ahci_sata_layers_i.freq_meter_i.xclk
@1401200
-frequency_meter
[pattern_trace] 1
[pattern_trace] 0
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