x393  1.0
FPGAcodeforElphelNC393camera
ahci_fis_receive.v
Go to the documentation of this file.
1 
35 `timescale 1ns/1ps
36 
38  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)
39 )(
40  input hba_rst, // @posedge mclk - sync reset
41  input mclk, // for command/status
42  input pcmd_st_cleared, // ~= hba_rst?
43  // Control Interface
44  output reg fis_first_vld, // fis_first contains valid FIS header, reset by get_*
45  // Debug features
46  output fis_first_invalid, // Some data available from FIFO, but not FIS head
47  input fis_first_flush, // Skip FIFO data until empty or FIS head
48  // Receiving FIS
49  input get_dsfis,
50  input get_psfis,
51  input get_rfis,
52  input get_sdbfis,
53  input get_ufis,
54  input get_data_fis,
55  input get_ignore, // ignore whatever FIS (use for DMA activate too?)
56  output get_fis_busy, // busy processing FIS
57  output reg get_fis_done, // done processing FIS (see fis_ok, fis_err, fis_ferr)
58  output reg fis_ok, // FIS done, checksum OK reset by starting a new get FIS
59  output reg fis_err, // FIS done, checksum ERROR reset by starting a new get FIS
60  output fis_ferr, // FIS done, fatal error - FIS too long
61  input dma_prds_done, // dma is done - check if FIS is done (some data may get stuck in dma FIFO - reported separately)
62  output fis_extra, // all wanted data got, FIS may have extra data (non-fatal). Does not deny fis_ok
63  input set_update_sig,// when set, enables update_sig (and resets itself)
64  output pUpdateSig, // state variable
65  output reg sig_available, // device signature a ailable
66  // next commands use register address/data/we for 1 clock cycle - after next to command (commnd - t0, we - t2)
67  input update_sig, // update signature - now after get_rfis, after FIS is already received
68  input update_err_sts,// update PxTFD.STS and PxTFD.ERR from the last received regs d2h
69  input update_pio, // update PxTFD.STS and PxTFD.ERR from pio_* (entry PIO:Update)
70  input update_prdbc, // update PRDBC in registers
71  input clear_prdbc, // save resources - clear prdbc for every command - discard what is written there
72  input clear_bsy_drq, // clear PxTFD.STS.BSY and PxTFD.STS.DRQ, update
73  input clear_bsy_set_drq, // clear PxTFD.STS.BSY and sets PxTFD.STS.DRQ, update
74  input set_bsy, // set PxTFD.STS.BSY, update
75  input set_sts_7f, // set PxTFD.STS = 0x7f, update
76  input set_sts_80, // set PxTFD.STS = 0x80 (may be combined with set_sts_7f), update
77 
78  input clear_xfer_cntr, // clear pXferCntr (is it needed as a separate input)?
79  input decr_dwcr, // decrement DMA Xfer counter after read (in this module) // need pulse to 'update_prdbc' to write to registers
80  input decr_dwcw, // decrement DMA Xfer counter after write (from decr_DXC_dw)// need pulse to 'update_prdbc' to write to registers
81  input [11:0] decr_DXC_dw, // decrement value (in DWORDs)
82 
83  input pcmd_fre, // control bit enables saving FIS to memory (will be ignored for signature)
84 
85  // TODO: Add writing PRDBC here? Yes, the following. B ut data may be discarded as only 0 is supposed to be written
86 // input [ADDRESS_BITS-1:0] soft_write_addr, // register address written by software
87 // input [31:0] soft_write_data, // register data written (after applying wstb and type (RO, RW, RWC, RW1)
88 // input soft_write_en, // write enable for data write
89 
90 
91  output reg pPioXfer, // state variable
92  output [7:0] tfd_sts, // Current PxTFD status field (updated after regFIS and SDB - certain fields)
93  // tfd_sts[7] - BSY, tfd_sts[3] - DRQ, tfd_sts[0] - ERR
94  output [7:0] tfd_err, // Current PxTFD error field (updated after regFIS and SDB)
95  output reg fis_i, // value of "I" field in received regsD2H or SDB FIS or DMA Setup FIS
96  output reg sdb_n, // value of "N" field in received SDB FIS
97  output reg dma_a, // value of "A" field in received DMA Setup FIS
98  output reg dma_d, // value of "D" field in received DMA Setup FIS
99  output reg pio_i, // value of "I" field in received PIO Setup FIS
100  output reg pio_d, // value of "D" field in received PIO Setup FIS
101  output [7:0] pio_es, // value of PIO E_Status
102  output reg sactive0, // bit 0 of sActive DWORD received in SDB FIS
103  // Using even word count (will be rounded up), partial DWORD (last) will be handled by PRD length if needed
104  output [31:2] xfer_cntr, // transfer counter in words for both DMA (31 bit) and PIO (lower 15 bits), updated after decr_dwc
105  output xfer_cntr_zero,// valid next cycle
106  output [11:0] data_in_dwords, // number of data dwords received (valid with 'done')
107  // FSM will send this pulse
108 // output reg data_in_words_apply, // apply data_in_words
109 
110 // Registers interface
111 // 2. HBA R/W registers, may be added external register layer
112  output reg [ADDRESS_BITS-1:0] reg_addr,
113  output reg reg_we,
114  output reg [31:0] reg_data,
115 
116  input [31:0] hba_data_in, // FIFO output data
117  input [ 1:0] hba_data_in_type, // 0 - data, 1 - FIS head, 2 - R_OK, 3 - R_ERR
118  input hba_data_in_valid, // Data available from the transport layer in FIFO
119  input hba_data_in_many, // Multiple DWORDs available from the transport layer in FIFO
120  output hba_data_in_ready, // This module or DMA consumes DWORD
121 
122  // Forwarding data to the DMA engine
123  input dma_in_ready, // DMA engine ready to accept data
124  output dma_in_valid // Write data to DMA dev->memory channel
125 
128  output [1:0] debug_fis_end_r,
129  output [1:0] debug_get_fis_busy_r
130 
131 );
132 //localparam FA_BITS = 6; // number of bits in received FIS address
133 //localparam CLB_OFFS32 = 'h200; // # In the second half of the register space (0x800..0xbff - 1KB)
134 /*
135 HBA_OFFS = 0x0 # All offsets are in bytes
136 CLB_OFFS = 0x800 # In the second half of the register space (0x800..0xbff - 1KB)
137 FB_OFFS = 0xc00 # Needs 0x100 bytes
138 #HBA_PORT0 = 0x100 Not needed, always HBA_OFFS + 0x100
139 
140 */
141 // RO: Device ID
142  localparam PCI_Header__ID__DID__ADDR = 'h60;
143  localparam PCI_Header__ID__DID__MASK = 'hffff0000;
144  localparam PCI_Header__ID__DID__DFLT = 'h10000;
145 // RO: Vendor ID
146  localparam PCI_Header__ID__VID__ADDR = 'h60;
147  localparam PCI_Header__ID__VID__MASK = 'hffff;
148  localparam PCI_Header__ID__VID__DFLT = 'hfffe;
149 // RW: HBA Interrupt Disable
150  localparam PCI_Header__CMD__ID__ADDR = 'h61;
151  localparam PCI_Header__CMD__ID__MASK = 'h400;
152  localparam PCI_Header__CMD__ID__DFLT = 'h0;
153 // RO: Fast Back-to-Back Enable
154  localparam PCI_Header__CMD__FBE__ADDR = 'h61;
155  localparam PCI_Header__CMD__FBE__MASK = 'h200;
156  localparam PCI_Header__CMD__FBE__DFLT = 'h0;
157 // RO: SERR Enable
158  localparam PCI_Header__CMD__SEE__ADDR = 'h61;
159  localparam PCI_Header__CMD__SEE__MASK = 'h100;
160  localparam PCI_Header__CMD__SEE__DFLT = 'h0;
161 // RO: Reserved
162  localparam PCI_Header__CMD__WCC__ADDR = 'h61;
163  localparam PCI_Header__CMD__WCC__MASK = 'h80;
164  localparam PCI_Header__CMD__WCC__DFLT = 'h0;
165 // RO: Parity Error Response Enable
166  localparam PCI_Header__CMD__PEE__ADDR = 'h61;
167  localparam PCI_Header__CMD__PEE__MASK = 'h40;
168  localparam PCI_Header__CMD__PEE__DFLT = 'h0;
169 // RO: Reserved
170  localparam PCI_Header__CMD__VGA__ADDR = 'h61;
171  localparam PCI_Header__CMD__VGA__MASK = 'h20;
172  localparam PCI_Header__CMD__VGA__DFLT = 'h0;
173 // RO: Reserved
174  localparam PCI_Header__CMD__MWIE__ADDR = 'h61;
175  localparam PCI_Header__CMD__MWIE__MASK = 'h10;
176  localparam PCI_Header__CMD__MWIE__DFLT = 'h0;
177 // RO: Reserved
178  localparam PCI_Header__CMD__SCE__ADDR = 'h61;
179  localparam PCI_Header__CMD__SCE__MASK = 'h8;
180  localparam PCI_Header__CMD__SCE__DFLT = 'h0;
181 // RW: Bus Master Enable (0 - stops any DMA)
182  localparam PCI_Header__CMD__BME__ADDR = 'h61;
183  localparam PCI_Header__CMD__BME__MASK = 'h4;
184  localparam PCI_Header__CMD__BME__DFLT = 'h0;
185 // RW: Memory Space enable (here - always?)
186  localparam PCI_Header__CMD__MSE__ADDR = 'h61;
187  localparam PCI_Header__CMD__MSE__MASK = 'h2;
188  localparam PCI_Header__CMD__MSE__DFLT = 'h0;
189 // RO: Enable IO space access (only for legacy IDE)
190  localparam PCI_Header__CMD__IOSE__ADDR = 'h61;
191  localparam PCI_Header__CMD__IOSE__MASK = 'h1;
192  localparam PCI_Header__CMD__IOSE__DFLT = 'h0;
193 // RWC: Detected Parity Error
194  localparam PCI_Header__STS__DPE__ADDR = 'h61;
195  localparam PCI_Header__STS__DPE__MASK = 'h80000000;
196  localparam PCI_Header__STS__DPE__DFLT = 'h0;
197 // RWC: Signaled System Error (HBA SERR)
198  localparam PCI_Header__STS__SSE__ADDR = 'h61;
199  localparam PCI_Header__STS__SSE__MASK = 'h40000000;
200  localparam PCI_Header__STS__SSE__DFLT = 'h0;
201 // RWC: Received Master Abort
202  localparam PCI_Header__STS__RMA__ADDR = 'h61;
203  localparam PCI_Header__STS__RMA__MASK = 'h20000000;
204  localparam PCI_Header__STS__RMA__DFLT = 'h0;
205 // RWC: Received Target Abort
206  localparam PCI_Header__STS__RTA__ADDR = 'h61;
207  localparam PCI_Header__STS__RTA__MASK = 'h10000000;
208  localparam PCI_Header__STS__RTA__DFLT = 'h0;
209 // RWC: Signaled Target Abort
210  localparam PCI_Header__STS__STA__ADDR = 'h61;
211  localparam PCI_Header__STS__STA__MASK = 'h8000000;
212  localparam PCI_Header__STS__STA__DFLT = 'h0;
213 // RO: PCI DEVSEL Timing
214  localparam PCI_Header__STS__DEVT__ADDR = 'h61;
215  localparam PCI_Header__STS__DEVT__MASK = 'h6000000;
216  localparam PCI_Header__STS__DEVT__DFLT = 'h0;
217 // RWC: Master Data Parity Error Detected
218  localparam PCI_Header__STS__DPD__ADDR = 'h61;
219  localparam PCI_Header__STS__DPD__MASK = 'h1000000;
220  localparam PCI_Header__STS__DPD__DFLT = 'h0;
221 // RO: Fast Back-To-Back Capable
222  localparam PCI_Header__STS__FBC__ADDR = 'h61;
223  localparam PCI_Header__STS__FBC__MASK = 'h800000;
224  localparam PCI_Header__STS__FBC__DFLT = 'h0;
225 // RO: 66 MHz Capable
226  localparam PCI_Header__STS__C66__ADDR = 'h61;
227  localparam PCI_Header__STS__C66__MASK = 'h200000;
228  localparam PCI_Header__STS__C66__DFLT = 'h0;
229 // RO: Capabilities List (PCI power management mandatory)
230  localparam PCI_Header__STS__CL__ADDR = 'h61;
231  localparam PCI_Header__STS__CL__MASK = 'h100000;
232  localparam PCI_Header__STS__CL__DFLT = 'h100000;
233 // RO: Interrupt Status (1 - asserted)
234  localparam PCI_Header__STS__IS__ADDR = 'h61;
235  localparam PCI_Header__STS__IS__MASK = 'h80000;
236  localparam PCI_Header__STS__IS__DFLT = 'h0;
237 // RO: HBA Revision ID
238  localparam PCI_Header__RID__RID__ADDR = 'h62;
239  localparam PCI_Header__RID__RID__MASK = 'hff;
240  localparam PCI_Header__RID__RID__DFLT = 'h2;
241 // RO: Base Class Code: 1 - Mass Storage Device
242  localparam PCI_Header__CC__BCC__ADDR = 'h62;
243  localparam PCI_Header__CC__BCC__MASK = 'hff000000;
244  localparam PCI_Header__CC__BCC__DFLT = 'h1000000;
245 // RO: Sub Class Code: 0x06 - SATA Device
246  localparam PCI_Header__CC__SCC__ADDR = 'h62;
247  localparam PCI_Header__CC__SCC__MASK = 'hff0000;
248  localparam PCI_Header__CC__SCC__DFLT = 'h60000;
249 // RO: Programming Interface: 1 - AHCI HBA major rev 1
250  localparam PCI_Header__CC__PI__ADDR = 'h62;
251  localparam PCI_Header__CC__PI__MASK = 'hff0000;
252  localparam PCI_Header__CC__PI__DFLT = 'h10000;
253 // RW: Cache Line Size
254  localparam PCI_Header__CLS__CLS__ADDR = 'h63;
255  localparam PCI_Header__CLS__CLS__MASK = 'hff;
256  localparam PCI_Header__CLS__CLS__DFLT = 'h0;
257 // RW: Master Latency Timer
258  localparam PCI_Header__MLT__MLT__ADDR = 'h63;
259  localparam PCI_Header__MLT__MLT__MASK = 'hff00;
260  localparam PCI_Header__MLT__MLT__DFLT = 'h0;
261 // RO: Multi-Function Device
262  localparam PCI_Header__HTYPE__MFDT__ADDR = 'h63;
263  localparam PCI_Header__HTYPE__MFDT__MASK = 'h8000;
264  localparam PCI_Header__HTYPE__MFDT__DFLT = 'h0;
265 // RO: Header Layout 0 - HBA uses a target device layout
266  localparam PCI_Header__HTYPE__HL__ADDR = 'h63;
267  localparam PCI_Header__HTYPE__HL__MASK = 'h7f00;
268  localparam PCI_Header__HTYPE__HL__DFLT = 'h0;
269 // RO: AHCI Base Address high bits, normally RW, but here RO to get to MAXIGP1 space
270  localparam PCI_Header__ABAR__BA__ADDR = 'h69;
271  localparam PCI_Header__ABAR__BA__MASK = 'hfffffff0;
272  localparam PCI_Header__ABAR__BA__DFLT = 'h80000000;
273 // RO: Prefetchable (this is not)
274  localparam PCI_Header__ABAR__PF__ADDR = 'h69;
275  localparam PCI_Header__ABAR__PF__MASK = 'h8;
276  localparam PCI_Header__ABAR__PF__DFLT = 'h0;
277 // RO: Type (0 - any 32-bit address, here it is hard-mapped
278  localparam PCI_Header__ABAR__TP__ADDR = 'h69;
279  localparam PCI_Header__ABAR__TP__MASK = 'h6;
280  localparam PCI_Header__ABAR__TP__DFLT = 'h0;
281 // RO: Resource Type Indicator: 0 - memory address
282  localparam PCI_Header__ABAR__RTE__ADDR = 'h69;
283  localparam PCI_Header__ABAR__RTE__MASK = 'h1;
284  localparam PCI_Header__ABAR__RTE__DFLT = 'h0;
285 // RO: SubSystem ID
286  localparam PCI_Header__SS__SSID__ADDR = 'h6b;
287  localparam PCI_Header__SS__SSID__MASK = 'hffff0000;
288  localparam PCI_Header__SS__SSID__DFLT = 'h10000;
289 // RO: SubSystem Vendor ID
290  localparam PCI_Header__SS__SSVID__ADDR = 'h6b;
291  localparam PCI_Header__SS__SSVID__MASK = 'hffff;
292  localparam PCI_Header__SS__SSVID__DFLT = 'hfffe;
293 // RO: ROM Base Address
294  localparam PCI_Header__EROM__RBA__ADDR = 'h6c;
295  localparam PCI_Header__EROM__RBA__MASK = 'hffffffff;
296  localparam PCI_Header__EROM__RBA__DFLT = 'h0;
297 // RO: Capabilities pointer
298  localparam PCI_Header__CAP__CAP__ADDR = 'h6d;
299  localparam PCI_Header__CAP__CAP__MASK = 'hff;
300  localparam PCI_Header__CAP__CAP__DFLT = 'h40;
301 // RO: Interrupt pin
302  localparam PCI_Header__INTR__IPIN__ADDR = 'h6f;
303  localparam PCI_Header__INTR__IPIN__MASK = 'hff00;
304  localparam PCI_Header__INTR__IPIN__DFLT = 'h100;
305 // RW: Interrupt Line
306  localparam PCI_Header__INTR__ILINE__ADDR = 'h6f;
307  localparam PCI_Header__INTR__ILINE__MASK = 'hff;
308  localparam PCI_Header__INTR__ILINE__DFLT = 'h0;
309 // RO: Minimal Grant
310  localparam PCI_Header__MGNT__MGNT__ADDR = 'h6f;
311  localparam PCI_Header__MGNT__MGNT__MASK = 'hff0000;
312  localparam PCI_Header__MGNT__MGNT__DFLT = 'h0;
313 // RO: Maximal Latency
314  localparam PCI_Header__MLAT__MLAT__ADDR = 'h6f;
315  localparam PCI_Header__MLAT__MLAT__MASK = 'hff000000;
316  localparam PCI_Header__MLAT__MLAT__DFLT = 'h0;
317 // RO: Next Capability pointer
318  localparam PMCAP__PID__NEXT__ADDR = 'h70;
319  localparam PMCAP__PID__NEXT__MASK = 'hff00;
320  localparam PMCAP__PID__NEXT__DFLT = 'h0;
321 // RO: This is PCI Power Management Capability
322  localparam PMCAP__PID__CID__ADDR = 'h70;
323  localparam PMCAP__PID__CID__MASK = 'hff;
324  localparam PMCAP__PID__CID__DFLT = 'h1;
325 // RO: PME_SUPPORT bits:'b01000
326  localparam PMCAP__PC__PSUP__ADDR = 'h70;
327  localparam PMCAP__PC__PSUP__MASK = 'hf8000000;
328  localparam PMCAP__PC__PSUP__DFLT = 'h40000000;
329 // RO: D2 Support - no
330  localparam PMCAP__PC__D2S__ADDR = 'h70;
331  localparam PMCAP__PC__D2S__MASK = 'h4000000;
332  localparam PMCAP__PC__D2S__DFLT = 'h0;
333 // RO: D1 Support - no
334  localparam PMCAP__PC__D1S__ADDR = 'h70;
335  localparam PMCAP__PC__D1S__MASK = 'h2000000;
336  localparam PMCAP__PC__D1S__DFLT = 'h0;
337 // RO: Maximal D3cold current
338  localparam PMCAP__PC__AUXC__ADDR = 'h70;
339  localparam PMCAP__PC__AUXC__MASK = 'h1c00000;
340  localparam PMCAP__PC__AUXC__DFLT = 'h0;
341 // RO: Device-specific initialization required
342  localparam PMCAP__PC__DSI__ADDR = 'h70;
343  localparam PMCAP__PC__DSI__MASK = 'h200000;
344  localparam PMCAP__PC__DSI__DFLT = 'h0;
345 // RO: PCI clock required to generate PME
346  localparam PMCAP__PC__PMEC__ADDR = 'h70;
347  localparam PMCAP__PC__PMEC__MASK = 'h80000;
348  localparam PMCAP__PC__PMEC__DFLT = 'h0;
349 // RO: Revision of Power Management Specification support version
350  localparam PMCAP__PC__VS__ADDR = 'h70;
351  localparam PMCAP__PC__VS__MASK = 'h70000;
352  localparam PMCAP__PC__VS__DFLT = 'h0;
353 // RWC: PME Status, set by hardware when HBA generates PME
354  localparam PMCAP__PMCS__PMES__ADDR = 'h71;
355  localparam PMCAP__PMCS__PMES__MASK = 'h8000;
356  localparam PMCAP__PMCS__PMES__DFLT = 'h0;
357 // RW: PME Enable
358  localparam PMCAP__PMCS__PMEE__ADDR = 'h71;
359  localparam PMCAP__PMCS__PMEE__MASK = 'h100;
360  localparam PMCAP__PMCS__PMEE__DFLT = 'h0;
361 // RW: Power State
362  localparam PMCAP__PMCS__PS__ADDR = 'h71;
363  localparam PMCAP__PMCS__PS__MASK = 'h3;
364  localparam PMCAP__PMCS__PS__DFLT = 'h0;
365 // RO: Supports 64-bit Addressing - no
366  localparam GHC__CAP__S64A__ADDR = 'h0;
367  localparam GHC__CAP__S64A__MASK = 'h80000000;
368  localparam GHC__CAP__S64A__DFLT = 'h0;
369 // RO: Supports Native Command Queuing - no
370  localparam GHC__CAP__SNCQ__ADDR = 'h0;
371  localparam GHC__CAP__SNCQ__MASK = 'h40000000;
372  localparam GHC__CAP__SNCQ__DFLT = 'h0;
373 // RO: Supports SNotification Register - no
374  localparam GHC__CAP__SSNTF__ADDR = 'h0;
375  localparam GHC__CAP__SSNTF__MASK = 'h20000000;
376  localparam GHC__CAP__SSNTF__DFLT = 'h0;
377 // RO: Supports Mechanical Presence Switch - no
378  localparam GHC__CAP__SMPS__ADDR = 'h0;
379  localparam GHC__CAP__SMPS__MASK = 'h10000000;
380  localparam GHC__CAP__SMPS__DFLT = 'h0;
381 // RO: Supports Staggered Spin-up - no
382  localparam GHC__CAP__SSS__ADDR = 'h0;
383  localparam GHC__CAP__SSS__MASK = 'h8000000;
384  localparam GHC__CAP__SSS__DFLT = 'h0;
385 // RO: Supports Aggressive Link Power Management - no
386  localparam GHC__CAP__SALP__ADDR = 'h0;
387  localparam GHC__CAP__SALP__MASK = 'h4000000;
388  localparam GHC__CAP__SALP__DFLT = 'h0;
389 // RO: Supports Activity LED - no
390  localparam GHC__CAP__SAL__ADDR = 'h0;
391  localparam GHC__CAP__SAL__MASK = 'h2000000;
392  localparam GHC__CAP__SAL__DFLT = 'h0;
393 // RO: Supports Command List Override - no (not capable of clearing BSY and DRQ bits, needs soft reset
394  localparam GHC__CAP__SCLO__ADDR = 'h0;
395  localparam GHC__CAP__SCLO__MASK = 'h1000000;
396  localparam GHC__CAP__SCLO__DFLT = 'h0;
397 // RO: Interface Maximal speed: 2 - Gen2, 3 - Gen3
398  localparam GHC__CAP__ISS__ADDR = 'h0;
399  localparam GHC__CAP__ISS__MASK = 'hf00000;
400  localparam GHC__CAP__ISS__DFLT = 'h200000;
401 // RO: AHCI only (0 - legacy too)
402  localparam GHC__CAP__SAM__ADDR = 'h0;
403  localparam GHC__CAP__SAM__MASK = 'h40000;
404  localparam GHC__CAP__SAM__DFLT = 'h40000;
405 // RO: Supports Port Multiplier - no
406  localparam GHC__CAP__SPM__ADDR = 'h0;
407  localparam GHC__CAP__SPM__MASK = 'h20000;
408  localparam GHC__CAP__SPM__DFLT = 'h0;
409 // RO: Supports FIS-based switching of the Port Multiplier - no
410  localparam GHC__CAP__FBSS__ADDR = 'h0;
411  localparam GHC__CAP__FBSS__MASK = 'h10000;
412  localparam GHC__CAP__FBSS__DFLT = 'h0;
413 // RO: PIO Multiple DRQ block - no
414  localparam GHC__CAP__PMD__ADDR = 'h0;
415  localparam GHC__CAP__PMD__MASK = 'h8000;
416  localparam GHC__CAP__PMD__DFLT = 'h0;
417 // RO: Slumber State Capable - no
418  localparam GHC__CAP__SSC__ADDR = 'h0;
419  localparam GHC__CAP__SSC__MASK = 'h4000;
420  localparam GHC__CAP__SSC__DFLT = 'h0;
421 // RO: Partial State Capable - no
422  localparam GHC__CAP__PSC__ADDR = 'h0;
423  localparam GHC__CAP__PSC__MASK = 'h2000;
424  localparam GHC__CAP__PSC__DFLT = 'h0;
425 // RO: Number of Command Slots, 0-based (0 means 1?)
426  localparam GHC__CAP__NSC__ADDR = 'h0;
427  localparam GHC__CAP__NSC__MASK = 'h1f00;
428  localparam GHC__CAP__NSC__DFLT = 'h0;
429 // RO: Command Completion Coalescing - no
430  localparam GHC__CAP__CCCS__ADDR = 'h0;
431  localparam GHC__CAP__CCCS__MASK = 'h80;
432  localparam GHC__CAP__CCCS__DFLT = 'h0;
433 // RO: Enclosure Management - no
434  localparam GHC__CAP__EMS__ADDR = 'h0;
435  localparam GHC__CAP__EMS__MASK = 'h40;
436  localparam GHC__CAP__EMS__DFLT = 'h0;
437 // RO: External SATA connector - yes
438  localparam GHC__CAP__SXS__ADDR = 'h0;
439  localparam GHC__CAP__SXS__MASK = 'h20;
440  localparam GHC__CAP__SXS__DFLT = 'h20;
441 // RO: Number of Ports, 0-based (0 means 1?)
442  localparam GHC__CAP__NP__ADDR = 'h0;
443  localparam GHC__CAP__NP__MASK = 'h1f;
444  localparam GHC__CAP__NP__DFLT = 'h0;
445 // RO: AHCI enable (0 - legacy)
446  localparam GHC__GHC__AE__ADDR = 'h1;
447  localparam GHC__GHC__AE__MASK = 'h80000000;
448  localparam GHC__GHC__AE__DFLT = 'h80000000;
449 // RO: MSI Revert to Single Message
450  localparam GHC__GHC__MRSM__ADDR = 'h1;
451  localparam GHC__GHC__MRSM__MASK = 'h4;
452  localparam GHC__GHC__MRSM__DFLT = 'h0;
453 // RW: Interrupt Enable (all ports)
454  localparam GHC__GHC__IE__ADDR = 'h1;
455  localparam GHC__GHC__IE__MASK = 'h2;
456  localparam GHC__GHC__IE__DFLT = 'h0;
457 // RW1: HBA reset (COMINIT, ...). Set by software, cleared by hardware, section 10.4.3
458  localparam GHC__GHC__HR__ADDR = 'h1;
459  localparam GHC__GHC__HR__MASK = 'h1;
460  localparam GHC__GHC__HR__DFLT = 'h0;
461 // RWC: Interrupt Pending Status (per port)
462  localparam GHC__IS__IPS__ADDR = 'h2;
463  localparam GHC__IS__IPS__MASK = 'hffffffff;
464  localparam GHC__IS__IPS__DFLT = 'h0;
465 // RO: Ports Implemented
466  localparam GHC__PI__PI__ADDR = 'h3;
467  localparam GHC__PI__PI__MASK = 'hffffffff;
468  localparam GHC__PI__PI__DFLT = 'h1;
469 // RO: AHCI Major Version 1.
470  localparam GHC__VS__MJR__ADDR = 'h4;
471  localparam GHC__VS__MJR__MASK = 'hffff0000;
472  localparam GHC__VS__MJR__DFLT = 'h10000;
473 // RO: AHCI Minor Version 3.1
474  localparam GHC__VS__MNR__ADDR = 'h4;
475  localparam GHC__VS__MNR__MASK = 'hffff;
476  localparam GHC__VS__MNR__DFLT = 'h301;
477 // RO: DevSleep Entrance from Slumber Only
478  localparam GHC__CAP2__DESO__ADDR = 'h9;
479  localparam GHC__CAP2__DESO__MASK = 'h20;
480  localparam GHC__CAP2__DESO__DFLT = 'h0;
481 // RO: Supports Aggressive Device Sleep Management
482  localparam GHC__CAP2__SADM__ADDR = 'h9;
483  localparam GHC__CAP2__SADM__MASK = 'h10;
484  localparam GHC__CAP2__SADM__DFLT = 'h0;
485 // RO: Supports Device Sleep
486  localparam GHC__CAP2__SDS__ADDR = 'h9;
487  localparam GHC__CAP2__SDS__MASK = 'h8;
488  localparam GHC__CAP2__SDS__DFLT = 'h0;
489 // RO: Automatic Partial to Slumber Transitions
490  localparam GHC__CAP2__APST__ADDR = 'h9;
491  localparam GHC__CAP2__APST__MASK = 'h4;
492  localparam GHC__CAP2__APST__DFLT = 'h0;
493 // RO: NVMHCI Present (section 10.15)
494  localparam GHC__CAP2__NVMP__ADDR = 'h9;
495  localparam GHC__CAP2__NVMP__MASK = 'h2;
496  localparam GHC__CAP2__NVMP__DFLT = 'h0;
497 // RO: BIOS/OS Handoff - not supported
498  localparam GHC__CAP2__BOH__ADDR = 'h9;
499  localparam GHC__CAP2__BOH__MASK = 'h1;
500  localparam GHC__CAP2__BOH__DFLT = 'h0;
501 // RW: Command List Base Address (1KB aligned)
502  localparam HBA_PORT__PxCLB__CLB__ADDR = 'h40;
503  localparam HBA_PORT__PxCLB__CLB__MASK = 'hfffffc00;
504  localparam HBA_PORT__PxCLB__CLB__DFLT = 'h80000800;
505 // RW: Command List Base Address (1KB aligned)
506  localparam HBA_PORT__PxFB__CLB__ADDR = 'h42;
507  localparam HBA_PORT__PxFB__CLB__MASK = 'hffffff00;
508  localparam HBA_PORT__PxFB__CLB__DFLT = 'h80000c00;
509 // RWC: Cold Port Detect Status
510  localparam HBA_PORT__PxIS__CPDS__ADDR = 'h44;
511  localparam HBA_PORT__PxIS__CPDS__MASK = 'h80000000;
512  localparam HBA_PORT__PxIS__CPDS__DFLT = 'h0;
513 // RWC: Task File Error Status
514  localparam HBA_PORT__PxIS__TFES__ADDR = 'h44;
515  localparam HBA_PORT__PxIS__TFES__MASK = 'h40000000;
516  localparam HBA_PORT__PxIS__TFES__DFLT = 'h0;
517 // RWC: Host Bus (PCI) Fatal error
518  localparam HBA_PORT__PxIS__HBFS__ADDR = 'h44;
519  localparam HBA_PORT__PxIS__HBFS__MASK = 'h20000000;
520  localparam HBA_PORT__PxIS__HBFS__DFLT = 'h0;
521 // RWC: ECC error R/W system memory
522  localparam HBA_PORT__PxIS__HBDS__ADDR = 'h44;
523  localparam HBA_PORT__PxIS__HBDS__MASK = 'h10000000;
524  localparam HBA_PORT__PxIS__HBDS__DFLT = 'h0;
525 // RWC: Interface Fatal Error Status (sect. 6.1.2)
526  localparam HBA_PORT__PxIS__IFS__ADDR = 'h44;
527  localparam HBA_PORT__PxIS__IFS__MASK = 'h8000000;
528  localparam HBA_PORT__PxIS__IFS__DFLT = 'h0;
529 // RWC: Interface Non-Fatal Error Status (sect. 6.1.2)
530  localparam HBA_PORT__PxIS__INFS__ADDR = 'h44;
531  localparam HBA_PORT__PxIS__INFS__MASK = 'h4000000;
532  localparam HBA_PORT__PxIS__INFS__DFLT = 'h0;
533 // RWC: Overflow Status
534  localparam HBA_PORT__PxIS__OFS__ADDR = 'h44;
535  localparam HBA_PORT__PxIS__OFS__MASK = 'h1000000;
536  localparam HBA_PORT__PxIS__OFS__DFLT = 'h0;
537 // RWC: Incorrect Port Multiplier Status
538  localparam HBA_PORT__PxIS__IPMS__ADDR = 'h44;
539  localparam HBA_PORT__PxIS__IPMS__MASK = 'h800000;
540  localparam HBA_PORT__PxIS__IPMS__DFLT = 'h0;
541 // RO: PhyRdy changed Status
542  localparam HBA_PORT__PxIS__PRCS__ADDR = 'h44;
543  localparam HBA_PORT__PxIS__PRCS__MASK = 'h400000;
544  localparam HBA_PORT__PxIS__PRCS__DFLT = 'h0;
545 // RWC: Device Mechanical Presence Status
546  localparam HBA_PORT__PxIS__DMPS__ADDR = 'h44;
547  localparam HBA_PORT__PxIS__DMPS__MASK = 'h80;
548  localparam HBA_PORT__PxIS__DMPS__DFLT = 'h0;
549 // RO: Port Connect Change Status
550  localparam HBA_PORT__PxIS__PCS__ADDR = 'h44;
551  localparam HBA_PORT__PxIS__PCS__MASK = 'h40;
552  localparam HBA_PORT__PxIS__PCS__DFLT = 'h0;
553 // RWC: Descriptor Processed
554  localparam HBA_PORT__PxIS__DPS__ADDR = 'h44;
555  localparam HBA_PORT__PxIS__DPS__MASK = 'h20;
556  localparam HBA_PORT__PxIS__DPS__DFLT = 'h0;
557 // RO: Unknown FIS
558  localparam HBA_PORT__PxIS__UFS__ADDR = 'h44;
559  localparam HBA_PORT__PxIS__UFS__MASK = 'h10;
560  localparam HBA_PORT__PxIS__UFS__DFLT = 'h0;
561 // RWC: Set Device Bits Interrupt - Set Device bits FIS with 'I' bit set
562  localparam HBA_PORT__PxIS__SDBS__ADDR = 'h44;
563  localparam HBA_PORT__PxIS__SDBS__MASK = 'h8;
564  localparam HBA_PORT__PxIS__SDBS__DFLT = 'h0;
565 // RWC: DMA Setup FIS Interrupt - DMA Setup FIS received with 'I' bit set
566  localparam HBA_PORT__PxIS__DSS__ADDR = 'h44;
567  localparam HBA_PORT__PxIS__DSS__MASK = 'h4;
568  localparam HBA_PORT__PxIS__DSS__DFLT = 'h0;
569 // RWC: PIO Setup FIS Interrupt - PIO Setup FIS received with 'I' bit set
570  localparam HBA_PORT__PxIS__PSS__ADDR = 'h44;
571  localparam HBA_PORT__PxIS__PSS__MASK = 'h2;
572  localparam HBA_PORT__PxIS__PSS__DFLT = 'h0;
573 // RWC: D2H Register FIS Interrupt - D2H Register FIS received with 'I' bit set
574  localparam HBA_PORT__PxIS__DHRS__ADDR = 'h44;
575  localparam HBA_PORT__PxIS__DHRS__MASK = 'h1;
576  localparam HBA_PORT__PxIS__DHRS__DFLT = 'h0;
577 // RW: Cold Port Detect Enable
578  localparam HBA_PORT__PxIE__CPDE__ADDR = 'h45;
579  localparam HBA_PORT__PxIE__CPDE__MASK = 'h80000000;
580  localparam HBA_PORT__PxIE__CPDE__DFLT = 'h0;
581 // RW: Task File Error Enable
582  localparam HBA_PORT__PxIE__TFEE__ADDR = 'h45;
583  localparam HBA_PORT__PxIE__TFEE__MASK = 'h40000000;
584  localparam HBA_PORT__PxIE__TFEE__DFLT = 'h0;
585 // RW: Host Bus (PCI) Fatal Error Enable
586  localparam HBA_PORT__PxIE__HBFE__ADDR = 'h45;
587  localparam HBA_PORT__PxIE__HBFE__MASK = 'h20000000;
588  localparam HBA_PORT__PxIE__HBFE__DFLT = 'h0;
589 // RW: ECC Error R/W System Memory Enable
590  localparam HBA_PORT__PxIE__HBDE__ADDR = 'h45;
591  localparam HBA_PORT__PxIE__HBDE__MASK = 'h10000000;
592  localparam HBA_PORT__PxIE__HBDE__DFLT = 'h0;
593 // RW: Interface Fatal Error Enable (sect. 6.1.2)
594  localparam HBA_PORT__PxIE__IFE__ADDR = 'h45;
595  localparam HBA_PORT__PxIE__IFE__MASK = 'h8000000;
596  localparam HBA_PORT__PxIE__IFE__DFLT = 'h0;
597 // RW: Interface Non-Fatal Error Enable (sect. 6.1.2)
598  localparam HBA_PORT__PxIE__INFE__ADDR = 'h45;
599  localparam HBA_PORT__PxIE__INFE__MASK = 'h4000000;
600  localparam HBA_PORT__PxIE__INFE__DFLT = 'h0;
601 // RW: Overflow Enable
602  localparam HBA_PORT__PxIE__OFE__ADDR = 'h45;
603  localparam HBA_PORT__PxIE__OFE__MASK = 'h1000000;
604  localparam HBA_PORT__PxIE__OFE__DFLT = 'h0;
605 // RW: Incorrect Port Multiplier Enable
606  localparam HBA_PORT__PxIE__IPME__ADDR = 'h45;
607  localparam HBA_PORT__PxIE__IPME__MASK = 'h800000;
608  localparam HBA_PORT__PxIE__IPME__DFLT = 'h0;
609 // RW: PhyRdy changed Enable
610  localparam HBA_PORT__PxIE__PRCE__ADDR = 'h45;
611  localparam HBA_PORT__PxIE__PRCE__MASK = 'h400000;
612  localparam HBA_PORT__PxIE__PRCE__DFLT = 'h0;
613 // RO: Device Mechanical Presence Interrupt Enable
614  localparam HBA_PORT__PxIE__DMPE__ADDR = 'h45;
615  localparam HBA_PORT__PxIE__DMPE__MASK = 'h80;
616  localparam HBA_PORT__PxIE__DMPE__DFLT = 'h0;
617 // RW: Port Connect Change Interrupt Enable
618  localparam HBA_PORT__PxIE__PCE__ADDR = 'h45;
619  localparam HBA_PORT__PxIE__PCE__MASK = 'h40;
620  localparam HBA_PORT__PxIE__PCE__DFLT = 'h0;
621 // RW: Descriptor Processed Interrupt Enable
622  localparam HBA_PORT__PxIE__DPE__ADDR = 'h45;
623  localparam HBA_PORT__PxIE__DPE__MASK = 'h20;
624  localparam HBA_PORT__PxIE__DPE__DFLT = 'h0;
625 // RW: Unknown FIS
626  localparam HBA_PORT__PxIE__UFE__ADDR = 'h45;
627  localparam HBA_PORT__PxIE__UFE__MASK = 'h10;
628  localparam HBA_PORT__PxIE__UFE__DFLT = 'h0;
629 // RW: Device Bits Interrupt Enable
630  localparam HBA_PORT__PxIE__SDBE__ADDR = 'h45;
631  localparam HBA_PORT__PxIE__SDBE__MASK = 'h8;
632  localparam HBA_PORT__PxIE__SDBE__DFLT = 'h0;
633 // RW: DMA Setup FIS Interrupt Enable
634  localparam HBA_PORT__PxIE__DSE__ADDR = 'h45;
635  localparam HBA_PORT__PxIE__DSE__MASK = 'h4;
636  localparam HBA_PORT__PxIE__DSE__DFLT = 'h0;
637 // RW: PIO Setup FIS Interrupt Enable
638  localparam HBA_PORT__PxIE__PSE__ADDR = 'h45;
639  localparam HBA_PORT__PxIE__PSE__MASK = 'h2;
640  localparam HBA_PORT__PxIE__PSE__DFLT = 'h0;
641 // RW: D2H Register FIS Interrupt Enable
642  localparam HBA_PORT__PxIE__DHRE__ADDR = 'h45;
643  localparam HBA_PORT__PxIE__DHRE__MASK = 'h1;
644  localparam HBA_PORT__PxIE__DHRE__DFLT = 'h0;
645 // RW: Interface Communication Control
646  localparam HBA_PORT__PxCMD__ICC__ADDR = 'h46;
647  localparam HBA_PORT__PxCMD__ICC__MASK = 'hf0000000;
648  localparam HBA_PORT__PxCMD__ICC__DFLT = 'h0;
649 // RO: Aggressive Slumber/Partial - not implemented
650  localparam HBA_PORT__PxCMD__ASP__ADDR = 'h46;
651  localparam HBA_PORT__PxCMD__ASP__MASK = 'h8000000;
652  localparam HBA_PORT__PxCMD__ASP__DFLT = 'h0;
653 // RO: Aggressive Link Power Management Enable - not implemented
654  localparam HBA_PORT__PxCMD__ALPE__ADDR = 'h46;
655  localparam HBA_PORT__PxCMD__ALPE__MASK = 'h4000000;
656  localparam HBA_PORT__PxCMD__ALPE__DFLT = 'h0;
657 // RW: Drive LED on ATAPI enable
658  localparam HBA_PORT__PxCMD__DLAE__ADDR = 'h46;
659  localparam HBA_PORT__PxCMD__DLAE__MASK = 'h2000000;
660  localparam HBA_PORT__PxCMD__DLAE__DFLT = 'h0;
661 // RW: Device is ATAPI (for activity LED)
662  localparam HBA_PORT__PxCMD__ATAPI__ADDR = 'h46;
663  localparam HBA_PORT__PxCMD__ATAPI__MASK = 'h1000000;
664  localparam HBA_PORT__PxCMD__ATAPI__DFLT = 'h0;
665 // RW: Automatic Partial to Slumber Transitions Enabled
666  localparam HBA_PORT__PxCMD__APSTE__ADDR = 'h46;
667  localparam HBA_PORT__PxCMD__APSTE__MASK = 'h800000;
668  localparam HBA_PORT__PxCMD__APSTE__DFLT = 'h0;
669 // RO: FIS-Based Switching Capable Port - not implemented
670  localparam HBA_PORT__PxCMD__FBSCP__ADDR = 'h46;
671  localparam HBA_PORT__PxCMD__FBSCP__MASK = 'h400000;
672  localparam HBA_PORT__PxCMD__FBSCP__DFLT = 'h0;
673 // RO: External SATA port
674  localparam HBA_PORT__PxCMD__ESP__ADDR = 'h46;
675  localparam HBA_PORT__PxCMD__ESP__MASK = 'h200000;
676  localparam HBA_PORT__PxCMD__ESP__DFLT = 'h200000;
677 // RO: Cold Presence Detection
678  localparam HBA_PORT__PxCMD__CPD__ADDR = 'h46;
679  localparam HBA_PORT__PxCMD__CPD__MASK = 'h100000;
680  localparam HBA_PORT__PxCMD__CPD__DFLT = 'h0;
681 // RO: Mechanical Presence Switch Attached to Port
682  localparam HBA_PORT__PxCMD__MPSP__ADDR = 'h46;
683  localparam HBA_PORT__PxCMD__MPSP__MASK = 'h80000;
684  localparam HBA_PORT__PxCMD__MPSP__DFLT = 'h0;
685 // RO: Hot Plug Capable Port
686  localparam HBA_PORT__PxCMD__HPCP__ADDR = 'h46;
687  localparam HBA_PORT__PxCMD__HPCP__MASK = 'h40000;
688  localparam HBA_PORT__PxCMD__HPCP__DFLT = 'h40000;
689 // RW: Port Multiplier Attached - not implemented (software should write this bit)
690  localparam HBA_PORT__PxCMD__PMA__ADDR = 'h46;
691  localparam HBA_PORT__PxCMD__PMA__MASK = 'h20000;
692  localparam HBA_PORT__PxCMD__PMA__DFLT = 'h0;
693 // RO: Cold Presence State
694  localparam HBA_PORT__PxCMD__CPS__ADDR = 'h46;
695  localparam HBA_PORT__PxCMD__CPS__MASK = 'h10000;
696  localparam HBA_PORT__PxCMD__CPS__DFLT = 'h0;
697 // RO: Command List Running (section 5.3.2)
698  localparam HBA_PORT__PxCMD__CR__ADDR = 'h46;
699  localparam HBA_PORT__PxCMD__CR__MASK = 'h8000;
700  localparam HBA_PORT__PxCMD__CR__DFLT = 'h0;
701 // RO: FIS Receive Running (section 10.3.2)
702  localparam HBA_PORT__PxCMD__FR__ADDR = 'h46;
703  localparam HBA_PORT__PxCMD__FR__MASK = 'h4000;
704  localparam HBA_PORT__PxCMD__FR__DFLT = 'h0;
705 // RO: Mechanical Presence Switch State
706  localparam HBA_PORT__PxCMD__MPSS__ADDR = 'h46;
707  localparam HBA_PORT__PxCMD__MPSS__MASK = 'h2000;
708  localparam HBA_PORT__PxCMD__MPSS__DFLT = 'h0;
709 // RO: Current Command Slot (when PxCMD.ST 1-> ) should be reset to 0, when 0->1 - highest priority is 0
710  localparam HBA_PORT__PxCMD__CCS__ADDR = 'h46;
711  localparam HBA_PORT__PxCMD__CCS__MASK = 'h1f00;
712  localparam HBA_PORT__PxCMD__CCS__DFLT = 'h0;
713 // RW: FIS Receive Enable (enable after FIS memory is set)
714  localparam HBA_PORT__PxCMD__FRE__ADDR = 'h46;
715  localparam HBA_PORT__PxCMD__FRE__MASK = 'h10;
716  localparam HBA_PORT__PxCMD__FRE__DFLT = 'h0;
717 // RW1: Command List Override
718  localparam HBA_PORT__PxCMD__CLO__ADDR = 'h46;
719  localparam HBA_PORT__PxCMD__CLO__MASK = 'h8;
720  localparam HBA_PORT__PxCMD__CLO__DFLT = 'h0;
721 // RO: Power On Device (RW with Cold Presence Detection)
722  localparam HBA_PORT__PxCMD__POD__ADDR = 'h46;
723  localparam HBA_PORT__PxCMD__POD__MASK = 'h4;
724  localparam HBA_PORT__PxCMD__POD__DFLT = 'h4;
725 // RO: Spin-Up Device (RW with Staggered Spin-Up Support)
726  localparam HBA_PORT__PxCMD__SUD__ADDR = 'h46;
727  localparam HBA_PORT__PxCMD__SUD__MASK = 'h2;
728  localparam HBA_PORT__PxCMD__SUD__DFLT = 'h2;
729 // RW: Start (HBA may process commands). See section 10.3.1
730  localparam HBA_PORT__PxCMD__ST__ADDR = 'h46;
731  localparam HBA_PORT__PxCMD__ST__MASK = 'h1;
732  localparam HBA_PORT__PxCMD__ST__DFLT = 'h0;
733 // RO: Latest Copy of Task File Error Register
734  localparam HBA_PORT__PxTFD__ERR__ADDR = 'h48;
735  localparam HBA_PORT__PxTFD__ERR__MASK = 'hff00;
736  localparam HBA_PORT__PxTFD__ERR__DFLT = 'h0;
737 // RO: Latest Copy of Task File Status Register: BSY
738  localparam HBA_PORT__PxTFD__STS__BSY__ADDR = 'h48;
739  localparam HBA_PORT__PxTFD__STS__BSY__MASK = 'h80;
740  localparam HBA_PORT__PxTFD__STS__BSY__DFLT = 'h0;
741 // RO: Latest Copy of Task File Status Register: command-specific bits 4..6
742  localparam HBA_PORT__PxTFD__STS__64__ADDR = 'h48;
743  localparam HBA_PORT__PxTFD__STS__64__MASK = 'h70;
744  localparam HBA_PORT__PxTFD__STS__64__DFLT = 'h0;
745 // RO: Latest Copy of Task File Status Register: DRQ
746  localparam HBA_PORT__PxTFD__STS__DRQ__ADDR = 'h48;
747  localparam HBA_PORT__PxTFD__STS__DRQ__MASK = 'h8;
748  localparam HBA_PORT__PxTFD__STS__DRQ__DFLT = 'h0;
749 // RO: Latest Copy of Task File Status Register: command-specific bits 1..2
750  localparam HBA_PORT__PxTFD__STS__12__ADDR = 'h48;
751  localparam HBA_PORT__PxTFD__STS__12__MASK = 'h6;
752  localparam HBA_PORT__PxTFD__STS__12__DFLT = 'h0;
753 // RO: Latest Copy of Task File Status Register: ERR
754  localparam HBA_PORT__PxTFD__STS__ERR__ADDR = 'h48;
755  localparam HBA_PORT__PxTFD__STS__ERR__MASK = 'h1;
756  localparam HBA_PORT__PxTFD__STS__ERR__DFLT = 'h0;
757 // RO: Data in the first D2H Register FIS
758  localparam HBA_PORT__PxSIG__SIG__ADDR = 'h49;
759  localparam HBA_PORT__PxSIG__SIG__MASK = 'hffffffff;
760  localparam HBA_PORT__PxSIG__SIG__DFLT = 'hffffffff;
761 // RO: Interface Power Management
762  localparam HBA_PORT__PxSSTS__IPM__ADDR = 'h4a;
763  localparam HBA_PORT__PxSSTS__IPM__MASK = 'hf00;
764  localparam HBA_PORT__PxSSTS__IPM__DFLT = 'h0;
765 // RO: Interface Speed
766  localparam HBA_PORT__PxSSTS__SPD__ADDR = 'h4a;
767  localparam HBA_PORT__PxSSTS__SPD__MASK = 'hf0;
768  localparam HBA_PORT__PxSSTS__SPD__DFLT = 'h0;
769 // RO: Device Detection (should be detected if COMINIT is received)
770  localparam HBA_PORT__PxSSTS__DET__ADDR = 'h4a;
771  localparam HBA_PORT__PxSSTS__DET__MASK = 'hf;
772  localparam HBA_PORT__PxSSTS__DET__DFLT = 'h0;
773 // RO: Port Multiplier Port - not used by AHCI
774  localparam HBA_PORT__PxSCTL__PMP__ADDR = 'h4b;
775  localparam HBA_PORT__PxSCTL__PMP__MASK = 'hf0000;
776  localparam HBA_PORT__PxSCTL__PMP__DFLT = 'h0;
777 // RO: Select Power Management - not used by AHCI
778  localparam HBA_PORT__PxSCTL__SPM__ADDR = 'h4b;
779  localparam HBA_PORT__PxSCTL__SPM__MASK = 'hf000;
780  localparam HBA_PORT__PxSCTL__SPM__DFLT = 'h0;
781 // RW: Interface Power Management Transitions Allowed
782  localparam HBA_PORT__PxSCTL__IPM__ADDR = 'h4b;
783  localparam HBA_PORT__PxSCTL__IPM__MASK = 'hf00;
784  localparam HBA_PORT__PxSCTL__IPM__DFLT = 'h0;
785 // RW: Interface Highest Speed
786  localparam HBA_PORT__PxSCTL__SPD__ADDR = 'h4b;
787  localparam HBA_PORT__PxSCTL__SPD__MASK = 'hf0;
788  localparam HBA_PORT__PxSCTL__SPD__DFLT = 'h0;
789 // RW: Device Detection Initialization
790  localparam HBA_PORT__PxSCTL__DET__ADDR = 'h4b;
791  localparam HBA_PORT__PxSCTL__DET__MASK = 'hf;
792  localparam HBA_PORT__PxSCTL__DET__DFLT = 'h0;
793 // RWC: Exchanged (set on COMINIT), reflected in PxIS.PCS
794  localparam HBA_PORT__PxSERR__DIAG__X__ADDR = 'h4c;
795  localparam HBA_PORT__PxSERR__DIAG__X__MASK = 'h4000000;
796  localparam HBA_PORT__PxSERR__DIAG__X__DFLT = 'h0;
797 // RWC: Unknown FIS
798  localparam HBA_PORT__PxSERR__DIAG__F__ADDR = 'h4c;
799  localparam HBA_PORT__PxSERR__DIAG__F__MASK = 'h2000000;
800  localparam HBA_PORT__PxSERR__DIAG__F__DFLT = 'h0;
801 // RWC: Transport state transition error
802  localparam HBA_PORT__PxSERR__DIAG__T__ADDR = 'h4c;
803  localparam HBA_PORT__PxSERR__DIAG__T__MASK = 'h1000000;
804  localparam HBA_PORT__PxSERR__DIAG__T__DFLT = 'h0;
805 // RWC: Link sequence error
806  localparam HBA_PORT__PxSERR__DIAG__S__ADDR = 'h4c;
807  localparam HBA_PORT__PxSERR__DIAG__S__MASK = 'h800000;
808  localparam HBA_PORT__PxSERR__DIAG__S__DFLT = 'h0;
809 // RWC: Handshake Error (i.e. Device got CRC error)
810  localparam HBA_PORT__PxSERR__DIAG__H__ADDR = 'h4c;
811  localparam HBA_PORT__PxSERR__DIAG__H__MASK = 'h400000;
812  localparam HBA_PORT__PxSERR__DIAG__H__DFLT = 'h0;
813 // RWC: CRC error in Link layer
814  localparam HBA_PORT__PxSERR__DIAG__C__ADDR = 'h4c;
815  localparam HBA_PORT__PxSERR__DIAG__C__MASK = 'h200000;
816  localparam HBA_PORT__PxSERR__DIAG__C__DFLT = 'h0;
817 // RWC: Disparity Error - not used by AHCI
818  localparam HBA_PORT__PxSERR__DIAG__D__ADDR = 'h4c;
819  localparam HBA_PORT__PxSERR__DIAG__D__MASK = 'h100000;
820  localparam HBA_PORT__PxSERR__DIAG__D__DFLT = 'h0;
821 // RWC: 10B to 8B decode error
822  localparam HBA_PORT__PxSERR__DIAG__B__ADDR = 'h4c;
823  localparam HBA_PORT__PxSERR__DIAG__B__MASK = 'h80000;
824  localparam HBA_PORT__PxSERR__DIAG__B__DFLT = 'h0;
825 // RWC: COMMWAKE signal was detected
826  localparam HBA_PORT__PxSERR__DIAG__W__ADDR = 'h4c;
827  localparam HBA_PORT__PxSERR__DIAG__W__MASK = 'h40000;
828  localparam HBA_PORT__PxSERR__DIAG__W__DFLT = 'h0;
829 // RWC: PHY Internal Error
830  localparam HBA_PORT__PxSERR__DIAG__I__ADDR = 'h4c;
831  localparam HBA_PORT__PxSERR__DIAG__I__MASK = 'h20000;
832  localparam HBA_PORT__PxSERR__DIAG__I__DFLT = 'h0;
833 // RWC: PhyRdy changed. Reflected in PxIS.PRCS bit.
834  localparam HBA_PORT__PxSERR__DIAG__N__ADDR = 'h4c;
835  localparam HBA_PORT__PxSERR__DIAG__N__MASK = 'h10000;
836  localparam HBA_PORT__PxSERR__DIAG__N__DFLT = 'h0;
837 // RWC: Internal Error
838  localparam HBA_PORT__PxSERR__ERR__E__ADDR = 'h4c;
839  localparam HBA_PORT__PxSERR__ERR__E__MASK = 'h800;
840  localparam HBA_PORT__PxSERR__ERR__E__DFLT = 'h0;
841 // RWC: Protocol Error - a violation of SATA protocol detected
842  localparam HBA_PORT__PxSERR__ERR__P__ADDR = 'h4c;
843  localparam HBA_PORT__PxSERR__ERR__P__MASK = 'h400;
844  localparam HBA_PORT__PxSERR__ERR__P__DFLT = 'h0;
845 // RWC: Persistent Communication or Data Integrity Error
846  localparam HBA_PORT__PxSERR__ERR__C__ADDR = 'h4c;
847  localparam HBA_PORT__PxSERR__ERR__C__MASK = 'h200;
848  localparam HBA_PORT__PxSERR__ERR__C__DFLT = 'h0;
849 // RWC: Transient Data Integrity Error (error not recovered by the interface)
850  localparam HBA_PORT__PxSERR__ERR__T__ADDR = 'h4c;
851  localparam HBA_PORT__PxSERR__ERR__T__MASK = 'h100;
852  localparam HBA_PORT__PxSERR__ERR__T__DFLT = 'h0;
853 // RWC: Communication between the device and host was lost but re-established
854  localparam HBA_PORT__PxSERR__ERR__M__ADDR = 'h4c;
855  localparam HBA_PORT__PxSERR__ERR__M__MASK = 'h2;
856  localparam HBA_PORT__PxSERR__ERR__M__DFLT = 'h0;
857 // RWC: Recovered Data integrity Error
858  localparam HBA_PORT__PxSERR__ERR__I__ADDR = 'h4c;
859  localparam HBA_PORT__PxSERR__ERR__I__MASK = 'h1;
860  localparam HBA_PORT__PxSERR__ERR__I__DFLT = 'h0;
861 // RW1: Device Status: bit per Port, for TAG in native queued command
862  localparam HBA_PORT__PxSACT__DS__ADDR = 'h4d;
863  localparam HBA_PORT__PxSACT__DS__MASK = 'hffffffff;
864  localparam HBA_PORT__PxSACT__DS__DFLT = 'h0;
865 // RW1: Command Issued: bit per Port, only set when PxCMD.ST==1, also cleared by PxCMD.ST: 1->0 by soft
866  localparam HBA_PORT__PxCI__CI__ADDR = 'h4e;
867  localparam HBA_PORT__PxCI__CI__MASK = 'hffffffff;
868  localparam HBA_PORT__PxCI__CI__DFLT = 'h0;
869 // RWC: PM Notify (bit per PM port)
870  localparam HBA_PORT__PxSNTF__PMN__ADDR = 'h4f;
871  localparam HBA_PORT__PxSNTF__PMN__MASK = 'hffff;
872  localparam HBA_PORT__PxSNTF__PMN__DFLT = 'h0;
873 // RO: Device with Error
874  localparam HBA_PORT__PxFBS__DWE__ADDR = 'h50;
875  localparam HBA_PORT__PxFBS__DWE__MASK = 'hf0000;
876  localparam HBA_PORT__PxFBS__DWE__DFLT = 'h0;
877 // RO: Active Device Optimization
878  localparam HBA_PORT__PxFBS__ADO__ADDR = 'h50;
879  localparam HBA_PORT__PxFBS__ADO__MASK = 'hf000;
880  localparam HBA_PORT__PxFBS__ADO__DFLT = 'h0;
881 // RW: Device To Issue
882  localparam HBA_PORT__PxFBS__DEV__ADDR = 'h50;
883  localparam HBA_PORT__PxFBS__DEV__MASK = 'hf00;
884  localparam HBA_PORT__PxFBS__DEV__DFLT = 'h0;
885 // RO: Single Device Error
886  localparam HBA_PORT__PxFBS__SDE__ADDR = 'h50;
887  localparam HBA_PORT__PxFBS__SDE__MASK = 'h4;
888  localparam HBA_PORT__PxFBS__SDE__DFLT = 'h0;
889 // RW1: Device Error Clear
890  localparam HBA_PORT__PxFBS__DEC__ADDR = 'h50;
891  localparam HBA_PORT__PxFBS__DEC__MASK = 'h2;
892  localparam HBA_PORT__PxFBS__DEC__DFLT = 'h0;
893 // RW: Enable
894  localparam HBA_PORT__PxFBS__EN__ADDR = 'h50;
895  localparam HBA_PORT__PxFBS__EN__MASK = 'h1;
896  localparam HBA_PORT__PxFBS__EN__DFLT = 'h0;
897 // RO: DITO Multiplier
898  localparam HBA_PORT__PxDEVSLP__DM__ADDR = 'h51;
899  localparam HBA_PORT__PxDEVSLP__DM__MASK = 'h1e000000;
900  localparam HBA_PORT__PxDEVSLP__DM__DFLT = 'h0;
901 // RW: Device Sleep Idle Timeout (section 8.5.1.1.1)
902  localparam HBA_PORT__PxDEVSLP__DITO__ADDR = 'h51;
903  localparam HBA_PORT__PxDEVSLP__DITO__MASK = 'h1ff8000;
904  localparam HBA_PORT__PxDEVSLP__DITO__DFLT = 'h0;
905 // RW: Minimum Device Sleep Assertion Time
906  localparam HBA_PORT__PxDEVSLP__MDAT__ADDR = 'h51;
907  localparam HBA_PORT__PxDEVSLP__MDAT__MASK = 'h7c00;
908  localparam HBA_PORT__PxDEVSLP__MDAT__DFLT = 'h0;
909 // RW: Device Sleep Exit Timeout
910  localparam HBA_PORT__PxDEVSLP__DETO__ADDR = 'h51;
911  localparam HBA_PORT__PxDEVSLP__DETO__MASK = 'h3fc;
912  localparam HBA_PORT__PxDEVSLP__DETO__DFLT = 'h0;
913 // RO: Device Sleep Present
914  localparam HBA_PORT__PxDEVSLP__DSP__ADDR = 'h51;
915  localparam HBA_PORT__PxDEVSLP__DSP__MASK = 'h2;
916  localparam HBA_PORT__PxDEVSLP__DSP__DFLT = 'h0;
917 // RO: Aggressive Device Sleep Enable
918  localparam HBA_PORT__PxDEVSLP__ADSE__ADDR = 'h51;
919  localparam HBA_PORT__PxDEVSLP__ADSE__MASK = 'h1;
920  localparam HBA_PORT__PxDEVSLP__ADSE__DFLT = 'h0;
921 // RW: SAXIHP write channel cache mode
922  localparam HBA_PORT__AFI_CACHE__WR_CM__ADDR = 'h5c;
923  localparam HBA_PORT__AFI_CACHE__WR_CM__MASK = 'hf0;
924  localparam HBA_PORT__AFI_CACHE__WR_CM__DFLT = 'h30;
925 // RW: SAXIHP read channel cache mode
926  localparam HBA_PORT__AFI_CACHE__RD_CM__ADDR = 'h5c;
927  localparam HBA_PORT__AFI_CACHE__RD_CM__MASK = 'hf;
928  localparam HBA_PORT__AFI_CACHE__RD_CM__DFLT = 'h3;
929 // RW: Address/not data for programming AHCI state machine
930  localparam HBA_PORT__PGM_AHCI_SM__AnD__ADDR = 'h5d;
931  localparam HBA_PORT__PGM_AHCI_SM__AnD__MASK = 'h1000000;
932  localparam HBA_PORT__PGM_AHCI_SM__AnD__DFLT = 'h0;
933 // RW: Program address/data for programming AHCI state machine
934  localparam HBA_PORT__PGM_AHCI_SM__PGM_AD__ADDR = 'h5d;
935  localparam HBA_PORT__PGM_AHCI_SM__PGM_AD__MASK = 'h3ffff;
936  localparam HBA_PORT__PGM_AHCI_SM__PGM_AD__DFLT = 'h0;
937 // RW: 3-bit tag to add to the recorded timestamp
938  localparam HBA_PORT__PunchTime__TAG__ADDR = 'h5e;
939  localparam HBA_PORT__PunchTime__TAG__MASK = 'h7;
940  localparam HBA_PORT__PunchTime__TAG__DFLT = 'h0;
941 
942 
943 
944 localparam CLB_OFFS32 = 'h200; // # In the second half of the register space (0x800..0xbff - 1KB)
945 localparam HBA_OFFS32 = 0;
946 localparam HBA_PORT0_OFFS32 = 'h40;
947 localparam PXSIG_OFFS32 = HBA_OFFS32 + HBA_PORT0_OFFS32 + 'h9;
948 localparam PXTFD_OFFS32 = HBA_OFFS32 + HBA_PORT0_OFFS32 + 'h8;
949 localparam FB_OFFS32 = 'h300; // # Needs 0x100 bytes
950 localparam DSFIS32 = 'h0; // DMA Setup FIS
951 localparam PSFIS32 = 'h8; // PIO Setup FIS
952 localparam RFIS32 = 'h10; // D2H Register FIS
953 localparam SDBFIS32 = 'h16; // Set device bits FIS
954 localparam UFIS32 = 'h18; // Unknown FIS
955 localparam DSFIS32_LENM1 = 'h6; // DMA Setup FIS
956 localparam PSFIS32_LENM1 = 'h4; // PIO Setup FIS
957 localparam RFIS32_LENM1 = 'h4; // D2H Register FIS
958 localparam SDBFIS32_LENM1 = 'h1;
959 localparam UFIS32_LENM1 = 'hf;
960 localparam DMAH_LENM1 = 'h0; // just one word
961 localparam IGNORE_LENM1 = 'hf;
962 
963 localparam DATA_TYPE_DMA = 0;
964 localparam DATA_TYPE_FIS_HEAD = 1;
965 localparam DATA_TYPE_OK = 2;
966 localparam DATA_TYPE_ERR = 3;
967 
968 
969  reg xfer_cntr_zero_r;
970  wire dma_in_start;
971  wire dma_in_stop;
972  wire dma_skipping_extra; // skipping extra FIS data not needed for DMA
973  reg dma_in;
974  reg [1:0] was_data_in;
975  reg [11:0] data_in_dwords_r;
976  reg dwords_over;
977  reg too_long_err;
978 
979  reg [ADDRESS_BITS-1:0] reg_addr_r;
980  reg [3:0] fis_dcount; // number of DWORDS left to be written to the "memory"
981  reg fis_save; // save FIS data
984  reg [1:0] fis_end_r;
985 
986  reg fis_rec_run; // running received FIS
987  reg is_data_fis;
988  reg is_ignore;
989 
992 
993 // wire data_in_ready = hba_data_in_valid && (hba_data_in_many || (!(|was_data_in) && hba_data_in_ready));
995 
997  reg wreg_we_r;
998 
999  wire reg_we_w;
1000 
1001  reg [3:0] store_sig;
1002  reg [5:0] reg_ds; //Unused?
1003  reg [4:0] reg_ps;
1004  reg reg_d2h; //unused?
1005  reg [1:0] reg_sdb; //unused?
1006  reg [31:2] xfer_cntr_r;
1007  reg [31:2] prdbc_r;
1008 
1009 
1010  reg [15:0] tf_err_sts;
1011  reg update_err_sts_r;
1012  reg update_sig_r;
1013 // reg update_pio_r;
1014  reg update_prdbc_r;
1015  reg [1:0] get_fis_busy_r;
1016 
1017 
1018  reg [7:0] pio_es_r; // value of PIO E_Status
1019  reg [7:0] pio_err_r;
1020 
1021  reg pUpdateSig_r = 1; // state variable
1022  reg [31:0] sig_r; // signature register, save at
1023 
1024  reg fis_extra_r;
1025 
1026  reg fis_first_invalid_r;
1028 
1030 
1031  // Forward data to DMA (dev->mem) engine
1033  // Will also try to skip to the end of too long FIS
1035 
1037 
1038 
1039  assign reg_we_w = wreg_we_r && !dwords_over && fis_save;
1040  assign dma_in_start = is_data_fis && wreg_we_r;
1041 
1043  assign fis_ferr = too_long_err;
1044 
1045 
1046  assign tfd_sts = tf_err_sts[ 7:0];
1047  assign tfd_err = tf_err_sts[15:8];
1048 
1049  assign xfer_cntr = xfer_cntr_r[31:2];
1050  assign get_fis_busy = get_fis_busy_r[0];
1051 // assign data_in_dwords = data_out_dwords_r;
1053 
1054  assign pio_es = pio_es_r;
1055  assign pUpdateSig = pUpdateSig_r;
1056 
1057  assign fis_extra = fis_extra_r;
1058 
1060 
1061 //debug:
1063  assign debug_fis_end_w = fis_end_w;
1064  assign debug_fis_end_r = fis_end_r;
1066 
1067 
1068 
1069  always @ (posedge mclk) begin
1070  if (hba_rst || dma_in_stop || pcmd_st_cleared) dma_in <= 0;
1071  else if (dma_in_start) dma_in <= 1;
1072 
1073  if (hba_rst) was_data_in <= 0;
1075 
1076  if (dma_in_start) data_in_dwords_r <= 0;
1078 
1079  if (hba_rst) too_long_err <= 0; // it is a fatal error, only reset
1080  else if ((dma_in_valid && data_in_dwords_r[11]) ||
1081  (wreg_we_r && dwords_over)) too_long_err <= 1;
1082 
1085 
1086 
1087 
1088  if (get_fis) begin
1091  ({ADDRESS_BITS{get_rfis}} & (FB_OFFS32 + RFIS32)) |
1094  fis_dcount <= ({4{get_dsfis}} & DSFIS32_LENM1) |
1095  ({4{get_psfis}} & PSFIS32_LENM1) |
1096  ({4{get_rfis}} & RFIS32_LENM1) |
1097  ({4{get_sdbfis}} & SDBFIS32_LENM1) |
1098  ({4{get_ufis}} & UFIS32_LENM1 ) |
1099  ({4{get_data_fis}} & DMAH_LENM1) |
1100  ({4{get_ignore}} & IGNORE_LENM1 );
1101  // save signature FIS to memory if waiting (if not - ignore FIS)
1102  // for non-signature /non-data - obey pcmd_fre
1104 
1106  store_sig <= (get_rfis)? 1 : 0;
1107  reg_ds <= get_dsfis ? 1 : 0;
1108  reg_ps <= get_psfis ? 1 : 0;
1109  reg_d2h <= get_rfis ? 1 : 0;
1110  reg_sdb <= get_rfis ? 1 : 0;
1111  is_ignore <= get_ignore ? 1 : 0;
1112  end else if (wreg_we_r && !dwords_over) begin
1113  fis_dcount <= fis_dcount - 1; // update even if not writing to registers
1114  if (fis_save) reg_addr_r <= reg_addr_r + 1; // update only when writing to registers
1115  store_sig <= store_sig << 1;
1116  reg_ds <= reg_ds << 1;
1117  reg_ps <= reg_ps << 1;
1118  reg_d2h <= 0;
1119  reg_sdb <= reg_sdb << 1;
1120 
1121  end
1122 
1123  if (hba_rst || pcmd_st_cleared) fis_rec_run <= 0;
1124  else if (get_fis) fis_rec_run <= 1;
1125  else if (is_fis_end && data_in_ready) fis_rec_run <= 0;
1126 
1127  if (hba_rst ||get_fis || pcmd_st_cleared) dwords_over <= 0;
1128  else if (wreg_we_r && !(|fis_dcount)) dwords_over <= 1;
1129 
1130  if (hba_rst) wreg_we_r <= 0;
1132  (!is_ignore || !wreg_we_r); // Ignore - unknown length, ned to look for is_fis_end with latency
1133 
1134  fis_end_r <= {fis_end_r[0], fis_end_w};
1135 
1136  if (hba_rst || pcmd_st_cleared) get_fis_busy_r[0] <= 0;
1137  else if (get_fis) get_fis_busy_r[0] <= 1;
1138  else if (too_long_err || fis_end_w) get_fis_busy_r[0] <= 0;
1139 
1141 
1143 
1144  if (hba_rst || (|get_fis_busy_r) || pcmd_st_cleared) fis_first_vld <= 0; // is_FIS_HEAD stays on longer than just get_fis
1145  else if (is_FIS_HEAD) fis_first_vld <= 1;
1146 
1147  if (hba_rst || get_fis) fis_ok <= 0;
1149 
1150  if (hba_rst || get_fis) fis_err <= 0;
1152 
1153 
1154  if (reg_we_w) reg_data <= hba_data_in;
1155  else if (update_err_sts_r) reg_data <= {16'b0,tf_err_sts};
1156  else if (update_sig_r) reg_data <= sig_r;
1157  else if (update_prdbc_r) reg_data <= {prdbc_r[31:2],2'b0}; // xfer_cntr_r[31:2],2'b0};
1158 
1159  if (store_sig[1]) sig_r[31:8] <= hba_data_in[23:0];
1160  if (store_sig[3]) sig_r[ 7:0] <= hba_data_in[ 7:0];
1161 
1162  if (hba_rst) tf_err_sts <= 0;
1163  else if (reg_d2h) tf_err_sts <= hba_data_in[31:16]; // 15:0];
1164  // Sets pPioErr[pPmpCur] to Error field of the FIS
1165  // Updates PxTFD.STS.ERR with pPioErr[pPmpCur] ??
1166  else if (reg_ps[0]) tf_err_sts <= {hba_data_in[31:24],hba_data_in[23:16]};
1167  else if (update_pio) tf_err_sts <= {pio_err_r, pio_es_r};
1168  else if (reg_sdb[0]) tf_err_sts <= {hba_data_in[15:8], tf_err_sts[7], hba_data_in[6:4], tf_err_sts[3],hba_data_in[2:0]};
1169  else if (clear_bsy_drq || set_bsy || clear_bsy_set_drq)
1170  tf_err_sts <= tf_err_sts & {8'hff,clear_bsy_drq,3'h7,clear_bsy_drq,3'h7} | {8'h0,set_bsy,3'h0,clear_bsy_set_drq,3'h0};
1171  else if (set_sts_7f || set_sts_80) tf_err_sts <= {tf_err_sts[15:8],set_sts_80,{7{set_sts_7f}}} ;
1172 
1173  if (hba_rst) reg_we <= 0;
1175 
1176  if (reg_we_w) reg_addr <= reg_addr_r;
1177  else if (update_err_sts_r) reg_addr <= PXTFD_OFFS32;
1178  else if (update_sig_r) reg_addr <= PXSIG_OFFS32;
1179  else if (update_prdbc_r) reg_addr <= CLB_OFFS32 + 1; // location of PRDBC
1180 
1181  if (reg_d2h || reg_sdb[0] || reg_ds[0]) fis_i <= hba_data_in[14];
1182 
1183  if (reg_sdb) sdb_n <= hba_data_in[15];
1184  if (reg_ds[0]) {dma_a,dma_d} <= {hba_data_in[15],hba_data_in[13]};
1185 
1186  if (reg_ps[0]) {pio_i,pio_d} <= {hba_data_in[14],hba_data_in[13]};
1187 
1188  if (hba_rst) pio_err_r <= 0;
1189  else if (reg_ps[0]) pio_err_r <= hba_data_in[31:24];
1190 
1191  if (hba_rst) pio_es_r <= 0;
1192  else if (reg_ps[3]) pio_es_r <= hba_data_in[31:24];
1193 
1194  if (reg_sdb[1]) sactive0 <= hba_data_in[0];
1195 
1196  if (hba_rst || reg_sdb[0] || clear_xfer_cntr) xfer_cntr_r[31:2] <= 0;
1197  else if (reg_ps[4] || reg_ds[5]) xfer_cntr_r[31:2] <= {reg_ds[5]?hba_data_in[31:16]:16'b0,
1198  hba_data_in[15:2]} + hba_data_in[1]; // round up
1199  else if ((decr_dwcw || decr_dwcr) && !xfer_cntr_zero_r) xfer_cntr_r[31:2] <= {xfer_cntr_r[31:2]} -
1200  {18'b0, decr_dwcr? data_in_dwords: decr_DXC_dw[11:0]};
1201 
1202  // no - it should only be updated when written by software
1203  //CLB_OFFS32 + 1; // location of PRDBC
1204 /*
1205  input [ADDRESS_BITS-1:0] soft_write_addr, // register address written by software
1206  input [31:0] soft_write_data, // register data written (after applying wstb and type (RO, RW, RWC, RW1)
1207  input soft_write_en, // write enable for data write
1208 */
1209 // if (hba_rst || reg_sdb[0] || reg_ps[4] || reg_ds[5]) prdbc_r[31:2] <= 0;
1210 // if (soft_write_en && (soft_write_addr == (CLB_OFFS32 + 1))) prdbc_r[31:2] <= soft_write_data[31:2];
1211 
1212  if (clear_prdbc || hba_rst) prdbc_r[31:2] <= 0;
1213  else if (decr_dwcw || decr_dwcr) prdbc_r[31:2] <= {prdbc_r[31:2]} + {18'b0, decr_dwcr? data_in_dwords: decr_DXC_dw[11:0]};
1214 
1215  xfer_cntr_zero_r <= xfer_cntr_r[31:2] == 0;
1216 
1218  update_prdbc_r <= update_prdbc; // same latency as update_err_sts
1219  update_sig_r <= update_sig && pUpdateSig_r; // do not update if not requested
1220 
1221  if (hba_rst || update_pio) pPioXfer <= 0;
1222  else if (reg_ps[4]) pPioXfer <= 1;
1223 
1224  if (hba_rst || set_update_sig) pUpdateSig_r <= 1;
1225  else if (update_sig) pUpdateSig_r <= 0;
1226 
1227  if (hba_rst || update_sig) sig_available <= 0;
1228  else if (store_sig[3]) sig_available <= 1;
1229 
1230  // Maybe it is not needed if the fsm will send this pulse?
1231 
1234 
1236  else if (fis_first_flush) fis_first_flushing_r <= 1;
1237  end
1238 
1239 endmodule
[11:0] 13216data_in_dwords
[1:0] 13230debug_get_fis_busy_r
13282xfer_cntr_rreg[31:2]
13235PXTFD_OFFS32HBA_OFFS32 + HBA_PORT0_OFFS32 + 'h8
13259data_in_dwords_rreg[11:0]
reg [ADDRESS_BITS-1:0] 13217reg_addr
13262reg_addr_rreg[ADDRESS_BITS-1:0]
13284tf_err_stsreg[15:0]
[ 1:0] 13221hba_data_in_type
[11:0] 13201decr_DXC_dw
13234PXSIG_OFFS32HBA_OFFS32 + HBA_PORT0_OFFS32 + 'h9
reg [31:0] 13219reg_data
13288get_fis_busy_rreg[1:0]