Commit fb82aa54 authored by Andrey Filippov's avatar Andrey Filippov

eliminated all phy errors, working on remaining in ll

parent 78da3183
...@@ -52,87 +52,87 @@ ...@@ -52,87 +52,87 @@
<link> <link>
<name>vivado_logs/VivadoBitstream.log</name> <name>vivado_logs/VivadoBitstream.log</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_logs/VivadoBitstream-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoBitstream-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoOpt-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoOpt-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoOptPhys-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoOptPhys-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoOptPower-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoOptPower-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoPlace-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoPlace-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoRoute-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoRoute-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoSynthesis-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoSynthesis-20160214170151284.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>/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportImplemented-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportImplemented-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportSynthesis-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoTimimgSummaryReportSynthesis-20160214170151284.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>/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportImplemented-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportImplemented-20160214170313831.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>/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportSynthesis-20160213012011614.log</location> <location>/home/andrey/git/x393_sata/vivado_logs/VivadoTimingReportSynthesis-20160214170151284.log</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-opt-phys.dcp</name> <name>vivado_state/x393_sata-opt-phys.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-phys-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-phys-20160214170313831.dcp</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-opt-power.dcp</name> <name>vivado_state/x393_sata-opt-power.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-power-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-power-20160214170313831.dcp</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-opt.dcp</name> <name>vivado_state/x393_sata-opt.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-opt-20160214170313831.dcp</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-place.dcp</name> <name>vivado_state/x393_sata-place.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-place-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-place-20160214170313831.dcp</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-route.dcp</name> <name>vivado_state/x393_sata-route.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-route-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-route-20160214170313831.dcp</location>
</link> </link>
<link> <link>
<name>vivado_state/x393_sata-synth.dcp</name> <name>vivado_state/x393_sata-synth.dcp</name>
<type>1</type> <type>1</type>
<location>/home/andrey/git/x393_sata/vivado_state/x393_sata-synth-20160213012011614.dcp</location> <location>/home/andrey/git/x393_sata/vivado_state/x393_sata-synth-20160214170151284.dcp</location>
</link> </link>
</linkedResources> </linkedResources>
</projectDescription> </projectDescription>
...@@ -182,10 +182,10 @@ localparam DATA_TYPE_ERR = 3; ...@@ -182,10 +182,10 @@ localparam DATA_TYPE_ERR = 3;
wire reg_we_w; wire reg_we_w;
reg [3:0] store_sig; reg [3:0] store_sig;
reg [5:0] reg_ds; reg [5:0] reg_ds; //Unused?
reg [4:0] reg_ps; reg [4:0] reg_ps;
reg reg_d2h; reg reg_d2h; //unused?
reg [1:0] reg_sdb; reg [1:0] reg_sdb; //unused?
reg [31:2] xfer_cntr_r; reg [31:2] xfer_cntr_r;
reg [31:2] prdbc_r; reg [31:2] prdbc_r;
......
...@@ -53,7 +53,7 @@ module ahci_fis_transmit #( ...@@ -53,7 +53,7 @@ module ahci_fis_transmit #(
input xmit_err, // input xmit_err, //
input syncesc_recv, // These two inputs interrupt transmit input syncesc_recv, // These two inputs interrupt transmit
input xrdy_collision, 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 [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 output ch_c, // Clear busy upon R_OK for this FIS
......
...@@ -225,7 +225,7 @@ module ahci_fsm ...@@ -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 // 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 syncesc_recv, // These two inputs interrupt transmit
// input xmit_err, // // 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 [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 input ch_c, // Clear busy upon R_OK for this FIS
......
...@@ -26,8 +26,12 @@ module ahci_sata_layers #( ...@@ -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_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 parameter DATASCOPE_POST_MEAS = 16, // number of measurements to perform after event
`endif `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 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 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 exrst, // master reset that resets PLL and GTX
input reliable_clk, // use aclk that runs independently of the GTX input reliable_clk, // use aclk that runs independently of the GTX
...@@ -114,9 +118,10 @@ module ahci_sata_layers #( ...@@ -114,9 +118,10 @@ module ahci_sata_layers #(
output drp_rdy, output drp_rdy,
output [15:0] drp_do , output [15:0] drp_do ,
`endif `endif
output [FREQ_METER_WIDTH - 1:0] xclk_period, // relative (to 2*clk) xclk period
output [31:0] debug_phy, 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 #( ...@@ -202,11 +207,11 @@ module ahci_sata_layers #(
wire rxelsfull; wire rxelsfull;
wire rxelsempty; 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 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 = {link_established, phy_ready, debug_phy[29:16],debug_link[15:0]}; //
// assign debug_sata = debug_link[31:0]; // // assign debug_sata = debug_link[31:0]; //
/// assign debug_sata = debug_phy; /// assign debug_sata = debug_phy;
...@@ -248,6 +253,24 @@ module ahci_sata_layers #( ...@@ -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_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 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 // .comreset_send (comreset_send), // input
// .cominit_got (cominit_got), // output wire // .cominit_got (cominit_got), // output wire
// .comwake_got (serr_DW), // output wire // .comwake_got (serr_DW), // output wire
...@@ -338,43 +361,46 @@ module ahci_sata_layers #( ...@@ -338,43 +361,46 @@ module ahci_sata_layers #(
.DATASCOPE_START_BIT (DATASCOPE_START_BIT), .DATASCOPE_START_BIT (DATASCOPE_START_BIT),
.DATASCOPE_POST_MEAS (DATASCOPE_POST_MEAS), .DATASCOPE_POST_MEAS (DATASCOPE_POST_MEAS),
`endif `endif
.DATA_BYTE_WIDTH(4) .DATA_BYTE_WIDTH (DATA_BYTE_WIDTH),
.ELASTIC_DEPTH (ELASTIC_DEPTH),
.ELASTIC_OFFSET (ELASTIC_OFFSET)
) phy ( ) phy (
.extrst (exrst), // input wire .extrst (exrst), // input wire
.clk (clk), // output wire .clk (clk), // output wire
.rst (rst), // output wire .rst (rst), // output wire
.reliable_clk (reliable_clk), // input wire .reliable_clk (reliable_clk), // input wire
.phy_ready (phy_ready), // output wire .phy_ready (phy_ready), // output wire
.gtx_ready (gtx_ready), // output wire .gtx_ready (gtx_ready), // output wire
.debug_cnt (), // output[11:0] wire .debug_cnt (), // output[11:0] wire
.extclk_p (extclk_p), // input wire .extclk_p (extclk_p), // input wire
.extclk_n (extclk_n), // input wire .extclk_n (extclk_n), // input wire
.txp_out (txp_out), // output wire .txp_out (txp_out), // output wire
.txn_out (txn_out), // output wire .txn_out (txn_out), // output wire
.rxp_in (rxp_in), // input wire .rxp_in (rxp_in), // input wire
.rxn_in (rxn_in), // input wire .rxn_in (rxn_in), // input wire
.ll_data_out (ph2ll_data_out), // output[31:0] wire .ll_data_out (ph2ll_data_out), // output[31:0] wire
.ll_charisk_out (ph2ll_charisk_out), // output[3:0] wire .ll_charisk_out (ph2ll_charisk_out), // output[3:0] wire
.ll_err_out (ph2ll_err_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_data_in (ll2ph_data_in), // input[31:0] wire
.ll_charisk_in (ll2ph_charisk_in), // input[3:0] wire .ll_charisk_in (ll2ph_charisk_in), // input[3:0] wire
.set_offline (set_offline), // input .set_offline (set_offline), // input
.comreset_send (comreset_send), // input .comreset_send (comreset_send), // input
.cominit_got (cominit_got), // output wire .cominit_got (cominit_got), // output wire
.comwake_got (serr_DW), // output wire .comwake_got (serr_DW), // output wire
.rxelsfull (rxelsfull), // output wire .rxelsfull (rxelsfull), // output wire
.rxelsempty (rxelsempty), // output wire .rxelsempty (rxelsempty), // output wire
.cplllock_debug (), .cplllock_debug (),
.usrpll_locked_debug(), .usrpll_locked_debug (),
.re_aligned (serr_DS), // output reg .re_aligned (serr_DS), // output reg
.xclk (xclk), // output receive clock, just to measure frequency
`ifdef USE_DATASCOPE `ifdef USE_DATASCOPE
.datascope_clk (datascope_clk), // output .datascope_clk (datascope_clk), // output
.datascope_waddr (datascope_waddr), // output[9:0] .datascope_waddr (datascope_waddr), // output[9:0]
.datascope_we (datascope_we), // output .datascope_we (datascope_we), // output
.datascope_di (datascope_di), // output[31:0] .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 `endif
`ifdef USE_DRP `ifdef USE_DRP
...@@ -387,7 +413,7 @@ module ahci_sata_layers #( ...@@ -387,7 +413,7 @@ module ahci_sata_layers #(
.drp_rdy (drp_rdy), // output .drp_rdy (drp_rdy), // output
.drp_do (drp_do), // output[15:0] .drp_do (drp_do), // output[15:0]
`endif `endif
.debug_sata (debug_phy) .debug_sata (debug_phy0)
,.debug_detected_alignp(debug_detected_alignp) ,.debug_detected_alignp(debug_detected_alignp)
); );
...@@ -459,5 +485,15 @@ module ahci_sata_layers #( ...@@ -459,5 +485,15 @@ module ahci_sata_layers #(
.data_in ({d2h_type_in, ll_d2h_mask_out, ll_d2h_data_out}) // input[35:0] .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 endmodule
...@@ -27,7 +27,9 @@ module ahci_top#( ...@@ -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 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 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 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 aclk, // clock - should be buffered
input arst, // @aclk sync reset, active high input arst, // @aclk sync reset, active high
...@@ -200,7 +202,7 @@ module ahci_top#( ...@@ -200,7 +202,7 @@ module ahci_top#(
input drp_rdy, input drp_rdy,
input [15:0] drp_do, input [15:0] drp_do,
`endif `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_phy,
input [31:0] debug_in_link input [31:0] debug_in_link
...@@ -379,7 +381,7 @@ module ahci_top#( ...@@ -379,7 +381,7 @@ module ahci_top#(
wire fsnd_clearCmdToIssue; // From CFIS:SUCCESS wire fsnd_clearCmdToIssue; // From CFIS:SUCCESS
// State variables fsm <- ahc_fis_transmit // State variables fsm <- ahc_fis_transmit
wire fsnd_pCmdToIssue; // AHCI port variable 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_c; // Clear busy upon R_OK for this FIS
wire fsnd_ch_b; // Built-in self test command wire fsnd_ch_b; // Built-in self test command
wire fsnd_ch_r; // reset - may need to send SYNC escape before this command wire fsnd_ch_r; // reset - may need to send SYNC escape before this command
...@@ -649,7 +651,7 @@ module ahci_top#( ...@@ -649,7 +651,7 @@ module ahci_top#(
/// .xmit_busy (fsnd_busy), // input /// .xmit_busy (fsnd_busy), // input
.clearCmdToIssue (fsnd_clearCmdToIssue),// output // From CFIS:SUCCESS .clearCmdToIssue (fsnd_clearCmdToIssue),// output // From CFIS:SUCCESS
.pCmdToIssue (fsnd_pCmdToIssue), // input .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_prdtl (prdtl), // input[15:0]
.ch_c (fsnd_ch_c), // input .ch_c (fsnd_ch_c), // input
.ch_b (fsnd_ch_b), // input .ch_b (fsnd_ch_b), // input
...@@ -723,10 +725,18 @@ module ahci_top#( ...@@ -723,10 +725,18 @@ module ahci_top#(
.was_hba_rst (was_hba_rst), // output .was_hba_rst (was_hba_rst), // output
.was_port_rst (was_port_rst), // output .was_port_rst (was_port_rst), // output
.debug_in0 (debug_dma), // input[31:0] .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_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 ({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 `ifdef USE_DRP
,.drp_en (drp_en), // output reg ,.drp_en (drp_en), // output reg
...@@ -1083,8 +1093,10 @@ wire [9:0] xmit_dbg_01; ...@@ -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_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_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_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_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_we = |datascope_run;
/* /*
assign datascope_di = datascope_run[0]? {h2d_type, // 2 bits assign datascope_di = datascope_run[0]? {h2d_type, // 2 bits
......
/*******************************************************************************
* 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 1ns/1ps
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
...@@ -46,7 +46,12 @@ ...@@ -46,7 +46,12 @@
`endif `endif
parameter HBA_RESET_BITS = 9, // duration of HBA reset in aclk periods (9: ~10usec) 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_clk,
output wire sata_rst, output wire sata_rst,
...@@ -228,6 +233,8 @@ ...@@ -228,6 +233,8 @@
reg [2:0] nhrst_r; reg [2:0] nhrst_r;
wire hrst = !nhrst_r[2]; wire hrst = !nhrst_r[2];
wire [FREQ_METER_WIDTH-1:0] xclk_period;
`ifdef USE_DATASCOPE `ifdef USE_DATASCOPE
// Datascope interface (write to memory that can be software-read) // Datascope interface (write to memory that can be software-read)
wire datascope_clk; wire datascope_clk;
...@@ -261,7 +268,8 @@ ...@@ -261,7 +268,8 @@
// .READ_CT_LATENCY (READ_CT_LATENCY), // .READ_CT_LATENCY (READ_CT_LATENCY),
.ADDRESS_BITS (ADDRESS_BITS), .ADDRESS_BITS (ADDRESS_BITS),
.HBA_RESET_BITS (HBA_RESET_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 ( ) ahci_top_i (
.aclk (ACLK), // input .aclk (ACLK), // input
.arst (arst), // input .arst (arst), // input
...@@ -403,7 +411,8 @@ ...@@ -403,7 +411,8 @@
.drp_di (drp_di), // output[15:0] reg .drp_di (drp_di), // output[15:0] reg
.drp_rdy (drp_rdy), // input .drp_rdy (drp_rdy), // input
.drp_do (drp_do), // input[15:0] .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_phy (debug_phy), // input[31:0]
.debug_in_link (debug_link) // input[31:0] .debug_in_link (debug_link) // input[31:0]
); );
...@@ -414,8 +423,11 @@ ...@@ -414,8 +423,11 @@
.DATASCOPE_START_BIT (DATASCOPE_START_BIT), // bit of DRP "other_control" to start recording after 0->1 (needs DRP) .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 .DATASCOPE_POST_MEAS (DATASCOPE_POST_MEAS), // number of measurements to perform after event
`endif `endif
.BITS_TO_START_XMIT (6), .BITS_TO_START_XMIT (BITS_TO_START_XMIT),
.DATA_BYTE_WIDTH(4) .DATA_BYTE_WIDTH (DATA_BYTE_WIDTH),
.ELASTIC_DEPTH (ELASTIC_DEPTH),
.ELASTIC_OFFSET (ELASTIC_OFFSET),
.FREQ_METER_WIDTH (FREQ_METER_WIDTH)
) ahci_sata_layers_i ( ) ahci_sata_layers_i (
.exrst (exrst), // input .exrst (exrst), // input
.reliable_clk (reliable_clk), // input .reliable_clk (reliable_clk), // input
...@@ -485,8 +497,10 @@ ...@@ -485,8 +497,10 @@
.drp_rdy (drp_rdy), // output .drp_rdy (drp_rdy), // output
.drp_do (drp_do), // output[15:0] .drp_do (drp_do), // output[15:0]
`endif `endif
.xclk_period (xclk_period), // output[11:0]
.debug_phy (debug_phy), // output[31:0] .debug_phy (debug_phy), // output[31:0]
.debug_link (debug_link) // output[31:0] .debug_link (debug_link) // output[31:0]
,.hclk(hclk)
); );
......
/******************************************************************************* /*******************************************************************************
* Module: action_decoder * Module: action_decoder
* Date:2016-02-07 * Date:2016-02-13
* Author: auto-generated file, see ahci_fsm_sequence.py * Author: auto-generated file, see ahci_fsm_sequence.py
* Description: Decode sequencer code to 1-hot actions * Description: Decode sequencer code to 1-hot actions
*******************************************************************************/ *******************************************************************************/
......
/******************************************************************************* /*******************************************************************************
* Module: condition_mux * Module: condition_mux
* Date:2016-02-07 * Date:2016-02-13
* Author: auto-generated file, see ahci_fsm_sequence.py * Author: auto-generated file, see ahci_fsm_sequence.py
* Description: Select condition * Description: Select condition
*******************************************************************************/ *******************************************************************************/
......
...@@ -240,9 +240,12 @@ sequence = [{LBL:'POR', ADDR: 0x0, ACT: NOP}, ...@@ -240,9 +240,12 @@ sequence = [{LBL:'POR', ADDR: 0x0, ACT: NOP},
{IF: 'X_RDY_COLLISION', GOTO:'P:Idle'}, # 2. x_rdy_collision_pend {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: 'SYNCESC_ERR', GOTO:'ERR:SyncEscapeRecv'}, # 4. dx_err[0] (reset by new command)
{IF: 'FIS_OK', GOTO:'CFIS:Success'}, # 5. fis_ok # {IF: 'FIS_OK', GOTO:'CFIS:Success'}, # 5. fis_ok - wrong, it was for received FISes
{ GOTO:'ERR:Non-Fatal'}, # 6 # { 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 {LBL:'CFIS:Success', ACT: 'CLEAR_CMD_TO_ISSUE'}, # clearCmdToIssue
{IF: 'CTBA_B', GOTO:'BIST:TestOngoing'}, # 1. ch_b {IF: 'CTBA_B', GOTO:'BIST:TestOngoing'}, # 1. ch_b
{IF: 'CTBA_C', GOTO:'CFIS:ClearCI'}, # 2. ch_c {IF: 'CTBA_C', GOTO:'CFIS:ClearCI'}, # 2. ch_c
......
...@@ -58,27 +58,34 @@ reg msb_in_r; // input contains MSB ...@@ -58,27 +58,34 @@ reg msb_in_r; // input contains MSB
reg inc_waddr; reg inc_waddr;
reg [DEPTH_LOG2:0] waddr; reg [DEPTH_LOG2:0] waddr;
wire [DEPTH_LOG2-1:0] waddr_minus = waddr[DEPTH_LOG2-1:0] - 1; wire [DEPTH_LOG2-1:0] waddr_minus = waddr[DEPTH_LOG2-1:0] - 1;
//reg [DEPTH_LOG2:0] raddr;
wire [DEPTH_LOG2:0] raddr_w; wire [DEPTH_LOG2:0] raddr_w;
reg [DEPTH_LOG2:0] raddr_r; reg [DEPTH_LOG2:0] raddr_r;
reg [44:0] fifo_ram [0: FIFO_DEPTH -1]; reg [44:0] fifo_ram [0: FIFO_DEPTH -1];
reg [0:0] prealign_ram[0: FIFO_DEPTH -1]; reg [0:0] prealign_ram[0: FIFO_DEPTH -1];
reg [FIFO_DEPTH-1:0] fill; reg [FIFO_DEPTH-1:0] fill;
wire [FIFO_DEPTH-1:0] fill_out; 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; wire [FIFO_DEPTH-1:0] fill_1;
reg [2:0] aligned_rclk; reg [2:0] aligned_rclk;
reg [1:0] dav_rclk; reg [1:0] dav_rclk; // FIFO has more than level
wire skip_rclk; reg [1:0] dav_rclk_more; // FIFO has more than (level + 1)
wire add_rclk; reg [1:0] dav_rclk_less; // FIFO has more than (level - 1)
//wire [44:0] rdata = fifo_ram[raddr[DEPTH_LOG2-1:0]]; 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; reg [44:0] rdata_r;
//wire align_out = rdata[44];
wire align_out = rdata_r[44]; wire align_out = rdata_r[44];
//wire pre_align_out = prealign_ram[raddr[DEPTH_LOG2-1:0]];
reg pre_align_out_r; reg pre_align_out_r;
reg align_out_r; // reg align_out_r;
reg [2:0] correct_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_0; // full at waddr = waddr
reg [1:0] full_1; // full at waddr = raddr+1 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) && ...@@ -89,18 +96,27 @@ wire is_alignp_w = ({data_in, data_in_r} == ALIGN_PRIM) &&
({charisk_in, charisk_in_r} == 4'h1) && ({charisk_in, charisk_in_r} == 4'h1) &&
({notintable_in, notintable_in_r} == 0) && ({notintable_in, notintable_in_r} == 0) &&
({disperror_in, disperror_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; genvar ii;
generate generate
for (ii = 0; ii < FIFO_DEPTH; ii = ii + 1) for (ii = 0; ii < FIFO_DEPTH; ii = ii + 1)
begin: gen_fill_out begin: gen_fill_out
assign fill_out[ii] = fill[(ii + CORR_OFFSET) & (FIFO_DEPTH-1)] ^ ((ii + CORR_OFFSET)>=FIFO_DEPTH); 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_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 end
endgenerate endgenerate
...@@ -133,16 +149,14 @@ always @(posedge wclk) begin ...@@ -133,16 +149,14 @@ always @(posedge wclk) begin
if (!aligned32_in_r) fill <= 0; if (!aligned32_in_r) fill <= 0;
else if (msb_in_r) fill <={fill[FIFO_DEPTH-2:0],~waddr[DEPTH_LOG2]}; else if (msb_in_r) fill <={fill[FIFO_DEPTH-2:0],~waddr[DEPTH_LOG2]};
end end
// FIFO read clock domain - system synchronous, 75MHz for SATA2 // FIFO read clock domain - system synchronous, 75MHz for SATA2
localparam [DEPTH_LOG2:0] SIZED0 = 0; localparam [DEPTH_LOG2:0] SIZED0 = 0;
localparam [DEPTH_LOG2:0] SIZED1 = 1; localparam [DEPTH_LOG2:0] SIZED1 = 1;
localparam [DEPTH_LOG2:0] SIZED2 = 2; localparam [DEPTH_LOG2:0] SIZED2 = 2;
// assign raddr_w = aligned_rclk[1]? ( raddr_r + (add_rclk? 0 : (skip_rclk ? 2 : 1))) : 0; localparam [DEPTH_LOG2:0] SIZED3 = 3;
assign raddr_w = aligned_rclk[1]? ( raddr_r + (add_rclk? SIZED0 : (skip_rclk ? SIZED2 : SIZED1))) : SIZED0; 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 always @(posedge rclk) begin
...@@ -156,35 +170,46 @@ 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]}; else aligned_rclk <= {aligned_rclk[1:0],fill[OFFSET-2] | aligned_rclk[0]};
if (!aligned32_in_r) dav_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]}; 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; 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]}; else full_0 <= {full_0[0], fill[raddr_r[DEPTH_LOG2-1:0]] ^ raddr_r[DEPTH_LOG2]};
if (!aligned32_in_r) full_1 <= 1; 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]}; 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]; disperror_out <= rdata_r[43:40];
notintable_out <= rdata_r[39:36]; notintable_out <= rdata_r[39:36];
charisk_out <= rdata_r[35:32]; charisk_out <= rdata_r[35:32];
data_out <= rdata_r[31: 0]; data_out <= rdata_r[31: 0];
align_out_r <= align_out; // align_out_r <= align_out;
if (correct || !aligned_rclk) correct_r <= ~0; if (correct || !aligned_rclk) correct_r <= ~0;
else correct_r <= correct_r << 1; 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 end
assign skip_rclk = correct && dav_rclk[1]; //assign skip_rclk = correct && dav_rclk[1];
assign add_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 isaligned_out = aligned_rclk[2];
assign full = aligned_rclk && full_1[1] && !full_0[1]; assign full = aligned_rclk && full_1[1] && !full_0[1];
assign empty = aligned_rclk && !full_1[1] && full_0[1]; assign empty = aligned_rclk && !full_1[1] && full_0[1];
......
...@@ -139,6 +139,7 @@ always @ (posedge clk) ...@@ -139,6 +139,7 @@ always @ (posedge clk)
else begin else begin
// got xxxx or 0000, both cases tell us addresses were bad // 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]); $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; $finish;
end end
`endif // CHECKERS_ENABLED `endif // CHECKERS_ENABLED
......
...@@ -51,8 +51,8 @@ module gtx_wrap #( ...@@ -51,8 +51,8 @@ module gtx_wrap #(
parameter RXDFELPMRESET_TIME = 7'hf, parameter RXDFELPMRESET_TIME = 7'hf,
parameter RXISCANRESET_TIME = 5'h1, parameter RXISCANRESET_TIME = 5'h1,
parameter ELASTIC_DEPTH = 4, //5, parameter ELASTIC_DEPTH = 4, //5, With 4/7 got infrequent overflows!
parameter ELASTIC_OFFSET = 7 // 5 //10 parameter ELASTIC_OFFSET = 7 // 5 //10
) )
( (
output reg debug = 0, output reg debug = 0,
...@@ -104,7 +104,10 @@ module gtx_wrap #( ...@@ -104,7 +104,10 @@ module gtx_wrap #(
output wire dbg_rxcdrlock, output wire dbg_rxcdrlock,
output wire dbg_rxdlysresetdone, 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 `ifdef USE_DATASCOPE
// Datascope interface (write to memory that can be software-read) // Datascope interface (write to memory that can be software-read)
,output datascope_clk, ,output datascope_clk,
...@@ -385,7 +388,7 @@ gtx_8x10enc gtx_8x10enc( ...@@ -385,7 +388,7 @@ gtx_8x10enc gtx_8x10enc(
* RX PCS part: comma detect + align module, 10/8 decoder, elastic buffer, interface resynchronisation * 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 * 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 // assuming GTX interface width = 20 bits
// comma aligner // comma aligner
wire [19:0] rxdata_comma_out; wire [19:0] rxdata_comma_out;
......
...@@ -174,14 +174,31 @@ end ...@@ -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 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; /// 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 || if (rst ||
(data_last_in && data_strobe_out) || (data_last_in && data_strobe_out) ||
(dword_val && rcvd_dword[CODE_DMATP])) data_txing <= 0; (dword_val && rcvd_dword[CODE_DMATP])) data_txing <= 0;
else if (frame_req) data_txing <= 1; 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 // fsm
// states and transitions are taken from the doc, "Link Layer State Machine" chapter // 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 // power mode states are not implemented. TODO insert them as an additional branch of fsm
...@@ -215,6 +232,13 @@ reg state_rcvr_goodcrc; // GoodCRC ...@@ -215,6 +232,13 @@ reg state_rcvr_goodcrc; // GoodCRC
reg state_rcvr_goodend; // GoodEnd reg state_rcvr_goodend; // GoodEnd
reg state_rcvr_badend; // BadEnd 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_sync_esc;
wire set_nocommerr; wire set_nocommerr;
wire set_nocomm; wire set_nocomm;
...@@ -286,7 +310,7 @@ assign state_idle = ~state_sync_esc ...@@ -286,7 +310,7 @@ assign state_idle = ~state_sync_esc
// got an escaping primitive = request to cancel the transmission // got an escaping primitive = request to cancel the transmission
wire got_escape; wire got_escape;
assign got_escape = dword_val & rcvd_dword[CODE_SYNCP]; assign got_escape = dword_val & rcvd_dword[CODE_SYNCP];
// escaping is done // escaping is done
assign sync_escape_ack = state_sync_esc; assign sync_escape_ack = state_sync_esc;
...@@ -323,6 +347,14 @@ assign alignes_pair = phy_ready && (alignes_pair_0 | alignes_pair_1); ...@@ -323,6 +347,14 @@ assign alignes_pair = phy_ready && (alignes_pair_0 | alignes_pair_1);
always @ (posedge clk) begin always @ (posedge clk) begin
link_bad_crc <= state_rcvr_eof & crc_bad; 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 end
// Whole transitions table, literally from doc pages 311-328 // 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 ...@@ -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_rhold & dword_val & rcvd_dword[CODE_EOFP]
| state_rcvr_shold & 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_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] assign set_rcvr_badend = state_rcvr_data & dword_val & rcvd_dword[CODE_WTRMP]
| state_rcvr_eof & crc_bad | 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_sync_esc = set_nocommerr | set_reset | dword_val & (rcvd_dword[CODE_RRDYP] | rcvd_dword[CODE_SYNCP]);
assign clr_nocommerr = set_reset | set_nocomm; assign clr_nocommerr = set_reset | set_nocomm;
...@@ -379,7 +411,8 @@ assign clr_send_rhold = set_nocommerr | set_reset | set_sync_esc | set_sen ...@@ -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_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_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_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_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_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_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 ...@@ -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_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_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_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_goodend = set_nocommerr | set_reset | set_sync_esc | got_escape;
assign clr_rcvr_badend = 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 ...@@ -409,6 +451,38 @@ begin
state_send_crc <= (state_send_crc | set_send_crc & ~alignes_pair) & ~(clr_send_crc & ~alignes_pair) & ~rst; 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_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; 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_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_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; state_rcvr_data <= (state_rcvr_data | set_rcvr_data & ~alignes_pair) & ~(clr_rcvr_data & ~alignes_pair) & ~rst;
...@@ -418,12 +492,19 @@ begin ...@@ -418,12 +492,19 @@ begin
state_rcvr_goodcrc <= (state_rcvr_goodcrc | set_rcvr_goodcrc & ~alignes_pair) & ~(clr_rcvr_goodcrc & ~alignes_pair) & ~rst; 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_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; state_rcvr_badend <= (state_rcvr_badend | set_rcvr_badend & ~alignes_pair) & ~(clr_rcvr_badend & ~alignes_pair) & ~rst;
*/
end end
// flag if incoming request to terminate current transaction came from TL // flag if incoming request to terminate current transaction came from TL
reg incom_stop_f; reg incom_stop_f;
always @ (posedge clk) 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 // form data to phy
reg [DATA_BYTE_WIDTH*8 - 1:0] to_phy_data; reg [DATA_BYTE_WIDTH*8 - 1:0] to_phy_data;
...@@ -618,24 +699,51 @@ assign data_last_out = set_rcvr_eof; ...@@ -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. // gives a strobe everytime data is present and we're at a corresponding state.
assign data_strobe_out = select_prim[CODE_DATA]; 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 outputs
assign phy_data_out = to_phy_data; assign phy_data_out = to_phy_data;
assign phy_isk_out = to_phy_isk; assign phy_isk_out = to_phy_isk;
assign frame_busy = ~state_idle; assign frame_busy = ~state_idle;
assign frame_ack = state_send_sof; 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 // incoming fises detected
assign incom_start = set_rcvr_wait & ~alignes_pair; assign incom_start_w = set_rcvr_wait; // & ~alignes_pair;
// ... and processed // ... and processed
assign incom_done = set_rcvr_goodcrc & ~alignes_pair; assign incom_done_w = set_rcvr_goodcrc; // & ~alignes_pair;
// or the FIS had errors // or the FIS had errors
//assign incom_invalidate = state_rcvr_eof & crc_bad & ~alignes_pair | state_rcvr_data & dword_val & rcvd_dword[CODE_WTRMP] //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; // | (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 // 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_invalidate = (state_rcvr_eof & crc_bad & ~alignes_pair) | // CRC mismatch
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; // (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 // 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]; 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 ...@@ -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) // 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_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_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_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_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) 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); && (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 // phy level errors handling TODO
...@@ -899,8 +1014,18 @@ reg state_rcvr_badend; // BadEnd ...@@ -899,8 +1014,18 @@ reg state_rcvr_badend; // BadEnd
///assign debug_out = debug_unknown_dword; // first unknown dword ///assign debug_out = debug_unknown_dword; // first unknown dword
assign debug_out[ 4: 0] = debug_states_encoded; 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[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; //assign debug_out[STATES_COUNT - 1:0] = debug_states_visited;
......
...@@ -39,7 +39,9 @@ module sata_phy #( ...@@ -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_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 parameter DATASCOPE_POST_MEAS = 16, // number of measurements to perform after event
`endif `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. // initial reset, resets PLL. After pll is locked, an internal sata reset is generated.
...@@ -88,6 +90,7 @@ module sata_phy #( ...@@ -88,6 +90,7 @@ module sata_phy #(
output cplllock_debug, output cplllock_debug,
output usrpll_locked_debug, output usrpll_locked_debug,
output re_aligned, // re-aligned after alignment loss output re_aligned, // re-aligned after alignment loss
output xclk, // just to measure frequency to set the local clock
`ifdef USE_DATASCOPE `ifdef USE_DATASCOPE
// Datascope interface (write to memory that can be software-read) // Datascope interface (write to memory that can be software-read)
...@@ -488,7 +491,10 @@ gtx_wrap #( ...@@ -488,7 +491,10 @@ gtx_wrap #(
.RXCDRPHRESET_TIME (RXCDRPHRESET_TIME), .RXCDRPHRESET_TIME (RXCDRPHRESET_TIME),
.RXCDRFREQRESET_TIME (RXCDRFREQRESET_TIME), .RXCDRFREQRESET_TIME (RXCDRFREQRESET_TIME),
.RXDFELPMRESET_TIME (RXDFELPMRESET_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 gtx_wrap
( (
...@@ -537,7 +543,8 @@ gtx_wrap ...@@ -537,7 +543,8 @@ gtx_wrap
.dbg_rx_clocks_aligned(dbg_rx_clocks_aligned), .dbg_rx_clocks_aligned(dbg_rx_clocks_aligned),
.dbg_rxcdrlock (dbg_rxcdrlock) , .dbg_rxcdrlock (dbg_rxcdrlock) ,
.dbg_rxdlysresetdone(dbg_rxdlysresetdone), .dbg_rxdlysresetdone(dbg_rxdlysresetdone),
.txbufstatus (txbufstatus[1:0]) .txbufstatus (txbufstatus[1:0]),
.xclk (xclk) // output receive clock, just to measure frequency
`ifdef USE_DATASCOPE `ifdef USE_DATASCOPE
,.datascope_clk (datascope_clk), // output ,.datascope_clk (datascope_clk), // output
.datascope_waddr (datascope_waddr), // output[9:0] .datascope_waddr (datascope_waddr), // output[9:0]
...@@ -671,9 +678,9 @@ assign debug_sata[23:20] = debug_cntr4; ...@@ -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}; //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 `ifdef USE_DATASCOPE
assign debug_sata = {txbufstatus[1:0], rxelecidle, dbg_rxcdrlock, rxelsfull, rxelsempty, dbg_rxphaligndone, dbg_rx_clocks_aligned, 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, 2'b0,
datascope_waddr}; datascope_waddr[9:0]};
`else `else
assign debug_sata = {8'b0, dbg_clk_align_cntr, txbufstatus[1:0], rxelecidle, dbg_rxcdrlock, rxelsfull, rxelsempty, dbg_rxphaligndone, dbg_rx_clocks_aligned}; assign debug_sata = {8'b0, dbg_clk_align_cntr, txbufstatus[1:0], rxelecidle, dbg_rxcdrlock, rxelsfull, rxelsempty, dbg_rxphaligndone, dbg_rx_clocks_aligned};
`endif `endif
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
, .INIT_03 (256'h845284BE44374C682C4214190012003900880018000A02080022001901020090) , .INIT_03 (256'h845284BE44374C682C4214190012003900880018000A02080022001901020090)
, .INIT_04 (256'h00190110003901100019144601020030020202040039B07D707A041000398C6B) , .INIT_04 (256'h00190110003901100019144601020030020202040039B07D707A041000398C6B)
, .INIT_05 (256'h64540C2504580000004E24FB250200C0004C24FB250200C0005C000000390000) , .INIT_05 (256'h64540C2504580000004E24FB250200C0004C24FB250200C0005C000000390000)
, .INIT_06 (256'hA47150F8903900A00104006B0202005000E2A89368F018E918CB98A758D73882) , .INIT_06 (256'hD10250F8903900A00104006B0202005000E2A89368F018E918CB98A758D73882)
, .INIT_07 (256'h0060003900000039B07D00000050004400220039B07D707A307730F001080102) , .INIT_07 (256'h0060003900000039B07D00000050004400220039B07D707A307730F001080071)
, .INIT_08 (256'h00050091C88F002200240091288B28FE000C0110008624FB25020240009CD0FB) , .INIT_08 (256'h00050091C88F002200240091288B28FE000C0110008624FB25020240009CD0FB)
, .INIT_09 (256'h48A528A128FE00140039487F0CAD28FE0110009724FB25020140005004020091) , .INIT_09 (256'h48A528A128FE00140039487F0CAD28FE0110009724FB25020140005004020091)
, .INIT_0A (256'h8839089C040800AD011000AB24FB250200C000500081005048A5002200240039) , .INIT_0A (256'h8839089C040800AD011000AB24FB250200C000500081005048A5002200240039)
......
...@@ -534,11 +534,15 @@ class x393sata(object): ...@@ -534,11 +534,15 @@ class x393sata(object):
break break
sleep(0.1) sleep(0.1)
else: else:
print ("Failed to get interrupt") print ("\n ====================== Failed to get interrupt ============================")
self.reg_status() self.reg_status()
print("_=mem.mem_dump (0x%x, 0x4,4)"%(MAXI1_ADDR + DBG_OFFS)) 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") raise Exception("Failed to get interrupt")
print("Datascope (debug) data:") print("Datascope (debug) data:")
print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR)) print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR))
self.x393_mem.mem_dump (DATASCOPE_ADDR, 0x20,4) self.x393_mem.mem_dump (DATASCOPE_ADDR, 0x20,4)
...@@ -616,14 +620,28 @@ class x393sata(object): ...@@ -616,14 +620,28 @@ class x393sata(object):
self.parse_register(group_range = ['HBA_PORT__PxIS'], self.parse_register(group_range = ['HBA_PORT__PxIS'],
skip0 = True, skip0 = True,
dword = None) 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 break
sleep(0.1) sleep(0.1)
else: else:
print ("Failed to get interrupt") print ("\n ====================== Failed to get interrupt ============================")
self.reg_status() self.reg_status()
print("_=mem.mem_dump (0x%x, 0x4,4)"%(MAXI1_ADDR + DBG_OFFS)) 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") raise Exception("Failed to get interrupt")
print("Datascope (debug) data:") print("Datascope (debug) data:")
print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR)) print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR))
self.x393_mem.mem_dump (DATASCOPE_ADDR, 0xa0,4) self.x393_mem.mem_dump (DATASCOPE_ADDR, 0xa0,4)
...@@ -705,12 +723,15 @@ class x393sata(object): ...@@ -705,12 +723,15 @@ class x393sata(object):
break break
sleep(0.1) sleep(0.1)
else: else:
print ("Failed to get interrupt") print ("\n ====================== Failed to get interrupt ============================")
self.reg_status() self.reg_status()
print("_=mem.mem_dump (0x%x, 0x4,4)"%(MAXI1_ADDR + DBG_OFFS)) 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") raise Exception("Failed to get interrupt")
print("Datascope (debug) data:") print("Datascope (debug) data:")
print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR)) print("_=mem.mem_dump (0x%x, 0x20,4)"%(DATASCOPE_ADDR))
self.x393_mem.mem_dump (DATASCOPE_ADDR, 0x20,4) self.x393_mem.mem_dump (DATASCOPE_ADDR, 0x20,4)
...@@ -1062,6 +1083,15 @@ sata.reg_status(),sata.reset_ie(),sata.err_count() ...@@ -1062,6 +1083,15 @@ sata.reg_status(),sata.reset_ie(),sata.err_count()
'0x3' '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): for block in range (1,255):
sata.dd_read_dma(block, 1) sata.dd_read_dma(block, 1)
...@@ -1075,6 +1105,12 @@ for block in range (1,255): ...@@ -1075,6 +1105,12 @@ for block in range (1,255):
_=mem.mem_dump (0x80001000, 0x100,4) _=mem.mem_dump (0x80001000, 0x100,4)
sata.reg_status(),sata.reset_ie(),sata.err_count() 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) #sata.drp (0x20b,0x81), sata.drp (0x20b,0x4081)
......
[*] [*]
[*] GTKWave Analyzer v3.3.66 (w)1999-2015 BSI [*] GTKWave Analyzer v3.3.66 (w)1999-2015 BSI
[*] Sat Feb 13 07:29:00 2016 [*] Sun Feb 14 23:58:57 2016
[*] [*]
[dumpfile] "/home/andrey/git/x393_sata/simulation/tb_ahci-20160211141748402.fst" [dumpfile] "/home/andrey/git/x393_sata/simulation/tb_ahci-20160214134023147.fst"
[dumpfile_mtime] "Thu Feb 11 21:19:18 2016" [dumpfile_mtime] "Sun Feb 14 20:41:46 2016"
[dumpfile_size] 10518459 [dumpfile_size] 10591039
[savefile] "/home/andrey/git/x393_sata/tb_ahci_01.sav" [savefile] "/home/andrey/git/x393_sata/tb_ahci_01.sav"
[timestart] 51557500 [timestart] 14876900
[size] 1823 1180 [size] 1823 1180
[pos] 0 0 [pos] 2026 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 *-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.
[treeopen] tb_ahci.axi_read_addr. [treeopen] tb_ahci.axi_read_addr.
[treeopen] tb_ahci.dev.linkMonitorFIS. [treeopen] tb_ahci.dev.linkMonitorFIS.
...@@ -60,15 +60,659 @@ ...@@ -60,15 +60,659 @@
[treeopen] tb_ahci.simul_axi_hp_wr_i.wdata_i. [treeopen] tb_ahci.simul_axi_hp_wr_i.wdata_i.
[treeopen] tb_ahci.simul_axi_read_i. [treeopen] tb_ahci.simul_axi_read_i.
[sst_width] 296 [sst_width] 296
[signals_width] 313 [signals_width] 252
[sst_expanded] 1 [sst_expanded] 1
[sst_vpaned_height] 573 [sst_vpaned_height] 573
@820 @820
tb_ahci.TESTBENCH_TITLE[639:0] 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.dut.sata_top.ahci_sata_layers_i.phy.oob_ctrl.oob.HOST_OOB_TITLE[639:0]
tb_ahci.DEVICE_TITLE[639:0] tb_ahci.DEVICE_TITLE[639:0]
@c00820
tb_ahci.dev.DEV_TITLE[639:0] tb_ahci.dev.DEV_TITLE[639:0]
@28 @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.CLK
tb_ahci.RST tb_ahci.RST
tb_ahci.AR_SET_CMD_r 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] ...@@ -133,20 +777,8 @@ tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_addr[9:0]
@28 @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.aclk
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.axibram_read_i.dev_ready tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.axibram_read_i.dev_ready
@c00022 @c00200
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr[10:0] -tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.bram_raddr
@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]
@1401200 @1401200
-group_end -group_end
@800028 @800028
...@@ -965,7 +1597,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_g ...@@ -965,7 +1597,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_g
-drp -drp
@1401200 @1401200
-axi_ahci_regs -axi_ahci_regs
@c00201 @c00200
-ahci_fsm -ahci_fsm
@28 @28
tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.dma_abort_done 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] ...@@ -1232,9 +1864,9 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_pend_r[1:0]
@28 @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_ackn
tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_from_st tb_ahci.dut.sata_top.ahci_top_i.ahci_fsm_i.async_from_st
@1401201 @1401200
-ahci_fsm -ahci_fsm
@c00200 @800200
-ahci_fis_receive -ahci_fis_receive
@22 @22
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.hba_data_in[31:0] 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 ...@@ -1284,12 +1916,14 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.is_data_fis
@22 @22
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.reg_ps[4:0] tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.reg_ps[4:0]
@28 @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.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.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.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.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.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 @800028
tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_end_r[1:0] tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_end_r[1:0]
@28 @28
...@@ -1330,7 +1964,7 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_dcount[3:0] ...@@ -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] (3)tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_receive_i.fis_dcount[3:0]
@1001200 @1001200
-group_end -group_end
@1401200 @1000200
-ahci_fis_receive -ahci_fis_receive
@c00200 @c00200
-ahci_fis_transmit -ahci_fis_transmit
...@@ -2794,8 +3428,19 @@ tb_ahci.simul_axi_hp_rd_i.rdata_i.out_full ...@@ -2794,8 +3428,19 @@ tb_ahci.simul_axi_hp_rd_i.rdata_i.out_full
- -
@1401200 @1401200
-ahci_dma -ahci_dma
@c00200 @800200
-link -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 @c00022
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.debug_out[31:0] tb_ahci.dut.sata_top.ahci_sata_layers_i.link.debug_out[31:0]
@28 @28
...@@ -2879,9 +3524,14 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.select_prim[15:0] ...@@ -2879,9 +3524,14 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.select_prim[15:0]
@1401200 @1401200
-group_end -group_end
-group_end -group_end
@22
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.crc_dword[31:0]
@200 @200
- -
@28 @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.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.set_send_data
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.rst 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 ...@@ -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.incom_done
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.crc_good 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.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 @800200
-states -states
@28 @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_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_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_nocomm
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_rcvr_data tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_align
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_reset 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 [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_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_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_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_send_crc
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_sync_esc tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_send_eof
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.state_wait 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 @1000200
-states -states
@28 @28
...@@ -3173,10 +3854,19 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.link.alignes_pair ...@@ -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_req
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_ack tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_ack
tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_busy tb_ahci.dut.sata_top.ahci_sata_layers_i.link.frame_busy
@1401200 @1000200
-link -link
@c00200 @800200
-phy -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 @22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.txdata[31:0] tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.txdata[31:0]
@28 @28
...@@ -3333,8 +4023,9 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_g ...@@ -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] tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtxe2_channel_wrapper.gtx_gpl.channel.rx.dataiface.wordcounter[31:0]
@1401200 @1401200
-GTXE2_GPL -GTXE2_GPL
@1000200
-phy -phy
@c00200 @800200
-comma -comma
@22 @22
tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_comma_align.indata[19:0] 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 ...@@ -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 tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.gtx_comma_align.comma_detected
@200 @200
- -
@1401200 @1000200
-comma -comma
@c00200 @c00200
-elastic_slow -elastic_slow
...@@ -3354,14 +4045,12 @@ tb_ahci.elastic1632_slow_i.rclk ...@@ -3354,14 +4045,12 @@ tb_ahci.elastic1632_slow_i.rclk
[color] 3 [color] 3
tb_ahci.elastic1632_fast_i.rclk tb_ahci.elastic1632_fast_i.rclk
tb_ahci.elastic1632_slow_i.is_alignp_w 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.charisk_in[1:0]
tb_ahci.elastic1632_slow_i.isaligned_in tb_ahci.elastic1632_slow_i.isaligned_in
tb_ahci.elastic1632_slow_i.aligned32_in_r tb_ahci.elastic1632_slow_i.aligned32_in_r
@22 @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.data_out[31:0]
tb_ahci.elastic1632_slow_i.charisk_out[3:0] tb_ahci.elastic1632_slow_i.charisk_out[3:0]
@28 @28
...@@ -3433,7 +4122,6 @@ tb_ahci.elastic1632_slow_i.full_0[1:0] ...@@ -3433,7 +4122,6 @@ tb_ahci.elastic1632_slow_i.full_0[1:0]
tb_ahci.elastic1632_slow_i.full_1[1:0] tb_ahci.elastic1632_slow_i.full_1[1:0]
@28 @28
tb_ahci.elastic1632_slow_i.align_out tb_ahci.elastic1632_slow_i.align_out
tb_ahci.elastic1632_slow_i.align_out_r
tb_ahci.elastic1632_slow_i.correct tb_ahci.elastic1632_slow_i.correct
@800028 @800028
tb_ahci.elastic1632_slow_i.correct_r[2:0] tb_ahci.elastic1632_slow_i.correct_r[2:0]
...@@ -3444,8 +4132,8 @@ tb_ahci.elastic1632_slow_i.correct_r[2:0] ...@@ -3444,8 +4132,8 @@ tb_ahci.elastic1632_slow_i.correct_r[2:0]
@1001200 @1001200
-group_end -group_end
@28 @28
tb_ahci.elastic1632_slow_i.add_rclk
tb_ahci.elastic1632_slow_i.skip_rclk tb_ahci.elastic1632_slow_i.skip_rclk
tb_ahci.elastic1632_slow_i.skip_rclk2
@8022 @8022
tb_ahci.elastic1632_slow_i.waddr[4:0] tb_ahci.elastic1632_slow_i.waddr[4:0]
tb_ahci.elastic1632_slow_i.raddr_r[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] ...@@ -3471,6 +4159,8 @@ tb_ahci.elastic1632_fast_i.charisk_in_r[1:0]
@28 @28
tb_ahci.elastic1632_fast_i.isaligned_in tb_ahci.elastic1632_fast_i.isaligned_in
@22 @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.data_out[31:0]
tb_ahci.elastic1632_fast_i.charisk_out[3:0] tb_ahci.elastic1632_fast_i.charisk_out[3:0]
@28 @28
...@@ -3492,10 +4182,16 @@ tb_ahci.elastic1632_fast_i.full_0[1:0] ...@@ -3492,10 +4182,16 @@ tb_ahci.elastic1632_fast_i.full_0[1:0]
tb_ahci.elastic1632_fast_i.full_1[1:0] tb_ahci.elastic1632_fast_i.full_1[1:0]
@28 @28
tb_ahci.elastic1632_fast_i.align_out 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.correct
tb_ahci.elastic1632_fast_i.add_rclk
tb_ahci.elastic1632_fast_i.skip_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 @c00028
tb_ahci.elastic1632_fast_i.correct_r[2:0] tb_ahci.elastic1632_fast_i.correct_r[2:0]
@28 @28
...@@ -3672,8 +4368,18 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.txreset ...@@ -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 tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.rxreset
@1401200 @1401200
-sipo_meas -sipo_meas
@c00200 @800200
-gtx -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 @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_we
tb_ahci.dut.sata_top.ahci_top_i.axi_ahci_regs_i.drp_en 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] ...@@ -3786,6 +4492,7 @@ tb_ahci.dut.sata_top.ahci_sata_layers_i.phy.gtx_wrap.txdata_enc_out[19:0]
- -
@1401200 @1401200
-gtx8x10enc -gtx8x10enc
@1000200
-gtx -gtx
@c00200 @c00200
-device -device
...@@ -3876,6 +4583,11 @@ tb_ahci.dut.sata_top.ahci_top_i.ahci_fis_transmit_i.ct_re_r[2:0] ...@@ -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 tb_ahci.dut.sata_top.ahci_top_i.fsnd_cfis_xmit
@200 @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 @22
tb_ahci.dut.sata_top.ahci_top_i.h2d_data[31:0] tb_ahci.dut.sata_top.ahci_top_i.h2d_data[31:0]
@28 @28
...@@ -3931,5 +4643,26 @@ tb_ahci.dut.sata_top.ahci_top_i.datascope_waddr_r[9:0] ...@@ -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 tb_ahci.dut.sata_top.ahci_top_i.datascope_we
@1401200 @1401200
-datascope -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] 1
[pattern_trace] 0 [pattern_trace] 0
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment