OpenCores
URL https://opencores.org/ocsvn/pci/pci/trunk

Subversion Repositories pci

[/] [pci/] [tags/] [asyst_2/] [rtl/] [verilog/] [pci_conf_space.v] - Blame information for rev 132

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 77 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name: conf_space.v                                     ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - tadej@opencores.org                                   ////
10
////      - Tadej Markovic                                        ////
11
////                                                              ////
12
////  All additional information is avaliable in the README.txt   ////
13
////  file.                                                       ////
14
////                                                              ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Tadej Markovic, tadej@opencores.org       ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 132 mihad
// Revision 1.3  2003/08/14 13:06:02  simons
47
// synchronizer_flop replaced with pci_synchronizer_flop, artisan ram instance updated.
48
//
49 111 simons
// Revision 1.2  2003/03/26 13:16:18  mihad
50
// Added the reset value parameter to the synchronizer flop module.
51
// Added resets to all synchronizer flop instances.
52
// Repaired initial sync value in fifos.
53
//
54 88 mihad
// Revision 1.1  2003/01/27 16:49:31  mihad
55
// Changed module and file names. Updated scripts accordingly. FIFO synchronizations changed.
56
//
57 77 mihad
// Revision 1.4  2002/08/13 11:03:53  mihad
58
// Added a few testcases. Repaired wrong reset value for PCI_AM5 register. Repaired Parity Error Detected bit setting. Changed PCI_AM0 to always enabled(regardles of PCI_AM0 define), if image 0 is used as configuration image
59
//
60
// Revision 1.3  2002/02/01 15:25:12  mihad
61
// Repaired a few bugs, updated specification, added test bench files and design document
62
//
63
// Revision 1.2  2001/10/05 08:14:28  mihad
64
// Updated all files with inclusion of timescale file for simulation purposes.
65
//
66
// Revision 1.1.1.1  2001/10/02 15:33:46  mihad
67
// New project directory structure
68
//
69
//
70
 
71
`include "pci_constants.v"
72
 
73
// synopsys translate_off
74
`include "timescale.v"
75
// synopsys translate_on
76
 
77
/*-----------------------------------------------------------------------------------------------------------
78
        w_ prefix is a sign for Write (and read) side of Dual-Port registers
79
        r_ prefix is a sign for Read only side of Dual-Port registers
80
In the first line there are DATA and ADDRESS ports, in the second line there are write enable and read
81
enable signals with chip-select (conf_hit) for config. space.
82
In the third line there are output signlas from Command register of the PCI configuration header !!!
83
In the fourth line there are input signals to Status register of the PCI configuration header !!!
84
In the fifth line there is output from Latency Timer & r_Interrupt pin registers of the PCI conf. header !!!
85
Following are IMAGE specific registers, from which PCI_BASE_ADDR registers are the same as base address
86
registers from the PCI conf. header !!!
87
-----------------------------------------------------------------------------------------------------------*/
88
                                        // normal R/W address, data and control
89
module pci_conf_space
90
                (       w_conf_address_in, w_conf_data_in, w_conf_data_out, r_conf_address_in, r_conf_data_out,
91
                                        w_we, w_re, r_re, w_byte_en, w_clock, reset, pci_clk, wb_clk,
92
                                        // outputs from command register of the PCI header
93
                                        serr_enable, perr_response, pci_master_enable, memory_space_enable, io_space_enable,
94
                                        // inputs to status register of the PCI header
95
                                        perr_in, serr_in, master_abort_recv, target_abort_recv, target_abort_set, master_data_par_err,
96
                                        // output from cache_line_size, latency timer and r_interrupt_pin register of the PCI header
97
                                        cache_line_size_to_pci, cache_line_size_to_wb, cache_lsize_not_zero_to_wb,
98
                                        latency_tim,
99
                                        // output from all pci IMAGE registers
100
                                        pci_base_addr0, pci_base_addr1, pci_base_addr2, pci_base_addr3, pci_base_addr4, pci_base_addr5,
101
                                        pci_memory_io0, pci_memory_io1, pci_memory_io2, pci_memory_io3, pci_memory_io4, pci_memory_io5,
102
                                        pci_addr_mask0, pci_addr_mask1, pci_addr_mask2, pci_addr_mask3, pci_addr_mask4, pci_addr_mask5,
103
                                        pci_tran_addr0, pci_tran_addr1, pci_tran_addr2, pci_tran_addr3, pci_tran_addr4, pci_tran_addr5,
104
                                        pci_img_ctrl0,  pci_img_ctrl1,  pci_img_ctrl2,  pci_img_ctrl3,  pci_img_ctrl4,  pci_img_ctrl5,
105
                                        // input to pci error control and status register, error address and error data registers
106
                                        pci_error_be, pci_error_bc, pci_error_rty_exp, pci_error_es, pci_error_sig, pci_error_addr,
107
                                        pci_error_data,
108
                                        // output from all wishbone IMAGE registers
109
                                        wb_base_addr0, wb_base_addr1, wb_base_addr2, wb_base_addr3, wb_base_addr4, wb_base_addr5,
110
                                        wb_memory_io0, wb_memory_io1, wb_memory_io2, wb_memory_io3, wb_memory_io4, wb_memory_io5,
111
                                        wb_addr_mask0, wb_addr_mask1, wb_addr_mask2, wb_addr_mask3, wb_addr_mask4, wb_addr_mask5,
112
                                        wb_tran_addr0, wb_tran_addr1, wb_tran_addr2, wb_tran_addr3, wb_tran_addr4, wb_tran_addr5,
113
                                        wb_img_ctrl0,  wb_img_ctrl1,  wb_img_ctrl2,  wb_img_ctrl3,  wb_img_ctrl4,  wb_img_ctrl5,
114
                                        // input to wb error control and status register, error address and error data registers
115
                                        wb_error_be, wb_error_bc, wb_error_rty_exp, wb_error_es, wb_error_sig, wb_error_addr, wb_error_data,
116
                                        // output from conf. cycle generation register (sddress), int. control register & interrupt output
117
                                        config_addr, icr_soft_res, int_out,
118
                                        // input to interrupt status register
119 132 mihad
                                        isr_sys_err_int, isr_par_err_int, isr_int_prop,
120 77 mihad
 
121 132 mihad
                    init_complete
122 77 mihad
 
123 132 mihad
                `ifdef PCI_CPCI_HS_IMPLEMENT
124
                    ,
125
                    pci_cpci_hs_enum_oe_o, pci_cpci_hs_led_oe_o, pci_cpci_hs_es_i
126
                `endif
127
                ) ;
128
 
129
 
130 77 mihad
/*###########################################################################################################
131
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
132
        Input and output ports
133
        ======================
134
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
135
###########################################################################################################*/
136
 
137
// output data
138
output  [31 : 0]                         w_conf_data_out ;
139
output  [31 : 0]                         r_conf_data_out ;
140
reg             [31 : 0]                         w_conf_data_out ;
141
 
142
`ifdef  NO_CNF_IMAGE
143
`else
144
reg             [31 : 0]                         r_conf_data_out ;
145
`endif
146
 
147
// input data
148
input   [31 : 0]                         w_conf_data_in ;
149
wire    [31 : 0]                         w_conf_pdata_reduced ; // reduced data written into PCI image registers
150
wire    [31 : 0]                         w_conf_wdata_reduced ; // reduced data written into WB  image registers
151
// input address
152
input   [11 : 0]                         w_conf_address_in ;
153
input   [11 : 0]                         r_conf_address_in ;
154
// input control signals
155
input                                                   w_we ;
156
input                                                   w_re ;
157
input                                                   r_re ;
158
input   [3 : 0]                                  w_byte_en ;
159
input                                                   w_clock ;
160
input                                                   reset ;
161
input                                                   pci_clk ;
162
input                                                   wb_clk ;
163
// PCI header outputs from command register
164
output                                                  serr_enable ;
165
output                                                  perr_response ;
166
output                                                  pci_master_enable ;
167
output                                                  memory_space_enable ;
168
output                                                  io_space_enable ;
169
// PCI header inputs to status register
170
input                                                   perr_in ;
171
input                                                   serr_in ;
172
input                                                   master_abort_recv ;
173
input                                                   target_abort_recv ;
174
input                                                   target_abort_set ;
175
input                                                   master_data_par_err ;
176
// PCI header output from cache_line_size, latency timer and interrupt pin
177
output  [7 : 0]                                  cache_line_size_to_pci ; // sinchronized to PCI clock
178
output  [7 : 0]                                  cache_line_size_to_wb ;  // sinchronized to WB clock
179
output                                                  cache_lsize_not_zero_to_wb ; // used in WBU and PCIU
180
output  [7 : 0]                                  latency_tim ;
181
//output        [2 : 0]                                 int_pin ; // only 3 LSbits are important!
182
// PCI output from image registers
183
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr0 ;
184
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr1 ;
185
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr2 ;
186
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr3 ;
187
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr4 ;
188
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr5 ;
189
output                                                  pci_memory_io0 ;
190
output                                                  pci_memory_io1 ;
191
output                                                  pci_memory_io2 ;
192
output                                                  pci_memory_io3 ;
193
output                                                  pci_memory_io4 ;
194
output                                                  pci_memory_io5 ;
195
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask0 ;
196
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask1 ;
197
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask2 ;
198
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask3 ;
199
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask4 ;
200
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask5 ;
201
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr0 ;
202
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr1 ;
203
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr2 ;
204
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr3 ;
205
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr4 ;
206
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr5 ;
207
output  [2 : 1]                 pci_img_ctrl0 ;
208
output  [2 : 1]                 pci_img_ctrl1 ;
209
output  [2 : 1]                 pci_img_ctrl2 ;
210
output  [2 : 1]                 pci_img_ctrl3 ;
211
output  [2 : 1]                 pci_img_ctrl4 ;
212
output  [2 : 1]                 pci_img_ctrl5 ;
213
// PCI input to pci error control and status register, error address and error data registers
214
input   [3 : 0]                                  pci_error_be ;
215
input   [3 : 0]                 pci_error_bc ;
216
input                           pci_error_rty_exp ;
217
input                                                   pci_error_es ;
218
input                           pci_error_sig ;
219
input   [31 : 0]                pci_error_addr ;
220
input   [31 : 0]                pci_error_data ;
221
// WISHBONE output from image registers
222
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr0 ;
223
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr1 ;
224
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr2 ;
225
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr3 ;
226
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr4 ;
227
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr5 ;
228
output                                                  wb_memory_io0 ;
229
output                                                  wb_memory_io1 ;
230
output                                                  wb_memory_io2 ;
231
output                                                  wb_memory_io3 ;
232
output                                                  wb_memory_io4 ;
233
output                                                  wb_memory_io5 ;
234
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask0 ;
235
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask1 ;
236
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask2 ;
237
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask3 ;
238
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask4 ;
239
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask5 ;
240
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr0 ;
241
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr1 ;
242
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr2 ;
243
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr3 ;
244
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr4 ;
245
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr5 ;
246
output  [2 : 0]                 wb_img_ctrl0 ;
247
output  [2 : 0]                 wb_img_ctrl1 ;
248
output  [2 : 0]                 wb_img_ctrl2 ;
249
output  [2 : 0]                 wb_img_ctrl3 ;
250
output  [2 : 0]                 wb_img_ctrl4 ;
251
output  [2 : 0]                 wb_img_ctrl5 ;
252
// WISHBONE input to wb error control and status register, error address and error data registers
253
input   [3 : 0]                          wb_error_be ;
254
input   [3 : 0]                  wb_error_bc ;
255
input                                   wb_error_rty_exp ;
256
input                           wb_error_es ;
257
input                           wb_error_sig ;
258
input   [31 : 0]                wb_error_addr ;
259
input   [31 : 0]                wb_error_data ;
260
// GENERAL output from conf. cycle generation register & int. control register
261
output  [23 : 0]                         config_addr ;
262
output                          icr_soft_res ;
263
output                                                  int_out ;
264
// GENERAL input to interrupt status register
265
input                           isr_sys_err_int ;
266
input                           isr_par_err_int ;
267
input                                                   isr_int_prop ;
268
 
269 132 mihad
output                          init_complete ;
270 77 mihad
 
271 132 mihad
`ifdef PCI_CPCI_HS_IMPLEMENT
272
output  pci_cpci_hs_enum_oe_o   ;
273
output  pci_cpci_hs_led_oe_o    ;
274
input   pci_cpci_hs_es_i        ;
275
 
276
reg pci_cpci_hs_enum_oe_o   ;
277
reg pci_cpci_hs_led_oe_o    ;
278
 
279
// set the hot swap ejector switch debounce counter width
280
// it is only 4 for simulation purposes
281
`ifdef PCI_CPCI_SIM
282
 
283
    parameter hs_es_cnt_width = 4  ;
284
 
285
`else
286
 
287
    `ifdef PCI33
288
 
289
    parameter hs_es_cnt_width = 16 ;
290
 
291
    `endif
292
 
293
    `ifdef PCI66
294
 
295
    parameter hs_es_cnt_width = 17 ;
296
 
297
    `endif
298
`endif
299
 
300
`endif
301 77 mihad
/*###########################################################################################################
302
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
303
        REGISTERS definition
304
        ====================
305
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
306
###########################################################################################################*/
307
 
308
// Decoded Register Select signals for writting (only one address decoder)
309 132 mihad
reg             [56 : 0]                         w_reg_select_dec ;
310 77 mihad
 
311
/*###########################################################################################################
312
-------------------------------------------------------------------------------------------------------------
313
PCI CONFIGURATION SPACE HEADER (type 00h) registers
314
 
315
        BIST and some other registers are not implemented and therefor written in correct
316
        place with comment line. There are also some registers with NOT all bits implemented and therefor uses
317
        _bitX or _bitX2_X1 to sign which bit or range of bits are implemented.
318
        Some special cases and examples are described below!
319
-------------------------------------------------------------------------------------------------------------
320
###########################################################################################################*/
321
 
322
/*-----------------------------------------------------------------------------------------------------------
323
[000h-00Ch] First 4 DWORDs (32-bit) of PCI configuration header - the same regardless of the HEADER type !
324
                        r_ prefix is a sign for read only registers
325
        Vendor_ID is an ID for a specific vendor defined by PCI_SIG - 2321h does not belong to anyone (e.g.
326
        Xilinx's Vendor_ID is 10EEh and Altera's Vendor_ID is 1172h). Device_ID and Revision_ID should be used
327
        together by application. Class_Code has 3 bytes to define BASE class (06h for PCI Bridge), SUB class
328
        (00h for HOST type, 80h for Other Bridge type) and Interface type (00h for normal).
329
-----------------------------------------------------------------------------------------------------------*/
330
                        parameter                       r_vendor_id = `HEADER_VENDOR_ID ;       // 16'h2321 = 16'd8993 !!!
331
                        parameter                       r_device_id = `HEADER_DEVICE_ID ;
332
                        reg                                     command_bit8 ;
333
                        reg                                     command_bit6 ;
334
                        reg             [2 : 0]          command_bit2_0 ;
335
                        reg             [15 : 11]       status_bit15_11 ;
336
                        parameter                       r_status_bit10_9 = 2'b01 ;      // 2'b01 means MEDIUM devsel timing !!!
337
                        reg                                     status_bit8 ;
338
                        parameter                       r_status_bit7 = 1'b1 ; // fast back-to-back capable response !!!
339
                        parameter                       r_status_bit5 = `HEADER_66MHz ;         // 1'b0 indicates 33 MHz capable !!!
340 132 mihad
 
341
`ifdef PCI_CPCI_HS_IMPLEMENT
342
            wire                r_status_bit4 = 1   ;
343
            reg                 hs_ins              ;
344
            reg                 hs_ext              ;
345
            wire    [ 1: 0]     hs_pi = 2'b00       ;
346
            reg                 hs_loo              ;
347
            reg                 hs_eim              ;
348
            wire    [ 7: 0]     hs_cap_id = 8'h06   ;
349
            reg                 hs_ins_armed        ;
350
            reg                 hs_ext_armed        ;
351
`else
352
            wire                r_status_bit4 = 0 ;
353
`endif
354
 
355 77 mihad
                        parameter                       r_revision_id = `HEADER_REVISION_ID ;
356
`ifdef          HOST
357
                        parameter                       r_class_code = 24'h06_00_00 ;
358
`else
359
                        parameter                       r_class_code = 24'h06_80_00 ;
360
`endif
361
                        reg             [7 : 0]          cache_line_size_reg     ;
362
                        reg             [7 : 0]          latency_timer ;
363
                        parameter                       r_header_type = 8'h00 ;
364
                        // REG                          bist                                                    NOT implemented !!!
365
 
366
/*-----------------------------------------------------------------------------------------------------------
367
[010h-03Ch] all other DWORDs (32-bit) of PCI configuration header - only for HEADER type 00h !
368
                        r_ prefix is a sign for read only registers
369
        BASE_ADDRESS_REGISTERS are the same as ones in the PCI Target configuration registers section. They
370
        are duplicated and therefor defined just ones and used with the same name as written below. If
371
        IMAGEx is NOT defined there is only parameter image_X assigned to '0' and this parameter is used
372
        elsewhere in the code. This parameter is defined in the INTERNAL SIGNALS part !!!
373
        Interrupt_Pin value 8'h01 is used for INT_A pin used.
374
        MIN_GNT and MAX_LAT are used for device's desired values for Latency Timer value. The value in boath
375
        registers specifies a period of time in units of 1/4 microsecond. ZERO indicates that there are no
376
        major requirements for the settings of Latency Timer.
377
        MIN_GNT specifieshow how long a burst period the device needs at 33MHz. MAX_LAT specifies how often
378
        the device needs to gain access to the PCI bus. Values are choosen assuming that the target does not
379
        insert any wait states. Follow the expamle of settings for simple display card.
380
        If we use 64 (32-bit) FIFO locations for one burst then we need 8 x 1/4 microsecond periods at 33MHz
381
        clock rate => MIN_GNT = 08h ! Resolution is 1024 x 768 (= 786432 pixels for one frame) with 16-bit
382
        color mode. We can transfere 2 16-bit pixels in one FIFO location. From that we calculate, that for
383
        one frame we need 6144 burst transferes in 1/25 second. So we need one burst every 6,51 microsecond
384
        and that is 26 x 1/4 microsecond or 1Ah x 1/4 microsecond => MAX_LAT = 1Ah !
385
-----------------------------------------------------------------------------------------------------------*/
386
                        // REG x 6              base_address_register_X                 IMPLEMENTED as          pci_ba_X !!!
387
                        // REG                  r_cardbus_cis_pointer                   NOT implemented !!!
388
                        // REG                  r_subsystem_vendor_id                   NOT implemented !!!
389
                        // REG                  r_subsystem_id                                  NOT implemented !!!
390
                        // REG                  r_expansion_rom_base_address    NOT implemented !!!
391
                        // REG                  r_cap_list_pointer                              NOT implemented !!!
392
                        reg             [7 : 0]  interrupt_line ;
393
                        parameter               r_interrupt_pin = 8'h01 ;
394
                        parameter               r_min_gnt = 8'h08 ;
395
                        parameter               r_max_lat = 8'h1a ;
396
 
397
 
398
/*###########################################################################################################
399
-------------------------------------------------------------------------------------------------------------
400
PCI Bridge default image SIZE parameters
401
        This parameters are not part of any register group, but are needed for default image size configuration
402
        used in PCI Target and WISHBONE Slave configuration registers!
403
-------------------------------------------------------------------------------------------------------------
404
###########################################################################################################*/
405
 
406
/*-----------------------------------------------------------------------------------------------------------
407
        PCI Target default image size parameters are defined with masked bits for address mask registers of
408
        each image space. By default there are 1MByte of address space defined for def_pci_imageX_addr_map
409
        parameters!
410
-----------------------------------------------------------------------------------------------------------*/
411
                wire    [19:0]   def_pci_image0_addr_map = `PCI_AM0 ;
412
                wire    [19:0]   def_pci_image1_addr_map = `PCI_AM1 ;
413
                wire    [19:0]   def_pci_image2_addr_map = `PCI_AM2 ;
414
                wire    [19:0]   def_pci_image3_addr_map = `PCI_AM3 ;
415
                wire    [19:0]   def_pci_image4_addr_map = `PCI_AM4 ;
416
                wire    [19:0]   def_pci_image5_addr_map = `PCI_AM5 ;
417
 
418
/*-----------------------------------------------------------------------------------------------------------
419
        WISHBONE Slave default image size parameters are defined with masked bits for address mask registers
420
        of each image space. By default there are 1MByte of address space defined for def_wb_imageX_addr_map
421
        parameters except for def_wb_image0_addr_map which is used for configuration space!
422
-----------------------------------------------------------------------------------------------------------*/
423
                        // PARAMETER    def_wb_image0_addr_map  IMPLEMENTED as r_wb_am0 parameter for CONF. space !!!
424
                wire    [19:0]   def_wb_image1_addr_map = 20'h0000_0 ;
425
                wire    [19:0]   def_wb_image2_addr_map = 20'h0000_0 ;
426
                wire    [19:0]   def_wb_image3_addr_map = 20'h0000_0 ;
427
                wire    [19:0]   def_wb_image4_addr_map = 20'h0000_0 ;
428
                wire    [19:0]   def_wb_image5_addr_map = 20'h0000_0 ;
429
 
430
 
431
/*###########################################################################################################
432
-------------------------------------------------------------------------------------------------------------
433
PCI Target configuration registers
434
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
435
        sign which bit or range of bits are implemented. Some special cases and examples are described below!
436
-------------------------------------------------------------------------------------------------------------
437
###########################################################################################################*/
438
 
439
/*-----------------------------------------------------------------------------------------------------------
440
[100h-168h]
441
        Depending on defines (PCI_IMAGE1 or .. or PCI_IMAGE5 or (PCI_IMAGE0 and HOST)) in constants.v file,
442
        there are registers corresponding to each IMAGE defined to REG and parameter pci_image_X assigned to '1'.
443
        The maximum number of images is "6". By default there are first two images used and the first (PCI_IMAGE0)
444
        is assigned to Configuration space! With a 'define' PCI_IMAGEx you choose the number of used PCI IMAGES
445
        in a bridge without PCI_IMAGE0 (e.g. PCI_IMAGE3 tells, that PCI_IMAGE1, PCI_IMAGE2 and PCI_IMAGE3 are
446
        used for mapping the space from WB to PCI. Offcourse, PCI_IMAGE0 is assigned to Configuration space).
447
        That leave us PCI_IMAGE5 as the maximum number of images.
448
        There is one exeption, when the core is implemented as HOST. If so, then the PCI specification allowes
449
        the Configuration space NOT to be visible on the PCI bus. With `define PCI_IMAGE0 (and `define HOST), we
450
        assign PCI_IMAGE0 to normal WB to PCI image and not to configuration space!
451
 
452
        When error occurs, PCI ERR_ADDR and ERR_DATA registers stores address and data on the bus that
453
        caused error. While ERR_CS register stores Byte Enables and Bus Command in the MSByte. In bits 10
454
        and 8 it reports Retry Counter Expired (for posted writes), Error Source (Master Abort) and Error
455
        Report Signal (signals that error has occured) respectively. With bit 0 we enable Error Reporting
456
        mechanism.
457
-----------------------------------------------------------------------------------------------------------*/
458
`ifdef          HOST
459
        `ifdef  NO_CNF_IMAGE
460
                `ifdef  PCI_IMAGE0      // if PCI bridge is HOST and IMAGE0 is assigned as general image space
461
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
462
                        reg             [2 : 1]         pci_img_ctrl0_bit2_1 ;
463
                        reg                                     pci_ba0_bit0 ;
464
                        reg             [31 : 12]       pci_am0 ;
465
                        reg             [31 : 12]       pci_ta0 ;
466
                `else // if PCI bridge is HOST and IMAGE0 is not used
467
                        wire    [31 : 12]       pci_ba0_bit31_12 = 20'h0000_0 ; // NO base address needed
468
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO addr.transl. and pre-fetch
469
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
470
                        wire    [31 : 12]       pci_am0 = 20'h0000_0 ; // NO address mask needed
471
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
472
                `endif
473
        `else // if PCI bridge is HOST and IMAGE0 is assigned to PCI configuration space
474
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
475
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO pre-fetch and read line support
476
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
477
                        wire    [31 : 12]       pci_am0 = 20'hFFFF_F ; // address mask for configuration image always 20'hffff_f
478
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
479
        `endif
480
`else // if PCI bridge is GUEST, then IMAGE0 is assigned to PCI configuration space
481
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
482
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO addr.transl. and pre-fetch
483
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
484
                        wire    [31 : 12]       pci_am0 = 20'hffff_f ; // address mask for configuration image always 20'hffff_f
485
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
486
`endif
487
// IMAGE1 is included by default, meanwhile other IMAGEs are optional !!!
488
                        reg             [2 : 1]         pci_img_ctrl1_bit2_1 ;
489
                        reg             [31 : 12]       pci_ba1_bit31_12 ;
490
        `ifdef  HOST
491
                        reg                                     pci_ba1_bit0 ;
492
        `else
493
                        wire                            pci_ba1_bit0 = `PCI_BA1_MEM_IO ;
494
        `endif
495
                        reg             [31 : 12]       pci_am1 ;
496
                        reg             [31 : 12]       pci_ta1 ;
497
`ifdef          PCI_IMAGE2
498
                        reg             [2 : 1]         pci_img_ctrl2_bit2_1 ;
499
                        reg             [31 : 12]       pci_ba2_bit31_12 ;
500
        `ifdef  HOST
501
                        reg                                     pci_ba2_bit0 ;
502
        `else
503
                        wire                            pci_ba2_bit0 = `PCI_BA2_MEM_IO ;
504
        `endif
505
                        reg             [31 : 12]       pci_am2 ;
506
                        reg             [31 : 12]       pci_ta2 ;
507
`else
508
            wire        [2 : 1]         pci_img_ctrl2_bit2_1 = 2'b00 ;
509
                        wire    [31 : 12]       pci_ba2_bit31_12 = 20'h0000_0 ;
510
            wire                                pci_ba2_bit0 = 1'b0 ;
511
            wire        [31 : 12]       pci_am2 = 20'h0000_0 ;
512
            wire        [31 : 12]       pci_ta2 = 20'h0000_0 ;
513
`endif
514
`ifdef          PCI_IMAGE3
515
                        reg             [2 : 1]         pci_img_ctrl3_bit2_1 ;
516
                        reg             [31 : 12]       pci_ba3_bit31_12 ;
517
        `ifdef  HOST
518
                        reg                                     pci_ba3_bit0 ;
519
        `else
520
                        wire                            pci_ba3_bit0 = `PCI_BA3_MEM_IO ;
521
        `endif
522
                        reg             [31 : 12]       pci_am3 ;
523
                        reg             [31 : 12]       pci_ta3 ;
524
`else
525
            wire        [2 : 1]         pci_img_ctrl3_bit2_1 = 2'b00 ;
526
                        wire    [31 : 12]       pci_ba3_bit31_12 = 20'h0000_0 ;
527
            wire                                pci_ba3_bit0 = 1'b0 ;
528
            wire        [31 : 12]       pci_am3 = 20'h0000_0 ;
529
            wire        [31 : 12]       pci_ta3 = 20'h0000_0 ;
530
`endif
531
`ifdef          PCI_IMAGE4
532
                        reg             [2 : 1]         pci_img_ctrl4_bit2_1 ;
533
                        reg             [31 : 12]       pci_ba4_bit31_12 ;
534
        `ifdef  HOST
535
                        reg                                     pci_ba4_bit0 ;
536
        `else
537
                        wire                            pci_ba4_bit0 = `PCI_BA4_MEM_IO ;
538
        `endif
539
                        reg             [31 : 12]       pci_am4 ;
540
                        reg             [31 : 12]       pci_ta4 ;
541
`else
542
            wire        [2 : 1]         pci_img_ctrl4_bit2_1 = 2'b00 ;
543
                        wire    [31 : 12]       pci_ba4_bit31_12 = 20'h0000_0 ;
544
            wire                                pci_ba4_bit0 = 1'b0 ;
545
            wire        [31 : 12]       pci_am4 = 20'h0000_0 ;
546
            wire        [31 : 12]       pci_ta4 = 20'h0000_0 ;
547
`endif
548
`ifdef          PCI_IMAGE5
549
                        reg             [2 : 1]         pci_img_ctrl5_bit2_1 ;
550
                        reg             [31 : 12]       pci_ba5_bit31_12 ;
551
        `ifdef  HOST
552
                        reg                                     pci_ba5_bit0 ;
553
        `else
554
                        wire                            pci_ba5_bit0 = `PCI_BA5_MEM_IO ;
555
        `endif
556
                        reg             [31 : 12]       pci_am5 ;
557
                        reg             [31 : 12]       pci_ta5 ;
558
`else
559
            wire        [2 : 1]         pci_img_ctrl5_bit2_1 = 2'b00 ;
560
                        wire    [31 : 12]       pci_ba5_bit31_12 = 20'h0000_0 ;
561
            wire                                pci_ba5_bit0 = 1'b0 ;
562
            wire        [31 : 12]       pci_am5 = 20'h0000_0 ;
563
            wire        [31 : 12]       pci_ta5 = 20'h0000_0 ;
564
`endif
565
                        reg             [31 : 24]       pci_err_cs_bit31_24 ;
566
                        reg                                     pci_err_cs_bit10 ;
567
                        reg                                     pci_err_cs_bit9 ;
568
                        reg                                     pci_err_cs_bit8 ;
569
                        reg                                     pci_err_cs_bit0 ;
570
                        reg             [31 : 0] pci_err_addr ;
571
                        reg             [31 : 0] pci_err_data ;
572
 
573
 
574
/*###########################################################################################################
575
-------------------------------------------------------------------------------------------------------------
576
WISHBONE Slave configuration registers
577
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
578
        sign which bit or range of bits are implemented. Some special cases and examples are described below!
579
-------------------------------------------------------------------------------------------------------------
580
###########################################################################################################*/
581
 
582
/*-----------------------------------------------------------------------------------------------------------
583
[800h-85Ch]
584
        Depending on defines (WB_IMAGE1 or .. or WB_IMAGE4 or WB_IMAGE5) in constants.v file, there are
585
        registers corresponding to each IMAGE defined to REG and parameter wb_image_X assigned to '1'.
586
        The maximum number of images is "6". By default there are first two images used and the first (WB_IMAGE0)
587
        is assigned to Configuration space! With a 'define' WB_IMAGEx you choose the number of used WB IMAGES in
588
        a bridge without WB_IMAGE0 (e.g. WB_IMAGE3 tells, that WB_IMAGE1, WB_IMAGE2 and WB_IMAGE3 are used for
589
        mapping the space from PCI to WB. Offcourse, WB_IMAGE0 is assigned to Configuration space). That leave
590
        us WB_IMAGE5 as the maximum number of images.
591
 
592
        When error occurs, WISHBONE ERR_ADDR and ERR_DATA registers stores address and data on the bus that
593
        caused error. While ERR_CS register stores Byte Enables and Bus Command in the MSByte. In bits 10, 9
594
        and 8 it reports Retry Counter Expired (for posted writes), Error Source (Master Abort) and Error
595
        Report Signal (signals that error has occured) respectively. With bit 0 we enable Error Reporting
596
        mechanism.
597
-----------------------------------------------------------------------------------------------------------*/
598
// WB_IMAGE0 is always assigned to config. space or is not used
599
                        wire    [2 : 0]          wb_img_ctrl0_bit2_0 = 3'b000 ; // NO addr.transl., pre-fetch and read-line
600
                        wire    [31 : 12]       wb_ba0_bit31_12 = `WB_CONFIGURATION_BASE ;
601
                        wire                            wb_ba0_bit0 = 0 ; // config. space is MEMORY space
602
                        wire    [31 : 12]       wb_am0 = `WB_AM0 ; // 4KBytes of configuration space is minimum
603
                        wire    [31 : 12]       wb_ta0 = 20'h0000_0 ; // NO address translation needed
604
// WB_IMAGE1 is included by default meanwhile others are optional !
605
                        reg             [2 : 0]          wb_img_ctrl1_bit2_0 ;
606
                        reg             [31 : 12]       wb_ba1_bit31_12 ;
607
                        reg                                     wb_ba1_bit0 ;
608
                        reg             [31 : 12]       wb_am1 ;
609
                        reg             [31 : 12]       wb_ta1 ;
610
`ifdef          WB_IMAGE2
611
                        reg             [2 : 0]          wb_img_ctrl2_bit2_0 ;
612
                        reg             [31 : 12]       wb_ba2_bit31_12 ;
613
                        reg                                     wb_ba2_bit0 ;
614
                        reg             [31 : 12]       wb_am2 ;
615
                        reg             [31 : 12]       wb_ta2 ;
616
`else
617
            wire        [2 : 0]          wb_img_ctrl2_bit2_0 = 3'b000 ;
618
                        wire    [31 : 12]       wb_ba2_bit31_12 = 20'h0000_0 ;
619
            wire                                wb_ba2_bit0 = 1'b0 ;
620
            wire        [31 : 12]       wb_am2 = 20'h0000_0 ;
621
            wire        [31 : 12]       wb_ta2 = 20'h0000_0 ;
622
`endif
623
`ifdef          WB_IMAGE3
624
                        reg             [2 : 0]          wb_img_ctrl3_bit2_0 ;
625
                        reg             [31 : 12]       wb_ba3_bit31_12 ;
626
                        reg                                     wb_ba3_bit0 ;
627
                        reg             [31 : 12]       wb_am3 ;
628
                        reg             [31 : 12]       wb_ta3 ;
629
`else
630
            wire        [2 : 0]          wb_img_ctrl3_bit2_0 = 3'b000 ;
631
                        wire    [31 : 12]       wb_ba3_bit31_12 = 20'h0000_0 ;
632
            wire                                wb_ba3_bit0 = 1'b0 ;
633
            wire        [31 : 12]       wb_am3 = 20'h0000_0 ;
634
            wire        [31 : 12]       wb_ta3 = 20'h0000_0 ;
635
`endif
636
`ifdef          WB_IMAGE4
637
                        reg             [2 : 0]          wb_img_ctrl4_bit2_0 ;
638
                        reg             [31 : 12]       wb_ba4_bit31_12 ;
639
                        reg                                     wb_ba4_bit0 ;
640
                        reg             [31 : 12]       wb_am4 ;
641
                        reg             [31 : 12]       wb_ta4 ;
642
`else
643
            wire        [2 : 0]          wb_img_ctrl4_bit2_0 = 3'b000 ;
644
                        wire    [31 : 12]       wb_ba4_bit31_12 = 20'h0000_0 ;
645
            wire                                wb_ba4_bit0 = 1'b0 ;
646
            wire        [31 : 12]       wb_am4 = 20'h0000_0 ;
647
            wire        [31 : 12]       wb_ta4 = 20'h0000_0 ;
648
`endif
649
`ifdef          WB_IMAGE5
650
                        reg             [2 : 0]          wb_img_ctrl5_bit2_0 ;
651
                        reg             [31 : 12]       wb_ba5_bit31_12 ;
652
                        reg                                     wb_ba5_bit0 ;
653
                        reg             [31 : 12]       wb_am5 ;
654
                        reg             [31 : 12]       wb_ta5 ;
655
`else
656
            wire        [2 : 0]          wb_img_ctrl5_bit2_0 = 3'b000 ;
657
                        wire    [31 : 12]       wb_ba5_bit31_12 = 20'h0000_0 ;
658
            wire                                wb_ba5_bit0 = 1'b0 ;
659
            wire        [31 : 12]       wb_am5 = 20'h0000_0 ;
660
            wire        [31 : 12]       wb_ta5 = 20'h0000_0 ;
661
`endif
662
                        reg             [31 : 24]       wb_err_cs_bit31_24 ;
663
/*                      reg                                     wb_err_cs_bit10 ;*/
664
                        reg                                     wb_err_cs_bit9 ;
665
                        reg                                     wb_err_cs_bit8 ;
666
                        reg                                     wb_err_cs_bit0 ;
667
                        reg             [31 : 0] wb_err_addr ;
668
                        reg             [31 : 0] wb_err_data ;
669
 
670
 
671
/*###########################################################################################################
672
-------------------------------------------------------------------------------------------------------------
673
Configuration Cycle address register
674
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
675
        sign which bit or range of bits are implemented.
676
-------------------------------------------------------------------------------------------------------------
677
###########################################################################################################*/
678
 
679
/*-----------------------------------------------------------------------------------------------------------
680
[860h-868h]
681
        PCI bridge must ignore Type 1 configuration cycles (Master Abort) since they are used for PCI to PCI
682
        bridges. This is single function device, that means responding on configuration cycles to all functions
683
        (or responding only to function 0). Configuration address register for generating configuration cycles
684
        is prepared for all options (it includes Bus Number, Device, Function, Offset and Type).
685
        Interrupt acknowledge register stores interrupt vector data returned during Interrupt Acknowledge cycle.
686
-----------------------------------------------------------------------------------------------------------*/
687
`ifdef          HOST
688
                        reg             [23 : 2]        cnf_addr_bit23_2 ;
689
                        reg                                     cnf_addr_bit0 ;
690
`else // GUEST
691
                        wire    [23 : 2]        cnf_addr_bit23_2        = 22'h0 ;
692
                        wire                            cnf_addr_bit0           = 1'b0 ;
693
`endif
694
                        // reg  [31 : 0]        cnf_data ;              IMPLEMENTED elsewhere !!!!!
695
                        // reg  [31 : 0]        int_ack ;               IMPLEMENTED elsewhere !!!!!
696
 
697
 
698
/*###########################################################################################################
699
-------------------------------------------------------------------------------------------------------------
700
General Interrupt registers
701
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
702
        sign which bit or range of bits are implemented.
703
-------------------------------------------------------------------------------------------------------------
704
###########################################################################################################*/
705
 
706
/*-----------------------------------------------------------------------------------------------------------
707
[FF8h-FFCh]
708
        Bit 31 in the Interrupt Control register is set by software and used to generate SOFT RESET. Other 4
709
        bits are used to enable interrupt generations.
710
        5 LSbits in the Interrupt Status register are indicating System Error Int, Parity Error Int, PCI & WB
711
        Error Int and Inerrupt respecively. System and Parity errors are implented only in HOST bridge
712
        implementations!
713
-----------------------------------------------------------------------------------------------------------*/
714
                        reg                                     icr_bit31 ;
715
`ifdef          HOST
716 132 mihad
                        reg             [4 : 3]         icr_bit4_3              ;
717
                        reg             [4 : 3]         isr_bit4_3              ;
718
                        reg             [2 : 0]          icr_bit2_0              ;
719
                        reg             [2 : 0]          isr_bit2_0              ;
720 77 mihad
`else // GUEST
721
                        wire    [4 : 3]         icr_bit4_3 = 2'h0 ;
722
                        wire    [4 : 3]         isr_bit4_3 = 2'h0 ;
723
                        reg             [2 : 0]          icr_bit2_0 ;
724
                        reg             [2 : 0]          isr_bit2_0 ;
725
`endif
726
 
727 132 mihad
/*###########################################################################################################
728
-------------------------------------------------------------------------------------------------------------
729
Initialization complete identifier
730
    When using I2C or similar initialisation mechanism,
731
    the bridge must not respond to transaction requests on PCI bus,
732
    not even to configuration cycles.
733
    Therefore, only when init_complete is set, the bridge starts
734
    participating on the PCI bus as an active device.
735
    Two additional flip flops are also provided for GUEST implementation,
736
    to synchronize to the pci clock after PCI reset is asynchronously de-asserted.
737
-------------------------------------------------------------------------------------------------------------
738
###########################################################################################################*/
739 77 mihad
 
740 132 mihad
`ifdef GUEST
741
 
742
reg rst_inactive_sync ;
743
reg rst_inactive      ;
744
 
745
`else
746
 
747
wire rst_inactive = 1'b1 ;
748
 
749
`endif
750
 
751
reg init_complete   ;
752
 
753 77 mihad
/*###########################################################################################################
754
-------------------------------------------------------------------------------------------------------------
755
 
756
 
757
-----------------------------------------------------------------------------------------------------------*/
758
 
759
`ifdef NO_CNF_IMAGE // if IMAGE0 is assigned as general image space
760
 
761
                assign  r_conf_data_out = 32'h0000_0000 ;
762
 
763
`else
764
 
765
    always@(r_conf_address_in or
766 132 mihad
                status_bit15_11 or status_bit8 or r_status_bit4 or command_bit8 or command_bit6 or command_bit2_0 or
767 77 mihad
                latency_timer or cache_line_size_reg or
768
                pci_ba0_bit31_12 or
769
                pci_img_ctrl0_bit2_1 or pci_am0 or pci_ta0 or pci_ba0_bit0 or
770
                pci_img_ctrl1_bit2_1 or pci_am1 or pci_ta1 or pci_ba1_bit31_12 or pci_ba1_bit0 or
771
                pci_img_ctrl2_bit2_1 or pci_am2 or pci_ta2 or pci_ba2_bit31_12 or pci_ba2_bit0 or
772
                pci_img_ctrl3_bit2_1 or pci_am3 or pci_ta3 or pci_ba3_bit31_12 or pci_ba3_bit0 or
773
                pci_img_ctrl4_bit2_1 or pci_am4 or pci_ta4 or pci_ba4_bit31_12 or pci_ba4_bit0 or
774
                pci_img_ctrl5_bit2_1 or pci_am5 or pci_ta5 or pci_ba5_bit31_12 or pci_ba5_bit0 or
775
                interrupt_line or
776
                pci_err_cs_bit31_24 or pci_err_cs_bit10 or pci_err_cs_bit9 or pci_err_cs_bit8 or pci_err_cs_bit0 or
777
                pci_err_addr or pci_err_data or
778
                wb_ba0_bit31_12 or wb_ba0_bit0 or
779
                wb_img_ctrl1_bit2_0 or wb_ba1_bit31_12 or wb_ba1_bit0 or wb_am1 or wb_ta1 or
780
                wb_img_ctrl2_bit2_0 or wb_ba2_bit31_12 or wb_ba2_bit0 or wb_am2 or wb_ta2 or
781
                wb_img_ctrl3_bit2_0 or wb_ba3_bit31_12 or wb_ba3_bit0 or wb_am3 or wb_ta3 or
782
                wb_img_ctrl4_bit2_0 or wb_ba4_bit31_12 or wb_ba4_bit0 or wb_am4 or wb_ta4 or
783
                wb_img_ctrl5_bit2_0 or wb_ba5_bit31_12 or wb_ba5_bit0 or wb_am5 or wb_ta5 or
784
                wb_err_cs_bit31_24 or /*wb_err_cs_bit10 or*/ wb_err_cs_bit9 or wb_err_cs_bit8 or wb_err_cs_bit0 or
785
                wb_err_addr or wb_err_data or
786
                cnf_addr_bit23_2 or cnf_addr_bit0 or icr_bit31 or icr_bit4_3 or icr_bit2_0 or isr_bit4_3 or isr_bit2_0
787 132 mihad
 
788
        `ifdef PCI_CPCI_HS_IMPLEMENT
789
            or hs_ins or hs_ext or hs_pi or hs_loo or hs_eim or hs_cap_id
790
        `endif
791 77 mihad
                )
792
    begin
793
        case (r_conf_address_in[8])
794
        1'b0 :
795
        begin
796
          case ({r_conf_address_in[7], r_conf_address_in[6]})
797
          2'b00 :
798
          begin
799
                // PCI header - configuration space
800
                case (r_conf_address_in[5:2])
801
                4'h0: r_conf_data_out = { r_device_id, r_vendor_id } ;
802 132 mihad
                4'h1: r_conf_data_out = { status_bit15_11, r_status_bit10_9, status_bit8, r_status_bit7, 1'h0, r_status_bit5, r_status_bit4,
803
                                                                         4'h0, 7'h00, command_bit8, 1'h0, command_bit6, 3'h0, command_bit2_0 } ;
804 77 mihad
                4'h2: r_conf_data_out = { r_class_code, r_revision_id } ;
805
                4'h3: r_conf_data_out = { 8'h00, r_header_type, latency_timer, cache_line_size_reg } ;
806
                4'h4:
807
                begin
808
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
809
                                                                                                                                 pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
810
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
811
                        r_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
812
                end
813
                4'h5:
814
                begin
815
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
816
                                                                                                                                 pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
817
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
818
                        r_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
819
                end
820
                4'h6:
821
                begin
822
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
823
                                                                                                                                 pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
824
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
825
                        r_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
826
                end
827
                4'h7:
828
                begin
829
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
830
                                                                                                                                 pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
831
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
832
                        r_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
833
                end
834
                4'h8:
835
                begin
836
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
837
                                                                                                                                 pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
838
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
839
                        r_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
840
                end
841
                4'h9:
842
                begin
843
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
844
                                                                                                                                 pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
845
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
846
                        r_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
847
                end
848 132 mihad
        `ifdef PCI_CPCI_HS_IMPLEMENT
849
            4'hD:
850
            begin
851
                r_conf_data_out = {24'h0000_00, `PCI_CAP_PTR_VAL} ;
852
            end
853
        `endif
854 77 mihad
                4'hf: r_conf_data_out = { r_max_lat, r_min_gnt, r_interrupt_pin, interrupt_line } ;
855 132 mihad
                default: r_conf_data_out = 32'h0000_0000 ;
856 77 mihad
                endcase
857
          end
858
          default :
859 132 mihad
          begin
860
          `ifdef PCI_CPCI_HS_IMPLEMENT
861
            if ( (r_conf_address_in[7:0] >> 2) == ((`PCI_CAP_PTR_VAL) >> 2) )
862
            begin
863
              r_conf_data_out  = {8'h00, hs_ins, hs_ext, hs_pi, hs_loo, 1'b0, hs_eim, 1'b0, 8'h00, hs_cap_id} ;
864
            end
865
            else
866
            begin
867
              r_conf_data_out = 32'h0000_0000 ;
868
            end
869
          `else
870
                r_conf_data_out = 32'h0000_0000 ;
871
          `endif
872
          end
873 77 mihad
          endcase
874
        end
875
        default :
876
        begin
877
                // PCI target - configuration space
878
                case (r_conf_address_in[7:2])
879
                `P_IMG_CTRL0_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl0_bit2_1, 1'h0 } ;
880
            `P_BA0_ADDR          :
881
                begin
882
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
883
                                                                                                                                 pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
884
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
885
                        r_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
886
                end
887
            `P_AM0_ADDR          :
888
                begin
889
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
890
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
891
                end
892
            `P_TA0_ADDR          :
893
                begin
894
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
895
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
896
                end
897
            `P_IMG_CTRL1_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl1_bit2_1, 1'h0 } ;
898
            `P_BA1_ADDR          :
899
                begin
900
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
901
                                                                                                                                 pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
902
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
903
                        r_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
904
                end
905
            `P_AM1_ADDR          :
906
                begin
907
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
908
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
909
                end
910
            `P_TA1_ADDR          :
911
                begin
912
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
913
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
914
                end
915
            `P_IMG_CTRL2_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl2_bit2_1, 1'h0 } ;
916
            `P_BA2_ADDR          :
917
                begin
918
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
919
                                                                                                                                 pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
920
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
921
                        r_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
922
                end
923
            `P_AM2_ADDR          :
924
                begin
925
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
926
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
927
                end
928
            `P_TA2_ADDR          :
929
                begin
930
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
931
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
932
                end
933
            `P_IMG_CTRL3_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl3_bit2_1, 1'h0 } ;
934
            `P_BA3_ADDR          :
935
                begin
936
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
937
                                                                                                                                 pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
938
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
939
                        r_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
940
                end
941
            `P_AM3_ADDR          :
942
                begin
943
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
944
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
945
                end
946
            `P_TA3_ADDR          :
947
                begin
948
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
949
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
950
                end
951
            `P_IMG_CTRL4_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl4_bit2_1, 1'h0 } ;
952
            `P_BA4_ADDR          :
953
                begin
954
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
955
                                                                                                                                 pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
956
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
957
                        r_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
958
                end
959
            `P_AM4_ADDR          :
960
                begin
961
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
962
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
963
                end
964
            `P_TA4_ADDR          :
965
                begin
966
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
967
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
968
                end
969
            `P_IMG_CTRL5_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl5_bit2_1, 1'h0 } ;
970
            `P_BA5_ADDR          :
971
                begin
972
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
973
                                                                                                                                 pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
974
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
975
                        r_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
976
                end
977
            `P_AM5_ADDR          :
978
                begin
979
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
980
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
981
                end
982
            `P_TA5_ADDR          :
983
                begin
984
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
985
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
986
                end
987
            `P_ERR_CS_ADDR       : r_conf_data_out = { pci_err_cs_bit31_24, 13'h0000, pci_err_cs_bit10, pci_err_cs_bit9,
988
                                                                                   pci_err_cs_bit8, 7'h00, pci_err_cs_bit0 } ;
989
            `P_ERR_ADDR_ADDR : r_conf_data_out = pci_err_addr ;
990
            `P_ERR_DATA_ADDR : r_conf_data_out = pci_err_data ;
991
                // WB slave - configuration space
992
                `WB_CONF_SPC_BAR_ADDR: r_conf_data_out = { wb_ba0_bit31_12, 11'h000, wb_ba0_bit0 } ;
993
                `W_IMG_CTRL1_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl1_bit2_0 } ;
994
                `W_BA1_ADDR              :
995
                begin
996
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
997
                                                                                                                                wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
998
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
999
                        r_conf_data_out[0] = wb_ba1_bit0 ;
1000
                end
1001
                `W_AM1_ADDR              :
1002
                begin
1003
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1004
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1005
                end
1006
                `W_TA1_ADDR              :
1007
                begin
1008
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1009
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1010
                end
1011
                `W_IMG_CTRL2_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl2_bit2_0 } ;
1012
                `W_BA2_ADDR              :
1013
                begin
1014
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1015
                                                                                                                                wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1016
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1017
                        r_conf_data_out[0] = wb_ba2_bit0 ;
1018
                end
1019
                `W_AM2_ADDR              :
1020
                begin
1021
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1022
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1023
                end
1024
                `W_TA2_ADDR              :
1025
                begin
1026
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1027
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1028
                end
1029
                `W_IMG_CTRL3_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl3_bit2_0 } ;
1030
                `W_BA3_ADDR              :
1031
                begin
1032
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1033
                                                                                                                                wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1034
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1035
                        r_conf_data_out[0] = wb_ba3_bit0 ;
1036
                end
1037
                `W_AM3_ADDR              :
1038
                begin
1039
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1040
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1041
                end
1042
                `W_TA3_ADDR              :
1043
                begin
1044
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1045
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1046
                end
1047
                `W_IMG_CTRL4_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl4_bit2_0 } ;
1048
                `W_BA4_ADDR              :
1049
                begin
1050
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1051
                                                                                                                                wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1052
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1053
                        r_conf_data_out[0] = wb_ba4_bit0 ;
1054
                end
1055
                `W_AM4_ADDR              :
1056
                begin
1057
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1058
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1059
                end
1060
                `W_TA4_ADDR              :
1061
                begin
1062
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1063
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1064
                end
1065
                `W_IMG_CTRL5_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl5_bit2_0 } ;
1066
                `W_BA5_ADDR              :
1067
                begin
1068
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1069
                                                                                                                                wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1070
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1071
                        r_conf_data_out[0] = wb_ba5_bit0 ;
1072
                end
1073
                `W_AM5_ADDR              :
1074
                begin
1075
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1076
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1077
                end
1078
                `W_TA5_ADDR              :
1079
                begin
1080
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1081
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1082
                end
1083
                `W_ERR_CS_ADDR   : r_conf_data_out = { wb_err_cs_bit31_24, /*13*/14'h0000, /*wb_err_cs_bit10,*/
1084
                                                                                   wb_err_cs_bit9, wb_err_cs_bit8, 7'h00, wb_err_cs_bit0 } ;
1085
                `W_ERR_ADDR_ADDR : r_conf_data_out = wb_err_addr ;
1086
                `W_ERR_DATA_ADDR : r_conf_data_out = wb_err_data ;
1087
 
1088
                `CNF_ADDR_ADDR   : r_conf_data_out = { 8'h00, cnf_addr_bit23_2, 1'h0, cnf_addr_bit0 } ;
1089
                // `CNF_DATA_ADDR: implemented elsewhere !!!
1090
                // `INT_ACK_ADDR : implemented elsewhere !!!
1091
            `ICR_ADDR            : r_conf_data_out = { icr_bit31, 26'h0000_000, icr_bit4_3, icr_bit2_0 } ;
1092
            `ISR_ADDR            : r_conf_data_out = { 27'h0000_000, isr_bit4_3, isr_bit2_0 } ;
1093
 
1094
                default : r_conf_data_out = 32'h0000_0000 ;
1095
                endcase
1096
        end
1097
        endcase
1098
    end
1099
 
1100
`endif
1101
 
1102
always@(w_conf_address_in or
1103 132 mihad
                status_bit15_11 or status_bit8 or r_status_bit4 or command_bit8 or command_bit6 or command_bit2_0 or
1104 77 mihad
                latency_timer or cache_line_size_reg or
1105
                pci_ba0_bit31_12 or
1106
                pci_img_ctrl0_bit2_1 or pci_am0 or pci_ta0 or pci_ba0_bit0 or
1107
                pci_img_ctrl1_bit2_1 or pci_am1 or pci_ta1 or pci_ba1_bit31_12 or pci_ba1_bit0 or
1108
                pci_img_ctrl2_bit2_1 or pci_am2 or pci_ta2 or pci_ba2_bit31_12 or pci_ba2_bit0 or
1109
                pci_img_ctrl3_bit2_1 or pci_am3 or pci_ta3 or pci_ba3_bit31_12 or pci_ba3_bit0 or
1110
                pci_img_ctrl4_bit2_1 or pci_am4 or pci_ta4 or pci_ba4_bit31_12 or pci_ba4_bit0 or
1111
                pci_img_ctrl5_bit2_1 or pci_am5 or pci_ta5 or pci_ba5_bit31_12 or pci_ba5_bit0 or
1112
                interrupt_line or
1113
                pci_err_cs_bit31_24 or pci_err_cs_bit10 or pci_err_cs_bit9 or pci_err_cs_bit8 or pci_err_cs_bit0 or
1114
                pci_err_addr or pci_err_data or
1115
                wb_ba0_bit31_12 or wb_ba0_bit0 or
1116
                wb_img_ctrl1_bit2_0 or wb_ba1_bit31_12 or wb_ba1_bit0 or wb_am1 or wb_ta1 or
1117
                wb_img_ctrl2_bit2_0 or wb_ba2_bit31_12 or wb_ba2_bit0 or wb_am2 or wb_ta2 or
1118
                wb_img_ctrl3_bit2_0 or wb_ba3_bit31_12 or wb_ba3_bit0 or wb_am3 or wb_ta3 or
1119
                wb_img_ctrl4_bit2_0 or wb_ba4_bit31_12 or wb_ba4_bit0 or wb_am4 or wb_ta4 or
1120
                wb_img_ctrl5_bit2_0 or wb_ba5_bit31_12 or wb_ba5_bit0 or wb_am5 or wb_ta5 or
1121
                wb_err_cs_bit31_24 or /*wb_err_cs_bit10 or*/ wb_err_cs_bit9 or wb_err_cs_bit8 or wb_err_cs_bit0 or
1122
                wb_err_addr or wb_err_data or
1123
                cnf_addr_bit23_2 or cnf_addr_bit0 or icr_bit31 or icr_bit4_3 or icr_bit2_0 or isr_bit4_3 or isr_bit2_0
1124 132 mihad
 
1125
    `ifdef PCI_CPCI_HS_IMPLEMENT
1126
        or hs_ins or hs_ext or hs_pi or hs_loo or hs_eim or hs_cap_id
1127
    `endif
1128 77 mihad
                )
1129
begin
1130
        case (w_conf_address_in[8])
1131
        1'b0 :
1132
        begin
1133
          case ({w_conf_address_in[7], w_conf_address_in[6]})
1134
          2'b00 :
1135
          begin
1136
                // PCI header - configuration space
1137
                case (w_conf_address_in[5:2])
1138
                4'h0:
1139
                begin
1140
                        w_conf_data_out = { r_device_id, r_vendor_id } ;
1141 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ; // Read-Only register
1142 77 mihad
                end
1143
                4'h1: // w_reg_select_dec bit 0
1144
                begin
1145 132 mihad
                        w_conf_data_out = { status_bit15_11, r_status_bit10_9, status_bit8, r_status_bit7, 1'h0, r_status_bit5, r_status_bit4,
1146
                                                                 4'h0, 7'h00, command_bit8, 1'h0, command_bit6, 3'h0, command_bit2_0 } ;
1147
                        w_reg_select_dec = 57'h000_0000_0000_0001 ;
1148 77 mihad
                end
1149
                4'h2:
1150
                begin
1151
                        w_conf_data_out = { r_class_code, r_revision_id } ;
1152 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ; // Read-Only register
1153 77 mihad
                end
1154
                4'h3: // w_reg_select_dec bit 1
1155
                begin
1156
                        w_conf_data_out = { 8'h00, r_header_type, latency_timer, cache_line_size_reg } ;
1157 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0002 ;
1158 77 mihad
                end
1159
                4'h4: // w_reg_select_dec bit 4
1160
                begin
1161
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1162
                                                                                                                         pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1163
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1164
                w_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
1165 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0010 ; // The same for another address
1166 77 mihad
                end
1167
                4'h5: // w_reg_select_dec bit 8
1168
                begin
1169
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1170
                                                                                                                         pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1171
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1172
                w_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
1173 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0100 ; // The same for another address
1174 77 mihad
                end
1175
                4'h6: // w_reg_select_dec bit 12
1176
                begin
1177
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1178
                                                                                                                         pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1179
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1180
                w_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
1181 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_1000 ; // The same for another address
1182 77 mihad
                end
1183
                4'h7: // w_reg_select_dec bit 16
1184
                begin
1185
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1186
                                                                                                                         pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1187
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1188
                w_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
1189 132 mihad
                        w_reg_select_dec = 57'h000_0000_0001_0000 ; // The same for another address
1190 77 mihad
                end
1191
                4'h8: // w_reg_select_dec bit 20
1192
                begin
1193
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1194
                                                                                                                         pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1195
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1196
                w_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
1197 132 mihad
                        w_reg_select_dec = 57'h000_0000_0010_0000 ; // The same for another address
1198 77 mihad
                end
1199
                4'h9: // w_reg_select_dec bit 24
1200
                begin
1201
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1202
                                                                                                                         pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1203
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1204
                w_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
1205 132 mihad
                        w_reg_select_dec = 57'h000_0000_0100_0000 ; // The same for another address
1206 77 mihad
                end
1207 132 mihad
    `ifdef PCI_CPCI_HS_IMPLEMENT
1208
        4'hD:
1209
        begin
1210
            w_conf_data_out  = {24'h0000_00, `PCI_CAP_PTR_VAL} ;
1211
            w_reg_select_dec = 57'h000_0000_0000_0000 ; // Read-Only register
1212
        end
1213
    `endif
1214 77 mihad
                4'hf: // w_reg_select_dec bit 2
1215
                begin
1216
                        w_conf_data_out = { r_max_lat, r_min_gnt, r_interrupt_pin, interrupt_line } ;
1217 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0004 ;
1218 77 mihad
                end
1219
                default :
1220
                begin
1221
                        w_conf_data_out = 32'h0000_0000 ;
1222 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ;
1223 77 mihad
                end
1224
                endcase
1225
          end
1226
          default :
1227
          begin
1228 132 mihad
      `ifdef PCI_CPCI_HS_IMPLEMENT
1229
        if ( (w_conf_address_in[7:0] >> 2) == ((`PCI_CAP_PTR_VAL) >> 2) )
1230
        begin
1231
            w_reg_select_dec = 57'h100_0000_0000_0000 ;
1232
            w_conf_data_out  = {8'h00, hs_ins, hs_ext, hs_pi, hs_loo, 1'b0, hs_eim, 1'b0, 8'h00, hs_cap_id} ;
1233
        end
1234
        else
1235
        begin
1236
            w_reg_select_dec = 57'h000_0000_0000_0000 ;
1237
            w_conf_data_out = 32'h0000_0000 ;
1238
        end
1239
      `else
1240 77 mihad
            w_conf_data_out = 32'h0000_0000 ;
1241 132 mihad
                w_reg_select_dec = 57'h000_0000_0000_0000 ;
1242
      `endif
1243 77 mihad
          end
1244
          endcase
1245
        end
1246
        default :
1247
        begin
1248
                // PCI target - configuration space
1249
                case (w_conf_address_in[7:2])
1250
                `P_IMG_CTRL0_ADDR:  // w_reg_select_dec bit 3
1251
                begin
1252
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl0_bit2_1, 1'h0 } ;
1253 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0008 ;
1254 77 mihad
                end
1255
        `P_BA0_ADDR:   // w_reg_select_dec bit 4
1256
                begin
1257
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1258
                                                                                                                         pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1259
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1260
                w_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
1261 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0010 ; // The same for another address
1262 77 mihad
                end
1263
        `P_AM0_ADDR:   // w_reg_select_dec bit 5
1264
                begin
1265
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1266
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1267 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0020 ;
1268 77 mihad
                end
1269
        `P_TA0_ADDR:   // w_reg_select_dec bit 6
1270
                begin
1271
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1272
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1273 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0040 ;
1274 77 mihad
                end
1275
        `P_IMG_CTRL1_ADDR:   // w_reg_select_dec bit 7
1276
                begin
1277
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl1_bit2_1, 1'h0 } ;
1278 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0080 ;
1279 77 mihad
                end
1280
        `P_BA1_ADDR:   // w_reg_select_dec bit 8
1281
                begin
1282
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1283
                                                                                                                         pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1284
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1285
                w_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
1286 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0100 ; // The same for another address
1287 77 mihad
                end
1288
        `P_AM1_ADDR:   // w_reg_select_dec bit 9
1289
                begin
1290
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1291
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1292 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0200 ;
1293 77 mihad
                end
1294
        `P_TA1_ADDR:   // w_reg_select_dec bit 10
1295
                begin
1296
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1297
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1298 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0400 ;
1299 77 mihad
                end
1300
        `P_IMG_CTRL2_ADDR:   // w_reg_select_dec bit 11
1301
                begin
1302
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl2_bit2_1, 1'h0 } ;
1303 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0800 ;
1304 77 mihad
                end
1305
        `P_BA2_ADDR:   // w_reg_select_dec bit 12
1306
                begin
1307
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1308
                                                                                                                         pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1309
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1310
                w_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
1311 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_1000 ; // The same for another address
1312 77 mihad
                end
1313
        `P_AM2_ADDR:   // w_reg_select_dec bit 13
1314
                begin
1315
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1316
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1317 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_2000 ;
1318 77 mihad
                end
1319
        `P_TA2_ADDR:   // w_reg_select_dec bit 14
1320
                begin
1321
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1322
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1323 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_4000 ;
1324 77 mihad
                end
1325
        `P_IMG_CTRL3_ADDR:   // w_reg_select_dec bit 15
1326
                begin
1327
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl3_bit2_1, 1'h0 } ;
1328 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_8000 ;
1329 77 mihad
                end
1330
        `P_BA3_ADDR:   // w_reg_select_dec bit 16
1331
                begin
1332
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1333
                                                                                                                         pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1334
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1335
                w_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
1336 132 mihad
                        w_reg_select_dec = 57'h000_0000_0001_0000 ; // The same for another address
1337 77 mihad
                end
1338
        `P_AM3_ADDR:   // w_reg_select_dec bit 17
1339
                begin
1340
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1341
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1342 132 mihad
                        w_reg_select_dec = 57'h000_0000_0002_0000 ;
1343 77 mihad
                end
1344
        `P_TA3_ADDR:   // w_reg_select_dec bit 18
1345
                begin
1346
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1347
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1348 132 mihad
                        w_reg_select_dec = 57'h000_0000_0004_0000 ;
1349 77 mihad
                end
1350
        `P_IMG_CTRL4_ADDR:   // w_reg_select_dec bit 19
1351
                begin
1352
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl4_bit2_1, 1'h0 } ;
1353 132 mihad
                        w_reg_select_dec = 57'h000_0000_0008_0000 ;
1354 77 mihad
                end
1355
        `P_BA4_ADDR:   // w_reg_select_dec bit 20
1356
                begin
1357
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1358
                                                                                                                         pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1359
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1360
                w_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
1361 132 mihad
                        w_reg_select_dec = 57'h000_0000_0010_0000 ; // The same for another address
1362 77 mihad
                end
1363
        `P_AM4_ADDR:   // w_reg_select_dec bit 21
1364
                begin
1365
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1366
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1367 132 mihad
                        w_reg_select_dec = 57'h000_0000_0020_0000 ;
1368 77 mihad
                end
1369
        `P_TA4_ADDR:   // w_reg_select_dec bit 22
1370
                begin
1371
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1372
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1373 132 mihad
                        w_reg_select_dec = 57'h000_0000_0040_0000 ;
1374 77 mihad
                end
1375
        `P_IMG_CTRL5_ADDR:   // w_reg_select_dec bit 23
1376
                begin
1377
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl5_bit2_1, 1'h0 } ;
1378 132 mihad
                        w_reg_select_dec = 57'h000_0000_0080_0000 ;
1379 77 mihad
                end
1380
        `P_BA5_ADDR:   // w_reg_select_dec bit 24
1381
                begin
1382
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1383
                                                                                                                         pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1384
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1385
                w_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
1386 132 mihad
                        w_reg_select_dec = 57'h000_0000_0100_0000 ; // The same for another address
1387 77 mihad
                end
1388
        `P_AM5_ADDR:   // w_reg_select_dec bit 25
1389
                begin
1390
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1391
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1392 132 mihad
                        w_reg_select_dec = 57'h000_0000_0200_0000 ;
1393 77 mihad
                end
1394
        `P_TA5_ADDR:   // w_reg_select_dec bit 26
1395
                begin
1396
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1397
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1398 132 mihad
                        w_reg_select_dec = 57'h000_0000_0400_0000 ;
1399 77 mihad
                end
1400
        `P_ERR_CS_ADDR:   // w_reg_select_dec bit 27
1401
                begin
1402
                        w_conf_data_out = { pci_err_cs_bit31_24, 13'h0000, pci_err_cs_bit10, pci_err_cs_bit9,
1403
                                                                                   pci_err_cs_bit8, 7'h00, pci_err_cs_bit0 } ;
1404 132 mihad
                        w_reg_select_dec = 57'h000_0000_0800_0000 ;
1405 77 mihad
                end
1406
        `P_ERR_ADDR_ADDR:   // w_reg_select_dec bit 28
1407
                begin
1408
                        w_conf_data_out = pci_err_addr ;
1409 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ; // = 56'h00_0000_1000_0000 ;
1410 77 mihad
                end
1411
        `P_ERR_DATA_ADDR:   // w_reg_select_dec bit 29
1412
                begin
1413
                        w_conf_data_out = pci_err_data ;
1414 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ; // = 56'h00_0000_2000_0000 ;
1415 77 mihad
                end
1416
                // WB slave - configuration space
1417
                `WB_CONF_SPC_BAR_ADDR:
1418
                begin
1419
                        w_conf_data_out = { wb_ba0_bit31_12, 11'h000, wb_ba0_bit0 } ;
1420 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ; // Read-Only register
1421 77 mihad
                end
1422
                `W_IMG_CTRL1_ADDR:   // w_reg_select_dec bit 30
1423
                begin
1424
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl1_bit2_0 } ;
1425 132 mihad
                        w_reg_select_dec = 57'h000_0000_4000_0000 ;
1426 77 mihad
                end
1427
                `W_BA1_ADDR:   // w_reg_select_dec bit 31
1428
                begin
1429
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1430
                                                                                                                        wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1431
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1432
                w_conf_data_out[0] = wb_ba1_bit0 ;
1433 132 mihad
                        w_reg_select_dec = 57'h000_0000_8000_0000 ;
1434 77 mihad
                end
1435
                `W_AM1_ADDR:   // w_reg_select_dec bit 32
1436
                begin
1437
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1438
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1439 132 mihad
                        w_reg_select_dec = 57'h000_0001_0000_0000 ;
1440 77 mihad
                end
1441
                `W_TA1_ADDR:   // w_reg_select_dec bit 33
1442
                begin
1443
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1444
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1445 132 mihad
                        w_reg_select_dec = 57'h000_0002_0000_0000 ;
1446 77 mihad
                end
1447
                `W_IMG_CTRL2_ADDR:   // w_reg_select_dec bit 34
1448
                begin
1449
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl2_bit2_0 } ;
1450 132 mihad
                        w_reg_select_dec = 57'h000_0004_0000_0000 ;
1451 77 mihad
                end
1452
                `W_BA2_ADDR:   // w_reg_select_dec bit 35
1453
                begin
1454
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1455
                                                                                                                        wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1456
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1457
                w_conf_data_out[0] = wb_ba2_bit0 ;
1458 132 mihad
                        w_reg_select_dec = 57'h000_0008_0000_0000 ;
1459 77 mihad
                end
1460
                `W_AM2_ADDR:   // w_reg_select_dec bit 36
1461
                begin
1462
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1463
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1464 132 mihad
                        w_reg_select_dec = 57'h000_0010_0000_0000 ;
1465 77 mihad
                end
1466
                `W_TA2_ADDR:   // w_reg_select_dec bit 37
1467
                begin
1468
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1469
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1470 132 mihad
                        w_reg_select_dec = 57'h000_0020_0000_0000 ;
1471 77 mihad
                end
1472
                `W_IMG_CTRL3_ADDR:   // w_reg_select_dec bit 38
1473
                begin
1474
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl3_bit2_0 } ;
1475 132 mihad
                        w_reg_select_dec = 57'h000_0040_0000_0000 ;
1476 77 mihad
                end
1477
                `W_BA3_ADDR:   // w_reg_select_dec bit 39
1478
                begin
1479
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1480
                                                                                                                        wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1481
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1482
                w_conf_data_out[0] = wb_ba3_bit0 ;
1483 132 mihad
                        w_reg_select_dec = 57'h000_0080_0000_0000 ;
1484 77 mihad
                end
1485
                `W_AM3_ADDR:   // w_reg_select_dec bit 40
1486
                begin
1487
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1488
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1489 132 mihad
                        w_reg_select_dec = 57'h000_0100_0000_0000 ;
1490 77 mihad
                end
1491
                `W_TA3_ADDR:   // w_reg_select_dec bit 41
1492
                begin
1493
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1494
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1495 132 mihad
                        w_reg_select_dec = 57'h000_0200_0000_0000 ;
1496 77 mihad
                end
1497
                `W_IMG_CTRL4_ADDR:   // w_reg_select_dec bit 42
1498
                begin
1499
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl4_bit2_0 } ;
1500 132 mihad
                        w_reg_select_dec = 57'h000_0400_0000_0000 ;
1501 77 mihad
                end
1502
                `W_BA4_ADDR:   // w_reg_select_dec bit 43
1503
                begin
1504
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1505
                                                                                                                        wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1506
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1507
                w_conf_data_out[0] = wb_ba4_bit0 ;
1508 132 mihad
                        w_reg_select_dec = 57'h000_0800_0000_0000 ;
1509 77 mihad
                end
1510
                `W_AM4_ADDR:   // w_reg_select_dec bit 44
1511
                begin
1512
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1513
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1514 132 mihad
                        w_reg_select_dec = 57'h000_1000_0000_0000 ;
1515 77 mihad
                end
1516
                `W_TA4_ADDR:   // w_reg_select_dec bit 45
1517
                begin
1518
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1519
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1520 132 mihad
                        w_reg_select_dec = 57'h000_2000_0000_0000 ;
1521 77 mihad
                end
1522
                `W_IMG_CTRL5_ADDR:   // w_reg_select_dec bit 46
1523
                begin
1524
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl5_bit2_0 } ;
1525 132 mihad
                        w_reg_select_dec = 57'h000_4000_0000_0000 ;
1526 77 mihad
                end
1527
                `W_BA5_ADDR:   // w_reg_select_dec bit 47
1528
                begin
1529
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1530
                                                                                                                        wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1531
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1532
                w_conf_data_out[0] = wb_ba5_bit0 ;
1533 132 mihad
                        w_reg_select_dec = 57'h000_8000_0000_0000 ;
1534 77 mihad
                end
1535
                `W_AM5_ADDR:   // w_reg_select_dec bit 48
1536
                begin
1537
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1538
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1539 132 mihad
                        w_reg_select_dec = 57'h001_0000_0000_0000 ;
1540 77 mihad
                end
1541
                `W_TA5_ADDR:   // w_reg_select_dec bit 49
1542
                begin
1543
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1544
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1545 132 mihad
                        w_reg_select_dec = 57'h002_0000_0000_0000 ;
1546 77 mihad
                end
1547
                `W_ERR_CS_ADDR:   // w_reg_select_dec bit 50
1548
                begin
1549
                        w_conf_data_out = { wb_err_cs_bit31_24, /*13*/14'h0000, /*wb_err_cs_bit10,*/
1550
                                                                                   wb_err_cs_bit9, wb_err_cs_bit8, 7'h00, wb_err_cs_bit0 } ;
1551 132 mihad
                        w_reg_select_dec = 57'h004_0000_0000_0000 ;
1552 77 mihad
                end
1553
                `W_ERR_ADDR_ADDR:   // w_reg_select_dec bit 51
1554
                begin
1555
                        w_conf_data_out = wb_err_addr ;
1556 132 mihad
                        w_reg_select_dec = 57'h008_0000_0000_0000 ;
1557 77 mihad
                end
1558
                `W_ERR_DATA_ADDR:   // w_reg_select_dec bit 52
1559
                begin
1560
                        w_conf_data_out = wb_err_data ;
1561 132 mihad
                        w_reg_select_dec = 57'h010_0000_0000_0000 ;
1562 77 mihad
                end
1563
                `CNF_ADDR_ADDR:   // w_reg_select_dec bit 53
1564
                begin
1565
                        w_conf_data_out = { 8'h00, cnf_addr_bit23_2, 1'h0, cnf_addr_bit0 } ;
1566 132 mihad
                        w_reg_select_dec = 57'h020_0000_0000_0000 ;
1567 77 mihad
                end
1568
                // `CNF_DATA_ADDR: implemented elsewhere !!!
1569
                // `INT_ACK_ADDR: implemented elsewhere !!!
1570
        `ICR_ADDR:   // w_reg_select_dec bit 54
1571
                begin
1572
                        w_conf_data_out = { icr_bit31, 26'h0000_000, icr_bit4_3, icr_bit2_0 } ;
1573 132 mihad
                        w_reg_select_dec = 57'h040_0000_0000_0000 ;
1574 77 mihad
                end
1575
        `ISR_ADDR:   // w_reg_select_dec bit 55
1576
                begin
1577
                        w_conf_data_out = { 27'h0000_000, isr_bit4_3, isr_bit2_0 } ;
1578 132 mihad
                        w_reg_select_dec = 57'h080_0000_0000_0000 ;
1579 77 mihad
                end
1580
                default:
1581
                begin
1582
                        w_conf_data_out = 32'h0000_0000 ;
1583 132 mihad
                        w_reg_select_dec = 57'h000_0000_0000_0000 ;
1584 77 mihad
                end
1585
                endcase
1586
        end
1587
        endcase
1588
end
1589
 
1590
// Reduced write data for BASE, MASK and TRANSLATION registers of PCI and WB images
1591
assign  w_conf_pdata_reduced[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)]        = w_conf_data_in[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1592
assign  w_conf_pdata_reduced[(31-`PCI_NUM_OF_DEC_ADDR_LINES): 0] = 0 ;
1593
assign  w_conf_wdata_reduced[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = w_conf_data_in[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1594
assign  w_conf_wdata_reduced[(31-`WB_NUM_OF_DEC_ADDR_LINES): 0]  = 0 ;
1595
 
1596
always@(posedge w_clock or posedge reset)
1597
begin
1598
        // Here are implemented all registers that are reset with RESET signal otherwise they can be normaly written!!!
1599
        // Registers that are commented are implemented after this alwasy statement, because they are e.g. reset with
1600
        //   RESET signal, set with some status signal and they are erased with writting '1' into them !!!
1601
        if (reset)
1602
        begin
1603
                /*status_bit15_11 ; status_bit8 ;*/ command_bit8 <= 1'h0 ; command_bit6 <= 1'h0 ; command_bit2_0 <= 3'h0 ;
1604
                latency_timer <= 8'h00 ; cache_line_size_reg <= 8'h00 ;
1605
                // ALL pci_base address registers are the same as pci_baX registers !
1606
                interrupt_line <= 8'h00 ;
1607
 
1608
                `ifdef          HOST
1609
                  `ifdef        NO_CNF_IMAGE    // if PCI bridge is HOST and IMAGE0 is assigned as general image space
1610
                        `ifdef  PCI_IMAGE0
1611
                                        pci_img_ctrl0_bit2_1 <= 2'h0 ;
1612
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1613
                                        pci_ba0_bit0 <= `PCI_BA0_MEM_IO ;
1614
                                        pci_am0 <= `PCI_AM0 ;
1615
                                        pci_ta0 <= 20'h0000_0 ;
1616
                        `endif
1617
                  `else
1618
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1619
                  `endif
1620
                `else // GUEST
1621
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1622
                `endif
1623
 
1624
                pci_img_ctrl1_bit2_1 <= 2'h0 ;
1625
                pci_ba1_bit31_12 <= 20'h0000_0 ;
1626
        `ifdef  HOST
1627
                pci_ba1_bit0 <= `PCI_BA1_MEM_IO ;
1628
        `endif
1629
                pci_am1 <= `PCI_AM1;
1630
                pci_ta1 <= 20'h0000_0 ;
1631
                `ifdef  PCI_IMAGE2
1632
                                pci_img_ctrl2_bit2_1 <= 2'h0 ;
1633
                                        pci_ba2_bit31_12 <= 20'h0000_0 ;
1634
                        `ifdef  HOST
1635
                                        pci_ba2_bit0 <= `PCI_BA2_MEM_IO ;
1636
                        `endif
1637
                                        pci_am2 <= `PCI_AM2;
1638
                                        pci_ta2 <= 20'h0000_0 ;
1639
                `endif
1640
                `ifdef  PCI_IMAGE3
1641
                                        pci_img_ctrl3_bit2_1 <= 2'h0 ;
1642
                                pci_ba3_bit31_12 <= 20'h0000_0 ;
1643
                `ifdef  HOST
1644
                                pci_ba3_bit0 <= `PCI_BA3_MEM_IO ;
1645
                `endif
1646
                                pci_am3 <= `PCI_AM3;
1647
                                        pci_ta3 <= 20'h0000_0 ;
1648
                `endif
1649
                `ifdef  PCI_IMAGE4
1650
                                        pci_img_ctrl4_bit2_1 <= 2'h0 ;
1651
                                        pci_ba4_bit31_12 <= 20'h0000_0 ;
1652
                        `ifdef  HOST
1653
                                        pci_ba4_bit0 <= `PCI_BA4_MEM_IO ;
1654
                        `endif
1655
                                        pci_am4 <= `PCI_AM4;
1656
                                        pci_ta4 <= 20'h0000_0 ;
1657
                `endif
1658
                `ifdef  PCI_IMAGE5
1659
                                        pci_img_ctrl5_bit2_1 <= 2'h0 ;
1660
                                        pci_ba5_bit31_12 <= 20'h0000_0 ;
1661
                        `ifdef  HOST
1662
                                        pci_ba5_bit0 <= `PCI_BA5_MEM_IO ;
1663
                        `endif
1664
                                        pci_am5 <= `PCI_AM5;
1665
                                        pci_ta5 <= 20'h0000_0 ;
1666
                `endif
1667
                /*pci_err_cs_bit31_24 ; pci_err_cs_bit10; pci_err_cs_bit9 ; pci_err_cs_bit8 ;*/ pci_err_cs_bit0 <= 1'h0 ;
1668
                /*pci_err_addr ;*/
1669
        /*pci_err_data ;*/
1670
                //
1671
                wb_img_ctrl1_bit2_0 <= 3'h0 ;
1672
                wb_ba1_bit31_12 <= 20'h0000_0 ; wb_ba1_bit0 <= 1'h0 ;
1673
                wb_am1 <= 20'h0000_0 ;
1674
                wb_ta1 <= 20'h0000_0 ;
1675
        `ifdef  WB_IMAGE2
1676
                                        wb_img_ctrl2_bit2_0 <= 3'h0 ;
1677
                                        wb_ba2_bit31_12 <= 20'h0000_0 ; wb_ba2_bit0 <= 1'h0 ;
1678
                                        wb_am2 <= 20'h0000_0 ;
1679
                                        wb_ta2 <= 20'h0000_0 ;
1680
                `endif
1681
                `ifdef  WB_IMAGE3
1682
                                        wb_img_ctrl3_bit2_0 <= 3'h0 ;
1683
                                        wb_ba3_bit31_12 <= 20'h0000_0 ; wb_ba3_bit0 <= 1'h0 ;
1684
                                        wb_am3 <= 20'h0000_0 ;
1685
                                        wb_ta3 <= 20'h0000_0 ;
1686
                `endif
1687
                `ifdef  WB_IMAGE4
1688
                                        wb_img_ctrl4_bit2_0 <= 3'h0 ;
1689
                                        wb_ba4_bit31_12 <= 20'h0000_0 ; wb_ba4_bit0 <= 1'h0 ;
1690
                                        wb_am4 <= 20'h0000_0 ;
1691
                                        wb_ta4 <= 20'h0000_0 ;
1692
                `endif
1693
                `ifdef  WB_IMAGE5
1694
                                        wb_img_ctrl5_bit2_0 <= 3'h0 ;
1695
                                wb_ba5_bit31_12 <= 20'h0000_0 ; wb_ba5_bit0 <= 1'h0 ;
1696
                                        wb_am5 <= 20'h0000_0 ;
1697
                                        wb_ta5 <= 20'h0000_0 ;
1698
                `endif
1699
                /*wb_err_cs_bit31_24 ; wb_err_cs_bit10 ; wb_err_cs_bit9 ; wb_err_cs_bit8 ;*/ wb_err_cs_bit0 <= 1'h0 ;
1700
                /*wb_err_addr ;*/
1701
                /*wb_err_data ;*/
1702
 
1703
                `ifdef          HOST
1704
                cnf_addr_bit23_2 <= 22'h0000_00 ; cnf_addr_bit0 <= 1'h0 ;
1705
                `endif
1706
 
1707
                icr_bit31 <= 1'h0 ;
1708
                `ifdef  HOST
1709
                        icr_bit2_0 <= 3'h0 ;
1710
                        icr_bit4_3 <= 2'h0 ;
1711
                `else
1712
                        icr_bit2_0[2:0] <= 3'h0 ;
1713
                `endif
1714
                /*isr_bit4_3 ; isr_bit2_0 ;*/
1715 132 mihad
 
1716
        // Not register bit; used only internally after reset!
1717
        init_complete <= 1'b0 ;
1718
 
1719
    `ifdef GUEST
1720
        rst_inactive_sync <= 1'b0 ;
1721
        rst_inactive      <= 1'b0 ;
1722
    `endif
1723
 
1724
        `ifdef PCI_CPCI_HS_IMPLEMENT
1725
            /*hs_ins hs_ext*/ hs_loo <= 1'b0; hs_eim <= 1'b0;
1726
            // Not register bits; used only internally after reset!
1727
            /*hs_ins_armed hs_ext_armed*/
1728
        `endif
1729 77 mihad
        end
1730
/* -----------------------------------------------------------------------------------------------------------
1731
Following register bits should have asynchronous RESET & SET! That is why they are IMPLEMENTED separately
1732
after this ALWAYS block!!! (for every register bit, there are two D-FF implemented)
1733
                status_bit15_11[15] <= 1'b1 ;
1734
                status_bit15_11[14] <= 1'b1 ;
1735
                status_bit15_11[13] <= 1'b1 ;
1736
                status_bit15_11[12] <= 1'b1 ;
1737
                status_bit15_11[11] <= 1'b1 ;
1738
                status_bit8 <= 1'b1 ;
1739
                pci_err_cs_bit10 <= 1'b1 ;
1740
                pci_err_cs_bit9 <= 1'b1 ;
1741
                pci_err_cs_bit8 <= 1'b1 ;
1742
                pci_err_cs_bit31_24 <= { pci_error_be, pci_error_bc } ;
1743
                pci_err_addr <= pci_error_addr ;
1744
                pci_err_data <= pci_error_data ;
1745
                wb_err_cs_bit10 <= 1'b1 ;
1746
                wb_err_cs_bit9 <= 1'b1 ;
1747
                wb_err_cs_bit8 <= 1'b1 ;
1748
                wb_err_cs_bit31_24 <= { wb_error_be, wb_error_bc } ;
1749
                wb_err_addr <= wb_error_addr ;
1750
                wb_err_data <= wb_error_data ;
1751
                isr_bit4_0[4] <= 1'b1 & icr_bit4_0[4] ;
1752
                isr_bit4_0[3] <= 1'b1 & icr_bit4_0[3] ;
1753
                isr_bit4_0[2] <= 1'b1 & icr_bit4_0[2] ;
1754
                isr_bit4_0[1] <= 1'b1 & icr_bit4_0[1] ;
1755
                isr_bit4_0[0] <= 1'b1 & icr_bit4_0[0] ;
1756 132 mihad
 
1757
        hs_ins; hs_ext;
1758 77 mihad
-----------------------------------------------------------------------------------------------------------*/
1759
        // Here follows normal writting to registers (only to their valid bits) !
1760
        else
1761
        begin
1762
                if (w_we)
1763
                begin
1764
                                // PCI header - configuration space
1765
                                if (w_reg_select_dec[0]) // w_conf_address_in[5:2] = 4'h1:
1766
                                begin
1767
                                        if (~w_byte_en[1])
1768
                                                command_bit8 <= w_conf_data_in[8] ;
1769
                                        if (~w_byte_en[0])
1770
                                        begin
1771
                                                command_bit6 <= w_conf_data_in[6] ;
1772
                                                command_bit2_0 <= w_conf_data_in[2:0] ;
1773
                                        end
1774
                                end
1775
                                if (w_reg_select_dec[1]) // w_conf_address_in[5:2] = 4'h3:
1776
                                begin
1777
                                        if (~w_byte_en[1])
1778
                                                latency_timer <= w_conf_data_in[15:8] ;
1779
                                        if (~w_byte_en[0])
1780
                                                cache_line_size_reg <= w_conf_data_in[7:0] ;
1781
                                end
1782
//                  if (w_reg_select_dec[4]) // w_conf_address_in[5:2] = 4'h4:
1783
//                              Also used with IMAGE0
1784
 
1785
//                  if (w_reg_select_dec[8]) // w_conf_address_in[5:2] = 4'h5:
1786
//                              Also used with IMAGE1
1787
 
1788
//                  if (w_reg_select_dec[12]) // w_conf_address_in[5:2] = 4'h6:
1789
//                              Also used with IMAGE2
1790
 
1791
//                  if (w_reg_select_dec[16]) // w_conf_address_in[5:2] = 4'h7:
1792
//                              Also used with IMAGE3
1793
 
1794
//                  if (w_reg_select_dec[20]) // w_conf_address_in[5:2] = 4'h8:
1795
//                              Also used with IMAGE4
1796
 
1797
//                  if (w_reg_select_dec[24]) // w_conf_address_in[5:2] = 4'h9:
1798
//                              Also used with IMAGE5 and IMAGE6
1799
                                if (w_reg_select_dec[2]) // w_conf_address_in[5:2] = 4'hf:
1800
                                begin
1801
                                        if (~w_byte_en[0])
1802
                                                interrupt_line <= w_conf_data_in[7:0] ;
1803
                                end
1804
                                // PCI target - configuration space
1805
`ifdef          HOST
1806
  `ifdef        NO_CNF_IMAGE
1807
        `ifdef  PCI_IMAGE0      // if PCI bridge is HOST and IMAGE0 is assigned as general image space
1808
                                if (w_reg_select_dec[3]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL0_ADDR:
1809
                                begin
1810
                                        if (~w_byte_en[0])
1811
                                                pci_img_ctrl0_bit2_1 <= w_conf_data_in[2:1] ;
1812
                                end
1813
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1814
                                begin
1815
                                        if (~w_byte_en[3])
1816
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1817
                                        if (~w_byte_en[2])
1818
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1819
                                        if (~w_byte_en[1])
1820
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1821
                                        if (~w_byte_en[0])
1822
                                                pci_ba0_bit0 <= w_conf_data_in[0] ;
1823
                                end
1824
                    if (w_reg_select_dec[5]) // case (w_conf_address_in[7:2]) = `P_AM0_ADDR:
1825
                                begin
1826
                                        if (~w_byte_en[3])
1827
                                                pci_am0[31:24] <= w_conf_pdata_reduced[31:24] ;
1828
                                        if (~w_byte_en[2])
1829
                                                pci_am0[23:16] <= w_conf_pdata_reduced[23:16] ;
1830
                                        if (~w_byte_en[1])
1831
                                                pci_am0[15:12] <= w_conf_pdata_reduced[15:12] ;
1832
                                end
1833
                    if (w_reg_select_dec[6]) // case (w_conf_address_in[7:2]) = `P_TA0_ADDR:
1834
                                begin
1835
                                        if (~w_byte_en[3])
1836
                                                pci_ta0[31:24] <= w_conf_pdata_reduced[31:24] ;
1837
                                        if (~w_byte_en[2])
1838
                                                pci_ta0[23:16] <= w_conf_pdata_reduced[23:16] ;
1839
                                        if (~w_byte_en[1])
1840
                                                pci_ta0[15:12] <= w_conf_pdata_reduced[15:12] ;
1841
                                end
1842
        `endif
1843
  `else
1844
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1845
                                begin
1846
                                        if (~w_byte_en[3])
1847
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1848
                                        if (~w_byte_en[2])
1849
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1850
                                        if (~w_byte_en[1])
1851
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1852
                                end
1853
  `endif
1854
`else // GUEST
1855
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1856
                                begin
1857
                                        if (~w_byte_en[3])
1858
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1859
                                        if (~w_byte_en[2])
1860
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1861
                                        if (~w_byte_en[1])
1862
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1863
                                end
1864
`endif
1865
                    if (w_reg_select_dec[7]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL1_ADDR:
1866
                                begin
1867
                                        if (~w_byte_en[0])
1868
                                                pci_img_ctrl1_bit2_1 <= w_conf_data_in[2:1] ;
1869
                                end
1870
                    if (w_reg_select_dec[8]) // case (w_conf_address_in[7:2]) = `P_BA1_ADDR:
1871
                                begin
1872
                                        if (~w_byte_en[3])
1873
                                                pci_ba1_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1874
                                        if (~w_byte_en[2])
1875
                                                pci_ba1_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1876
                                        if (~w_byte_en[1])
1877
                                                pci_ba1_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1878
        `ifdef  HOST
1879
                                        if (~w_byte_en[0])
1880
                                                pci_ba1_bit0 <= w_conf_data_in[0] ;
1881
        `endif
1882
                                end
1883
                    if (w_reg_select_dec[9]) // case (w_conf_address_in[7:2]) = `P_AM1_ADDR:
1884
                                begin
1885
                                        if (~w_byte_en[3])
1886
                                                pci_am1[31:24] <= w_conf_pdata_reduced[31:24] ;
1887
                                        if (~w_byte_en[2])
1888
                                                pci_am1[23:16] <= w_conf_pdata_reduced[23:16] ;
1889
                                        if (~w_byte_en[1])
1890
                                                pci_am1[15:12] <= w_conf_pdata_reduced[15:12] ;
1891
                                end
1892
                    if (w_reg_select_dec[10]) // case (w_conf_address_in[7:2]) = `P_TA1_ADDR:
1893
                                begin
1894
                                        if (~w_byte_en[3])
1895
                                                pci_ta1[31:24] <= w_conf_pdata_reduced[31:24] ;
1896
                                        if (~w_byte_en[2])
1897
                                                pci_ta1[23:16] <= w_conf_pdata_reduced[23:16] ;
1898
                                        if (~w_byte_en[1])
1899
                                                pci_ta1[15:12] <= w_conf_pdata_reduced[15:12] ;
1900
                                end
1901
`ifdef          PCI_IMAGE2
1902
                    if (w_reg_select_dec[11]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL2_ADDR:
1903
                                begin
1904
                                        if (~w_byte_en[0])
1905
                                                pci_img_ctrl2_bit2_1 <= w_conf_data_in[2:1] ;
1906
                                end
1907
                    if (w_reg_select_dec[12]) // case (w_conf_address_in[7:2]) = `P_BA2_ADDR:
1908
                                begin
1909
                                        if (~w_byte_en[3])
1910
                                                pci_ba2_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1911
                                        if (~w_byte_en[2])
1912
                                                pci_ba2_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1913
                                        if (~w_byte_en[1])
1914
                                                pci_ba2_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1915
        `ifdef  HOST
1916
                                        if (~w_byte_en[0])
1917
                                                pci_ba2_bit0 <= w_conf_data_in[0] ;
1918
        `endif
1919
                                end
1920
                    if (w_reg_select_dec[13]) // case (w_conf_address_in[7:2]) = `P_AM2_ADDR:
1921
                                begin
1922
                                        if (~w_byte_en[3])
1923
                                                pci_am2[31:24] <= w_conf_pdata_reduced[31:24] ;
1924
                                        if (~w_byte_en[2])
1925
                                                pci_am2[23:16] <= w_conf_pdata_reduced[23:16] ;
1926
                                        if (~w_byte_en[1])
1927
                                                pci_am2[15:12] <= w_conf_pdata_reduced[15:12] ;
1928
                                end
1929
                    if (w_reg_select_dec[14]) // case (w_conf_address_in[7:2]) = `P_TA2_ADDR:
1930
                                begin
1931
                                        if (~w_byte_en[3])
1932
                                                pci_ta2[31:24] <= w_conf_pdata_reduced[31:24] ;
1933
                                        if (~w_byte_en[2])
1934
                                                pci_ta2[23:16] <= w_conf_pdata_reduced[23:16] ;
1935
                                        if (~w_byte_en[1])
1936
                                                pci_ta2[15:12] <= w_conf_pdata_reduced[15:12] ;
1937
                                end
1938
`endif
1939
`ifdef          PCI_IMAGE3
1940
                    if (w_reg_select_dec[15]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL3_ADDR:
1941
                                begin
1942
                                        if (~w_byte_en[0])
1943
                                                pci_img_ctrl3_bit2_1 <= w_conf_data_in[2:1] ;
1944
                                end
1945
                    if (w_reg_select_dec[16]) // case (w_conf_address_in[7:2]) = `P_BA3_ADDR:
1946
                                begin
1947
                                        if (~w_byte_en[3])
1948
                                                pci_ba3_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1949
                                        if (~w_byte_en[2])
1950
                                                pci_ba3_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1951
                                        if (~w_byte_en[1])
1952
                                                pci_ba3_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1953
        `ifdef  HOST
1954
                                        if (~w_byte_en[0])
1955
                                                pci_ba3_bit0 <= w_conf_data_in[0] ;
1956
        `endif
1957
                                end
1958
                    if (w_reg_select_dec[17]) // case (w_conf_address_in[7:2]) = `P_AM3_ADDR:
1959
                                begin
1960
                                        if (~w_byte_en[3])
1961
                                                pci_am3[31:24] <= w_conf_pdata_reduced[31:24] ;
1962
                                        if (~w_byte_en[2])
1963
                                                pci_am3[23:16] <= w_conf_pdata_reduced[23:16] ;
1964
                                        if (~w_byte_en[1])
1965
                                                pci_am3[15:12] <= w_conf_pdata_reduced[15:12] ;
1966
                                end
1967
                    if (w_reg_select_dec[18]) // case (w_conf_address_in[7:2]) = `P_TA3_ADDR:
1968
                                begin
1969
                                        if (~w_byte_en[3])
1970
                                                pci_ta3[31:24] <= w_conf_pdata_reduced[31:24] ;
1971
                                        if (~w_byte_en[2])
1972
                                                pci_ta3[23:16] <= w_conf_pdata_reduced[23:16] ;
1973
                                        if (~w_byte_en[1])
1974
                                                pci_ta3[15:12] <= w_conf_pdata_reduced[15:12] ;
1975
                                end
1976
`endif
1977
`ifdef          PCI_IMAGE4
1978
                    if (w_reg_select_dec[19]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL4_ADDR:
1979
                                begin
1980
                                        if (~w_byte_en[0])
1981
                                                pci_img_ctrl4_bit2_1 <= w_conf_data_in[2:1] ;
1982
                                end
1983
                    if (w_reg_select_dec[20]) // case (w_conf_address_in[7:2]) = `P_BA4_ADDR:
1984
                                begin
1985
                                        if (~w_byte_en[3])
1986
                                                pci_ba4_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1987
                                        if (~w_byte_en[2])
1988
                                                pci_ba4_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1989
                                        if (~w_byte_en[1])
1990
                                                pci_ba4_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1991
        `ifdef  HOST
1992
                                        if (~w_byte_en[0])
1993
                                                pci_ba4_bit0 <= w_conf_data_in[0] ;
1994
        `endif
1995
                                end
1996
                    if (w_reg_select_dec[21]) // case (w_conf_address_in[7:2]) = `P_AM4_ADDR:
1997
                                begin
1998
                                        if (~w_byte_en[3])
1999
                                                pci_am4[31:24] <= w_conf_pdata_reduced[31:24] ;
2000
                                        if (~w_byte_en[2])
2001
                                                pci_am4[23:16] <= w_conf_pdata_reduced[23:16] ;
2002
                                        if (~w_byte_en[1])
2003
                                                pci_am4[15:12] <= w_conf_pdata_reduced[15:12] ;
2004
                                end
2005
                    if (w_reg_select_dec[22]) // case (w_conf_address_in[7:2]) = `P_TA4_ADDR:
2006
                                begin
2007
                                        if (~w_byte_en[3])
2008
                                                pci_ta4[31:24] <= w_conf_pdata_reduced[31:24] ;
2009
                                        if (~w_byte_en[2])
2010
                                                pci_ta4[23:16] <= w_conf_pdata_reduced[23:16] ;
2011
                                        if (~w_byte_en[1])
2012
                                                pci_ta4[15:12] <= w_conf_pdata_reduced[15:12] ;
2013
                                end
2014
`endif
2015
`ifdef          PCI_IMAGE5
2016
                    if (w_reg_select_dec[23]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL5_ADDR:
2017
                                begin
2018
                                        if (~w_byte_en[0])
2019
                                                pci_img_ctrl5_bit2_1 <= w_conf_data_in[2:1] ;
2020
                                end
2021
                    if (w_reg_select_dec[24]) // case (w_conf_address_in[7:2]) = `P_BA5_ADDR:
2022
                                begin
2023
                                        if (~w_byte_en[3])
2024
                                                pci_ba5_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
2025
                                        if (~w_byte_en[2])
2026
                                                pci_ba5_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
2027
                                        if (~w_byte_en[1])
2028
                                                pci_ba5_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
2029
        `ifdef  HOST
2030
                                        if (~w_byte_en[0])
2031
                                                pci_ba5_bit0 <= w_conf_data_in[0] ;
2032
        `endif
2033
                                end
2034
                    if (w_reg_select_dec[25]) // case (w_conf_address_in[7:2]) = `P_AM5_ADDR:
2035
                                begin
2036
                                        if (~w_byte_en[3])
2037
                                                pci_am5[31:24] <= w_conf_pdata_reduced[31:24] ;
2038
                                        if (~w_byte_en[2])
2039
                                                pci_am5[23:16] <= w_conf_pdata_reduced[23:16] ;
2040
                                        if (~w_byte_en[1])
2041
                                                pci_am5[15:12] <= w_conf_pdata_reduced[15:12] ;
2042
                                end
2043
                    if (w_reg_select_dec[26]) // case (w_conf_address_in[7:2]) = `P_TA5_ADDR:
2044
                                begin
2045
                                        if (~w_byte_en[3])
2046
                                                pci_ta5[31:24] <= w_conf_pdata_reduced[31:24] ;
2047
                                        if (~w_byte_en[2])
2048
                                                pci_ta5[23:16] <= w_conf_pdata_reduced[23:16] ;
2049
                                        if (~w_byte_en[1])
2050
                                                pci_ta5[15:12] <= w_conf_pdata_reduced[15:12] ;
2051
                                end
2052
`endif
2053
                    if (w_reg_select_dec[27]) // case (w_conf_address_in[7:2]) = `P_ERR_CS_ADDR:
2054
                                begin
2055
                                        if (~w_byte_en[0])
2056
                                                pci_err_cs_bit0 <= w_conf_data_in[0] ;
2057
                                end
2058
                        // WB slave - configuration space
2059
                                if (w_reg_select_dec[30]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL1_ADDR:
2060
                                begin
2061
                                        if (~w_byte_en[0])
2062
                                                wb_img_ctrl1_bit2_0 <= w_conf_data_in[2:0] ;
2063
                                end
2064
                                if (w_reg_select_dec[31]) // case (w_conf_address_in[7:2]) = `W_BA1_ADDR:
2065
                                begin
2066
                                        if (~w_byte_en[3])
2067
                                                wb_ba1_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2068
                                        if (~w_byte_en[2])
2069
                                                wb_ba1_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2070
                                        if (~w_byte_en[1])
2071
                                                wb_ba1_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2072
                                        if (~w_byte_en[0])
2073
                                                wb_ba1_bit0 <= w_conf_data_in[0] ;
2074
                                end
2075
                                if (w_reg_select_dec[32]) // case (w_conf_address_in[7:2]) = `W_AM1_ADDR:
2076
                                begin
2077
                                        if (~w_byte_en[3])
2078
                                                wb_am1[31:24] <= w_conf_wdata_reduced[31:24] ;
2079
                                        if (~w_byte_en[2])
2080
                                                wb_am1[23:16] <= w_conf_wdata_reduced[23:16] ;
2081
                                        if (~w_byte_en[1])
2082
                                                wb_am1[15:12] <= w_conf_wdata_reduced[15:12] ;
2083
                                end
2084
                                if (w_reg_select_dec[33]) // case (w_conf_address_in[7:2]) = `W_TA1_ADDR:
2085
                                begin
2086
                                        if (~w_byte_en[3])
2087
                                                wb_ta1[31:24] <= w_conf_wdata_reduced[31:24] ;
2088
                                        if (~w_byte_en[2])
2089
                                                wb_ta1[23:16] <= w_conf_wdata_reduced[23:16] ;
2090
                                        if (~w_byte_en[1])
2091
                                                wb_ta1[15:12] <= w_conf_wdata_reduced[15:12] ;
2092
                                end
2093
`ifdef          WB_IMAGE2
2094
                                if (w_reg_select_dec[34]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL2_ADDR:
2095
                                begin
2096
                                        if (~w_byte_en[0])
2097
                                                wb_img_ctrl2_bit2_0 <= w_conf_data_in[2:0] ;
2098
                                end
2099
                                if (w_reg_select_dec[35]) // case (w_conf_address_in[7:2]) = `W_BA2_ADDR:
2100
                                begin
2101
                                        if (~w_byte_en[3])
2102
                                                wb_ba2_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2103
                                        if (~w_byte_en[2])
2104
                                                wb_ba2_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2105
                                        if (~w_byte_en[1])
2106
                                                wb_ba2_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2107
                                        if (~w_byte_en[0])
2108
                                                wb_ba2_bit0 <= w_conf_data_in[0] ;
2109
                                end
2110
                                if (w_reg_select_dec[36]) // case (w_conf_address_in[7:2]) = `W_AM2_ADDR:
2111
                                begin
2112
                                        if (~w_byte_en[3])
2113
                                                wb_am2[31:24] <= w_conf_wdata_reduced[31:24] ;
2114
                                        if (~w_byte_en[2])
2115
                                                wb_am2[23:16] <= w_conf_wdata_reduced[23:16] ;
2116
                                        if (~w_byte_en[1])
2117
                                                wb_am2[15:12] <= w_conf_wdata_reduced[15:12] ;
2118
                                end
2119
                                if (w_reg_select_dec[37]) // case (w_conf_address_in[7:2]) = `W_TA2_ADDR:
2120
                                begin
2121
                                        if (~w_byte_en[3])
2122
                                                wb_ta2[31:24] <= w_conf_wdata_reduced[31:24] ;
2123
                                        if (~w_byte_en[2])
2124
                                                wb_ta2[23:16] <= w_conf_wdata_reduced[23:16] ;
2125
                                        if (~w_byte_en[1])
2126
                                                wb_ta2[15:12] <= w_conf_wdata_reduced[15:12] ;
2127
                                end
2128
`endif
2129
`ifdef          WB_IMAGE3
2130
                                if (w_reg_select_dec[38]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL3_ADDR:
2131
                                begin
2132
                                        if (~w_byte_en[0])
2133
                                                wb_img_ctrl3_bit2_0 <= w_conf_data_in[2:0] ;
2134
                                end
2135
                                if (w_reg_select_dec[39]) // case (w_conf_address_in[7:2]) = `W_BA3_ADDR:
2136
                                begin
2137
                                        if (~w_byte_en[3])
2138
                                                wb_ba3_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2139
                                        if (~w_byte_en[2])
2140
                                                wb_ba3_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2141
                                        if (~w_byte_en[1])
2142
                                                wb_ba3_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2143
                                        if (~w_byte_en[0])
2144
                                                wb_ba3_bit0 <= w_conf_data_in[0] ;
2145
                                end
2146
                                if (w_reg_select_dec[40]) // case (w_conf_address_in[7:2]) = `W_AM3_ADDR:
2147
                                begin
2148
                                        if (~w_byte_en[3])
2149
                                                wb_am3[31:24] <= w_conf_wdata_reduced[31:24] ;
2150
                                        if (~w_byte_en[2])
2151
                                                wb_am3[23:16] <= w_conf_wdata_reduced[23:16] ;
2152
                                        if (~w_byte_en[1])
2153
                                                wb_am3[15:12] <= w_conf_wdata_reduced[15:12] ;
2154
                                end
2155
                                if (w_reg_select_dec[41]) // case (w_conf_address_in[7:2]) = `W_TA3_ADDR:
2156
                                begin
2157
                                        if (~w_byte_en[3])
2158
                                                wb_ta3[31:24] <= w_conf_wdata_reduced[31:24] ;
2159
                                        if (~w_byte_en[2])
2160
                                                wb_ta3[23:16] <= w_conf_wdata_reduced[23:16] ;
2161
                                        if (~w_byte_en[1])
2162
                                                wb_ta3[15:12] <= w_conf_wdata_reduced[15:12] ;
2163
                                end
2164
`endif
2165
`ifdef          WB_IMAGE4
2166
                                if (w_reg_select_dec[42]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL4_ADDR:
2167
                                begin
2168
                                        if (~w_byte_en[0])
2169
                                                wb_img_ctrl4_bit2_0 <= w_conf_data_in[2:0] ;
2170
                                end
2171
                                if (w_reg_select_dec[43]) // case (w_conf_address_in[7:2]) = `W_BA4_ADDR:
2172
                                begin
2173
                                        if (~w_byte_en[3])
2174
                                                wb_ba4_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2175
                                        if (~w_byte_en[2])
2176
                                                wb_ba4_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2177
                                        if (~w_byte_en[1])
2178
                                                wb_ba4_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2179
                                        if (~w_byte_en[0])
2180
                                                wb_ba4_bit0 <= w_conf_data_in[0] ;
2181
                                end
2182
                                if (w_reg_select_dec[44]) // case (w_conf_address_in[7:2]) = `W_AM4_ADDR:
2183
                                begin
2184
                                        if (~w_byte_en[3])
2185
                                                wb_am4[31:24] <= w_conf_wdata_reduced[31:24] ;
2186
                                        if (~w_byte_en[2])
2187
                                                wb_am4[23:16] <= w_conf_wdata_reduced[23:16] ;
2188
                                        if (~w_byte_en[1])
2189
                                                wb_am4[15:12] <= w_conf_wdata_reduced[15:12] ;
2190
                                end
2191
                                if (w_reg_select_dec[45]) // case (w_conf_address_in[7:2]) = `W_TA4_ADDR:
2192
                                begin
2193
                                        if (~w_byte_en[3])
2194
                                                wb_ta4[31:24] <= w_conf_wdata_reduced[31:24] ;
2195
                                        if (~w_byte_en[2])
2196
                                                wb_ta4[23:16] <= w_conf_wdata_reduced[23:16] ;
2197
                                        if (~w_byte_en[1])
2198
                                                wb_ta4[15:12] <= w_conf_wdata_reduced[15:12] ;
2199
                                end
2200
`endif
2201
`ifdef          WB_IMAGE5
2202
                                if (w_reg_select_dec[46]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL5_ADDR:
2203
                                begin
2204
                                        if (~w_byte_en[0])
2205
                                                wb_img_ctrl5_bit2_0 <= w_conf_data_in[2:0] ;
2206
                                end
2207
                                if (w_reg_select_dec[47]) // case (w_conf_address_in[7:2]) = `W_BA5_ADDR:
2208
                                begin
2209
                                        if (~w_byte_en[3])
2210
                                                wb_ba5_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2211
                                        if (~w_byte_en[2])
2212
                                                wb_ba5_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2213
                                        if (~w_byte_en[1])
2214
                                                wb_ba5_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2215
                                        if (~w_byte_en[0])
2216
                                                wb_ba5_bit0 <= w_conf_data_in[0] ;
2217
                                end
2218
                                if (w_reg_select_dec[48]) // case (w_conf_address_in[7:2]) = `W_AM5_ADDR:
2219
                                begin
2220
                                        if (~w_byte_en[3])
2221
                                                wb_am5[31:24] <= w_conf_wdata_reduced[31:24] ;
2222
                                        if (~w_byte_en[2])
2223
                                                wb_am5[23:16] <= w_conf_wdata_reduced[23:16] ;
2224
                                        if (~w_byte_en[1])
2225
                                                wb_am5[15:12] <= w_conf_wdata_reduced[15:12] ;
2226
                                end
2227
                                if (w_reg_select_dec[49]) // case (w_conf_address_in[7:2]) = `W_TA5_ADDR:
2228
                                begin
2229
                                        if (~w_byte_en[3])
2230
                                                wb_ta5[31:24] <= w_conf_wdata_reduced[31:24] ;
2231
                                        if (~w_byte_en[2])
2232
                                                wb_ta5[23:16] <= w_conf_wdata_reduced[23:16] ;
2233
                                        if (~w_byte_en[1])
2234
                                                wb_ta5[15:12] <= w_conf_wdata_reduced[15:12] ;
2235
                                end
2236
`endif
2237
                                if (w_reg_select_dec[50]) // case (w_conf_address_in[7:2]) = `W_ERR_CS_ADDR:
2238
                                begin
2239
                                        if (~w_byte_en[0])
2240
                                                wb_err_cs_bit0 <= w_conf_data_in[0] ;
2241
                                end
2242
 
2243
`ifdef  HOST
2244
                                if (w_reg_select_dec[53]) // case (w_conf_address_in[7:2]) = `CNF_ADDR_ADDR:
2245
                                begin
2246
                                        if (~w_byte_en[2])
2247
                                                cnf_addr_bit23_2[23:16] <= w_conf_data_in[23:16] ;
2248
                                        if (~w_byte_en[1])
2249
                                                cnf_addr_bit23_2[15:8] <= w_conf_data_in[15:8] ;
2250
                                        if (~w_byte_en[0])
2251
                                        begin
2252
                                                cnf_addr_bit23_2[7:2] <= w_conf_data_in[7:2] ;
2253
                                                cnf_addr_bit0 <= w_conf_data_in[0] ;
2254
                                        end
2255
                                end
2256
`endif
2257
                                // `CNF_DATA_ADDR: implemented elsewhere !!!
2258
                                // `INT_ACK_ADDR : implemented elsewhere !!!
2259
                    if (w_reg_select_dec[54]) // case (w_conf_address_in[7:2]) = `ICR_ADDR:
2260
                                begin
2261
                                        if (~w_byte_en[3])
2262
                                                icr_bit31 <= w_conf_data_in[31] ;
2263 132 mihad
 
2264 77 mihad
                                        if (~w_byte_en[0])
2265 132 mihad
                    begin
2266 77 mihad
`ifdef  HOST
2267
                                                icr_bit4_3 <= w_conf_data_in[4:3] ;
2268
                                                icr_bit2_0 <= w_conf_data_in[2:0] ;
2269
`else
2270
                                                icr_bit2_0[2:0] <= w_conf_data_in[2:0] ;
2271
`endif
2272 132 mihad
                    end
2273
                end
2274
 
2275
`ifdef PCI_CPCI_HS_IMPLEMENT
2276
                if (w_reg_select_dec[56])
2277
                begin
2278
                    if (~w_byte_en[2])
2279
                    begin
2280
                        hs_loo <= w_conf_data_in[19];
2281
                        hs_eim <= w_conf_data_in[17];
2282
                    end
2283
                end
2284
`endif
2285
                end // end of we
2286
 
2287
        // Not register bits; used only internally after reset!
2288
    `ifdef GUEST
2289
        rst_inactive_sync <= 1'b1               ;
2290
        rst_inactive      <= rst_inactive_sync  ;
2291
    `endif
2292
 
2293
        if (rst_inactive)
2294
            init_complete <= 1'b1 ;
2295 77 mihad
        end
2296
end
2297
 
2298
// This signals are synchronous resets for registers, whic occures when asynchronous RESET is '1' or
2299
// data '1' is synchronously written into them!
2300
reg                     delete_status_bit15 ;
2301
reg                     delete_status_bit14 ;
2302
reg                     delete_status_bit13 ;
2303
reg                     delete_status_bit12 ;
2304
reg                     delete_status_bit11 ;
2305
reg                     delete_status_bit8 ;
2306
reg                     delete_pci_err_cs_bit8 ;
2307
reg                     delete_wb_err_cs_bit8 ;
2308
reg                     delete_isr_bit4 ;
2309
reg                     delete_isr_bit3 ;
2310
reg                     delete_isr_bit2 ;
2311
reg                     delete_isr_bit1 ;
2312
 
2313
// This are aditional register bits, which are resets when their value is '1' !!!
2314
always@(w_we or w_reg_select_dec or w_conf_data_in or w_byte_en)
2315
begin
2316 132 mihad
// I' is written into, then it also sets signals to '1'
2317
        delete_status_bit15     = w_conf_data_in[31] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2318
        delete_status_bit14     = w_conf_data_in[30] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2319
        delete_status_bit13     = w_conf_data_in[29] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2320
        delete_status_bit12     = w_conf_data_in[28] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2321
        delete_status_bit11     = w_conf_data_in[27] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2322
        delete_status_bit8      = w_conf_data_in[24] & !w_byte_en[3] & w_we & w_reg_select_dec[0] ;
2323
        delete_pci_err_cs_bit8  = w_conf_data_in[8]  & !w_byte_en[1] & w_we & w_reg_select_dec[27] ;
2324
        delete_wb_err_cs_bit8   = w_conf_data_in[8]  & !w_byte_en[1] & w_we & w_reg_select_dec[50] ;
2325
        delete_isr_bit4                 = w_conf_data_in[4]  & !w_byte_en[0] & w_we & w_reg_select_dec[55] ;
2326
        delete_isr_bit3                 = w_conf_data_in[3]  & !w_byte_en[0] & w_we & w_reg_select_dec[55] ;
2327
        delete_isr_bit2                 = w_conf_data_in[2]  & !w_byte_en[0] & w_we & w_reg_select_dec[55] ;
2328
        delete_isr_bit1                 = w_conf_data_in[1]  & !w_byte_en[0] & w_we & w_reg_select_dec[55] ;
2329 77 mihad
end
2330
 
2331
// STATUS BITS of PCI Header status register
2332
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2333
        // Set and clear FF
2334
        always@(posedge pci_clk or posedge reset)
2335
        begin
2336
                if (reset) // Asynchronous reset
2337
                        status_bit15_11[15] <= 1'b0 ;
2338
                else
2339
                begin
2340
                        if (perr_in) // Synchronous set
2341
                                status_bit15_11[15] <= 1'b1 ;
2342
                        else if (delete_status_bit15) // Synchronous reset
2343
                                status_bit15_11[15] <= 1'b0 ;
2344
                end
2345
        end
2346
        // Set and clear FF
2347
        always@(posedge pci_clk or posedge reset)
2348
        begin
2349
                if (reset) // Asynchronous reset
2350
                        status_bit15_11[14] <= 1'b0 ;
2351
                else
2352
                begin
2353
                        if (serr_in) // Synchronous set
2354
                                status_bit15_11[14] <= 1'b1 ;
2355
                        else if (delete_status_bit14) // Synchronous reset
2356
                                status_bit15_11[14] <= 1'b0 ;
2357
                end
2358
        end
2359
        // Set and clear FF
2360
        always@(posedge pci_clk or posedge reset)
2361
        begin
2362
                if (reset) // Asynchronous reset
2363
                        status_bit15_11[13] <= 1'b0 ;
2364
                else
2365
                begin
2366
                        if (master_abort_recv) // Synchronous set
2367
                                status_bit15_11[13] <= 1'b1 ;
2368
                        else if (delete_status_bit13) // Synchronous reset
2369
                                status_bit15_11[13] <= 1'b0 ;
2370
                end
2371
        end
2372
        // Set and clear FF
2373
        always@(posedge pci_clk or posedge reset)
2374
        begin
2375
                if (reset) // Asynchronous reset
2376
                        status_bit15_11[12] <= 1'b0 ;
2377
                else
2378
                begin
2379
                        if (target_abort_recv) // Synchronous set
2380
                                status_bit15_11[12] <= 1'b1 ;
2381
                        else if (delete_status_bit12) // Synchronous reset
2382
                                status_bit15_11[12] <= 1'b0 ;
2383
                end
2384
        end
2385
        // Set and clear FF
2386
        always@(posedge pci_clk or posedge reset)
2387
        begin
2388
                if (reset) // Asynchronous reset
2389
                        status_bit15_11[11] <= 1'b0 ;
2390
                else
2391
                begin
2392
                        if (target_abort_set) // Synchronous set
2393
                                status_bit15_11[11] <= 1'b1 ;
2394
                        else if (delete_status_bit11) // Synchronous reset
2395
                                status_bit15_11[11] <= 1'b0 ;
2396
                end
2397
        end
2398
        // Set and clear FF
2399
        always@(posedge pci_clk or posedge reset)
2400
        begin
2401
                if (reset) // Asynchronous reset
2402
                        status_bit8 <= 1'b0 ;
2403
                else
2404
                begin
2405
                        if (master_data_par_err) // Synchronous set
2406
                                status_bit8 <= 1'b1 ;
2407
                        else if (delete_status_bit8) // Synchronous reset
2408
                                status_bit8 <= 1'b0 ;
2409
                end
2410
        end
2411
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2412
  `ifdef HOST
2413
        reg             [15:11] set_status_bit15_11;
2414
        reg             set_status_bit8;
2415
        wire    delete_set_status_bit15;
2416
        wire    delete_set_status_bit14;
2417
        wire    delete_set_status_bit13;
2418
        wire    delete_set_status_bit12;
2419
        wire    delete_set_status_bit11;
2420
        wire    delete_set_status_bit8;
2421
        wire    block_set_status_bit15;
2422
        wire    block_set_status_bit14;
2423
        wire    block_set_status_bit13;
2424
        wire    block_set_status_bit12;
2425
        wire    block_set_status_bit11;
2426
        wire    block_set_status_bit8;
2427
        // Synchronization module for clearing FF between two clock domains
2428
        pci_sync_module                 sync_status_15
2429
        (
2430
                .set_clk_in             (pci_clk),
2431
                .delete_clk_in  (wb_clk),
2432
                .reset_in               (reset),
2433
                .delete_set_out (delete_set_status_bit15),
2434
                .block_set_out  (block_set_status_bit15),
2435
                .delete_in              (delete_status_bit15)
2436
        );
2437
        // Setting FF
2438
        always@(posedge pci_clk or posedge reset)
2439
        begin
2440
                if (reset) // Asynchronous reset
2441
                        set_status_bit15_11[15] <= 1'b0 ;
2442
                else
2443
                begin
2444
                        if (perr_in) // Synchronous set
2445
                                set_status_bit15_11[15] <= 1'b1 ;
2446
                        else if (delete_set_status_bit15) // Synchronous reset
2447
                                set_status_bit15_11[15] <= 1'b0 ;
2448
                end
2449
        end
2450
        // Synchronization module for clearing FF between two clock domains
2451
        pci_sync_module                 sync_status_14
2452
        (
2453
                .set_clk_in             (pci_clk),
2454
                .delete_clk_in  (wb_clk),
2455
                .reset_in               (reset),
2456
                .delete_set_out (delete_set_status_bit14),
2457
                .block_set_out  (block_set_status_bit14),
2458
                .delete_in              (delete_status_bit14)
2459
        );
2460
        // Setting FF
2461
        always@(posedge pci_clk or posedge reset)
2462
        begin
2463
                if (reset) // Asynchronous reset
2464
                        set_status_bit15_11[14] <= 1'b0 ;
2465
                else
2466
                begin
2467
                        if (serr_in) // Synchronous set
2468
                                set_status_bit15_11[14] <= 1'b1 ;
2469
                        else if (delete_set_status_bit14) // Synchronous reset
2470
                                set_status_bit15_11[14] <= 1'b0 ;
2471
                end
2472
        end
2473
        // Synchronization module for clearing FF between two clock domains
2474
        pci_sync_module                 sync_status_13
2475
        (
2476
                .set_clk_in             (pci_clk),
2477
                .delete_clk_in  (wb_clk),
2478
                .reset_in               (reset),
2479
                .delete_set_out (delete_set_status_bit13),
2480
                .block_set_out  (block_set_status_bit13),
2481
                .delete_in              (delete_status_bit13)
2482
        );
2483
        // Setting FF
2484
        always@(posedge pci_clk or posedge reset)
2485
        begin
2486
                if (reset) // Asynchronous reset
2487
                        set_status_bit15_11[13] <= 1'b0 ;
2488
                else
2489
                begin
2490
                        if (master_abort_recv) // Synchronous set
2491
                                set_status_bit15_11[13] <= 1'b1 ;
2492
                        else if (delete_set_status_bit13) // Synchronous reset
2493
                                set_status_bit15_11[13] <= 1'b0 ;
2494
                end
2495
        end
2496
        // Synchronization module for clearing FF between two clock domains
2497
        pci_sync_module                 sync_status_12
2498
        (
2499
                .set_clk_in             (pci_clk),
2500
                .delete_clk_in  (wb_clk),
2501
                .reset_in               (reset),
2502
                .delete_set_out (delete_set_status_bit12),
2503
                .block_set_out  (block_set_status_bit12),
2504
                .delete_in              (delete_status_bit12)
2505
        );
2506
        // Setting FF
2507
        always@(posedge pci_clk or posedge reset)
2508
        begin
2509
                if (reset) // Asynchronous reset
2510
                        set_status_bit15_11[12] <= 1'b0 ;
2511
                else
2512
                begin
2513
                        if (target_abort_recv) // Synchronous set
2514
                                set_status_bit15_11[12] <= 1'b1 ;
2515
                        else if (delete_set_status_bit12) // Synchronous reset
2516
                                set_status_bit15_11[12] <= 1'b0 ;
2517
                end
2518
        end
2519
        // Synchronization module for clearing FF between two clock domains
2520
        pci_sync_module                 sync_status_11
2521
        (
2522
                .set_clk_in             (pci_clk),
2523
                .delete_clk_in  (wb_clk),
2524
                .reset_in               (reset),
2525
                .delete_set_out (delete_set_status_bit11),
2526
                .block_set_out  (block_set_status_bit11),
2527
                .delete_in              (delete_status_bit11)
2528
        );
2529
        // Setting FF
2530
        always@(posedge pci_clk or posedge reset)
2531
        begin
2532
                if (reset) // Asynchronous reset
2533
                        set_status_bit15_11[11] <= 1'b0 ;
2534
                else
2535
                begin
2536
                        if (target_abort_set) // Synchronous set
2537
                                set_status_bit15_11[11] <= 1'b1 ;
2538
                        else if (delete_set_status_bit11) // Synchronous reset
2539
                                set_status_bit15_11[11] <= 1'b0 ;
2540
                end
2541
        end
2542
        // Synchronization module for clearing FF between two clock domains
2543
        pci_sync_module                 sync_status_8
2544
        (
2545
                .set_clk_in             (pci_clk),
2546
                .delete_clk_in  (wb_clk),
2547
                .reset_in               (reset),
2548
                .delete_set_out (delete_set_status_bit8),
2549
                .block_set_out  (block_set_status_bit8),
2550
                .delete_in              (delete_status_bit8)
2551
        );
2552
        // Setting FF
2553
        always@(posedge pci_clk or posedge reset)
2554
        begin
2555
                if (reset) // Asynchronous reset
2556
                        set_status_bit8 <= 1'b0 ;
2557
                else
2558
                begin
2559
                        if (master_data_par_err) // Synchronous set
2560
                                set_status_bit8 <= 1'b1 ;
2561
                        else if (delete_set_status_bit8) // Synchronous reset
2562
                                set_status_bit8 <= 1'b0 ;
2563
                end
2564
        end
2565
        wire [5:0] status_bits   =       {set_status_bit15_11[15] && !block_set_status_bit15,
2566
                                                                 set_status_bit15_11[14] && !block_set_status_bit14,
2567
                                                                 set_status_bit15_11[13] && !block_set_status_bit13,
2568
                                                                 set_status_bit15_11[12] && !block_set_status_bit12,
2569
                                                                 set_status_bit15_11[11] && !block_set_status_bit11,
2570
                                                                 set_status_bit8                 && !block_set_status_bit8      } ;
2571
        wire [5:0] meta_status_bits ;
2572
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2573 111 simons
        pci_synchronizer_flop   #(6, 0) status_bits_sync
2574 77 mihad
        (
2575
            .data_in        (status_bits),
2576
            .clk_out        (wb_clk),
2577
            .sync_data_out  (meta_status_bits),
2578
            .async_reset    (reset)
2579
        ) ;
2580
        always@(posedge wb_clk or posedge reset)
2581
        begin
2582
            if (reset)
2583
            begin
2584
                status_bit15_11[15:11]  <= 5'b0 ;
2585
                status_bit8                             <= 1'b0 ;
2586
            end
2587
            else
2588
            begin
2589
                status_bit15_11[15:11]  <= meta_status_bits[5:1] ;
2590
                status_bit8                             <= meta_status_bits[0] ;
2591
            end
2592
        end
2593
  `else // GUEST
2594
        // Set and clear FF
2595
        always@(posedge pci_clk or posedge reset)
2596
        begin
2597
                if (reset) // Asynchronous reset
2598
                        status_bit15_11[15] <= 1'b0 ;
2599
                else
2600
                begin
2601
                        if (perr_in) // Synchronous set
2602
                                status_bit15_11[15] <= 1'b1 ;
2603
                        else if (delete_status_bit15) // Synchronous reset
2604
                                status_bit15_11[15] <= 1'b0 ;
2605
                end
2606
        end
2607
        // Set and clear FF
2608
        always@(posedge pci_clk or posedge reset)
2609
        begin
2610
                if (reset) // Asynchronous reset
2611
                        status_bit15_11[14] <= 1'b0 ;
2612
                else
2613
                begin
2614
                        if (serr_in) // Synchronous set
2615
                                status_bit15_11[14] <= 1'b1 ;
2616
                        else if (delete_status_bit14) // Synchronous reset
2617
                                status_bit15_11[14] <= 1'b0 ;
2618
                end
2619
        end
2620
        // Set and clear FF
2621
        always@(posedge pci_clk or posedge reset)
2622
        begin
2623
                if (reset) // Asynchronous reset
2624
                        status_bit15_11[13] <= 1'b0 ;
2625
                else
2626
                begin
2627
                        if (master_abort_recv) // Synchronous set
2628
                                status_bit15_11[13] <= 1'b1 ;
2629
                        else if (delete_status_bit13) // Synchronous reset
2630
                                status_bit15_11[13] <= 1'b0 ;
2631
                end
2632
        end
2633
        // Set and clear FF
2634
        always@(posedge pci_clk or posedge reset)
2635
        begin
2636
                if (reset) // Asynchronous reset
2637
                        status_bit15_11[12] <= 1'b0 ;
2638
                else
2639
                begin
2640
                        if (target_abort_recv) // Synchronous set
2641
                                status_bit15_11[12] <= 1'b1 ;
2642
                        else if (delete_status_bit12) // Synchronous reset
2643
                                status_bit15_11[12] <= 1'b0 ;
2644
                end
2645
        end
2646
        // Set and clear FF
2647
        always@(posedge pci_clk or posedge reset)
2648
        begin
2649
                if (reset) // Asynchronous reset
2650
                        status_bit15_11[11] <= 1'b0 ;
2651
                else
2652
                begin
2653
                        if (target_abort_set) // Synchronous set
2654
                                status_bit15_11[11] <= 1'b1 ;
2655
                        else if (delete_status_bit11) // Synchronous reset
2656
                                status_bit15_11[11] <= 1'b0 ;
2657
                end
2658
        end
2659
        // Set and clear FF
2660
        always@(posedge pci_clk or posedge reset)
2661
        begin
2662
                if (reset) // Asynchronous reset
2663
                        status_bit8 <= 1'b0 ;
2664
                else
2665
                begin
2666
                        if (master_data_par_err) // Synchronous set
2667
                                status_bit8 <= 1'b1 ;
2668
                        else if (delete_status_bit8) // Synchronous reset
2669
                                status_bit8 <= 1'b0 ;
2670
                end
2671
        end
2672
  `endif
2673
`endif
2674
 
2675
// STATUS BITS of P_ERR_CS - PCI error control and status register
2676
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2677
        // Set and clear FF
2678
        always@(posedge pci_clk or posedge reset)
2679
        begin
2680
                if (reset) // Asynchronous reset
2681
                        pci_err_cs_bit8 <= 1'b0 ;
2682
                else
2683
                begin
2684
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2685
                                pci_err_cs_bit8 <= 1'b1 ;
2686
                        else if (delete_pci_err_cs_bit8) // Synchronous reset
2687
                                pci_err_cs_bit8 <= 1'b0 ;
2688
                end
2689
        end
2690
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2691
  `ifdef HOST
2692
        // Set and clear FF
2693
        always@(posedge wb_clk or posedge reset)
2694
        begin
2695
                if (reset) // Asynchronous reset
2696
                        pci_err_cs_bit8 <= 1'b0 ;
2697
                else
2698
                begin
2699
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2700
                                pci_err_cs_bit8 <= 1'b1 ;
2701
                        else if (delete_pci_err_cs_bit8) // Synchronous reset
2702
                                pci_err_cs_bit8 <= 1'b0 ;
2703
                end
2704
        end
2705
  `else // GUEST
2706
        reg             set_pci_err_cs_bit8;
2707
        wire    delete_set_pci_err_cs_bit8;
2708
        wire    block_set_pci_err_cs_bit8;
2709
        // Synchronization module for clearing FF between two clock domains
2710
        pci_sync_module                 sync_pci_err_cs_8
2711
        (
2712
                .set_clk_in             (wb_clk),
2713
                .delete_clk_in  (pci_clk),
2714
                .reset_in               (reset),
2715
                .delete_set_out (delete_set_pci_err_cs_bit8),
2716
                .block_set_out  (block_set_pci_err_cs_bit8),
2717
                .delete_in              (delete_pci_err_cs_bit8)
2718
        );
2719
        // Setting FF
2720
        always@(posedge wb_clk or posedge reset)
2721
        begin
2722
                if (reset) // Asynchronous reset
2723
                        set_pci_err_cs_bit8 <= 1'b0 ;
2724
                else
2725
                begin
2726
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2727
                                set_pci_err_cs_bit8 <= 1'b1 ;
2728
                        else if (delete_set_pci_err_cs_bit8) // Synchronous reset
2729
                                set_pci_err_cs_bit8 <= 1'b0 ;
2730
                end
2731
        end
2732
        wire    pci_err_cs_bits = set_pci_err_cs_bit8 && !block_set_pci_err_cs_bit8 ;
2733
        wire    meta_pci_err_cs_bits ;
2734
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2735 111 simons
        pci_synchronizer_flop #(1,0) pci_err_cs_bits_sync
2736 77 mihad
        (
2737
            .data_in        (pci_err_cs_bits),
2738
            .clk_out        (pci_clk),
2739
            .sync_data_out  (meta_pci_err_cs_bits),
2740
            .async_reset    (reset)
2741
        ) ;
2742
        always@(posedge pci_clk or posedge reset)
2743
        begin
2744
            if (reset)
2745
                pci_err_cs_bit8 <= 1'b0 ;
2746
            else
2747
                pci_err_cs_bit8 <= meta_pci_err_cs_bits ;
2748
        end
2749
  `endif
2750
`endif
2751
        // Set and clear FF
2752
        always@(posedge wb_clk or posedge reset)
2753
        begin
2754
                if (reset) // Asynchronous reset
2755
                        pci_err_cs_bit10 <= 1'b0 ;
2756
                else
2757
                begin
2758
                        if (pci_error_sig) // Synchronous report
2759
                                pci_err_cs_bit10 <= pci_error_rty_exp ;
2760
                end
2761
        end
2762
        // Set and clear FF
2763
        always@(posedge wb_clk or posedge reset)
2764
        begin
2765
                if (reset) // Asynchronous reset
2766
                        pci_err_cs_bit9 <= 1'b0 ;
2767
                else
2768
                begin
2769
                        if (pci_error_sig) // Synchronous report
2770
                                pci_err_cs_bit9 <= pci_error_es ;
2771
                end
2772
        end
2773
        // Set and clear FF
2774
        always@(posedge wb_clk or posedge reset)
2775
        begin
2776
                if (reset) // Asynchronous reset
2777
            begin
2778
                        pci_err_cs_bit31_24 <= 8'h00 ;
2779
                        pci_err_addr <= 32'h0000_0000 ;
2780
                        pci_err_data <= 32'h0000_0000 ;
2781
            end
2782
                else
2783
                        if (pci_error_sig) // Synchronous report
2784
                        begin
2785
                                pci_err_cs_bit31_24 <= { pci_error_be, pci_error_bc } ;
2786
                                pci_err_addr <= pci_error_addr ;
2787
                                pci_err_data <= pci_error_data ;
2788
                        end
2789
        end
2790
 
2791
// STATUS BITS of W_ERR_CS - WB error control and status register
2792
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2793
        // Set and clear FF
2794
        always@(posedge pci_clk or posedge reset)
2795
        begin
2796
                if (reset) // Asynchronous reset
2797
                        wb_err_cs_bit8 <= 1'b0 ;
2798
                else
2799
                begin
2800
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2801
                                wb_err_cs_bit8 <= 1'b1 ;
2802
                        else if (delete_wb_err_cs_bit8) // Synchronous reset
2803
                                wb_err_cs_bit8 <= 1'b0 ;
2804
                end
2805
        end
2806
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2807
  `ifdef HOST
2808
        reg             set_wb_err_cs_bit8;
2809
        wire    delete_set_wb_err_cs_bit8;
2810
        wire    block_set_wb_err_cs_bit8;
2811
        // Synchronization module for clearing FF between two clock domains
2812
        pci_sync_module                 sync_wb_err_cs_8
2813
        (
2814
                .set_clk_in             (pci_clk),
2815
                .delete_clk_in  (wb_clk),
2816
                .reset_in               (reset),
2817
                .delete_set_out (delete_set_wb_err_cs_bit8),
2818
                .block_set_out  (block_set_wb_err_cs_bit8),
2819
                .delete_in              (delete_wb_err_cs_bit8)
2820
        );
2821
        // Setting FF
2822
        always@(posedge pci_clk or posedge reset)
2823
        begin
2824
                if (reset) // Asynchronous reset
2825
                        set_wb_err_cs_bit8 <= 1'b0 ;
2826
                else
2827
                begin
2828
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2829
                                set_wb_err_cs_bit8 <= 1'b1 ;
2830
                        else if (delete_set_wb_err_cs_bit8) // Synchronous reset
2831
                                set_wb_err_cs_bit8 <= 1'b0 ;
2832
                end
2833
        end
2834
        wire    wb_err_cs_bits = set_wb_err_cs_bit8 && !block_set_wb_err_cs_bit8 ;
2835
        wire    meta_wb_err_cs_bits ;
2836
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2837 111 simons
        pci_synchronizer_flop #(1,0) wb_err_cs_bits_sync
2838 77 mihad
        (
2839
            .data_in        (wb_err_cs_bits),
2840
            .clk_out        (wb_clk),
2841
            .sync_data_out  (meta_wb_err_cs_bits),
2842
            .async_reset    (reset)
2843
        ) ;
2844
        always@(posedge wb_clk or posedge reset)
2845
        begin
2846
            if (reset)
2847
                wb_err_cs_bit8  <= 1'b0 ;
2848
            else
2849
                wb_err_cs_bit8  <= meta_wb_err_cs_bits ;
2850
        end
2851
  `else // GUEST
2852
        // Set and clear FF
2853
        always@(posedge pci_clk or posedge reset)
2854
        begin
2855
                if (reset) // Asynchronous reset
2856
                        wb_err_cs_bit8 <= 1'b0 ;
2857
                else
2858
                begin
2859
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2860
                                wb_err_cs_bit8 <= 1'b1 ;
2861
                        else if (delete_wb_err_cs_bit8) // Synchronous reset
2862
                                wb_err_cs_bit8 <= 1'b0 ;
2863
                end
2864
        end
2865
  `endif
2866
`endif
2867
/*      // Set and clear FF
2868
        always@(posedge pci_clk or posedge reset)
2869
        begin
2870
                if (reset) // Asynchronous reset
2871
                        wb_err_cs_bit10 <= 1'b0 ;
2872
                else
2873
                begin
2874
                        if (wb_error_sig) // Synchronous report
2875
                                wb_err_cs_bit10 <= wb_error_rty_exp ;
2876
                end
2877
        end */
2878
        // Set and clear FF
2879
        always@(posedge pci_clk or posedge reset)
2880
        begin
2881
                if (reset) // Asynchronous reset
2882
                        wb_err_cs_bit9 <= 1'b0 ;
2883
                else
2884
                begin
2885
                        if (wb_error_sig) // Synchronous report
2886
                                wb_err_cs_bit9 <= wb_error_es ;
2887
                end
2888
        end
2889
        // Set and clear FF
2890
        always@(posedge pci_clk or posedge reset)
2891
        begin
2892
                if (reset) // Asynchronous reset
2893
            begin
2894
                        wb_err_cs_bit31_24 <= 8'h00 ;
2895
                        wb_err_addr <= 32'h0000_0000 ;
2896
                        wb_err_data <= 32'h0000_0000 ;
2897
            end
2898
                else
2899
                        if (wb_error_sig)
2900
                        begin
2901
                                wb_err_cs_bit31_24 <= { wb_error_be, wb_error_bc } ;
2902
                                wb_err_addr <= wb_error_addr ;
2903
                                wb_err_data <= wb_error_data ;
2904
                        end
2905
        end
2906
 
2907
// SERR_INT and PERR_INT STATUS BITS of ISR - interrupt status register
2908
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2909
  `ifdef HOST
2910
        // Set and clear FF
2911
        always@(posedge pci_clk or posedge reset)
2912
        begin
2913
                if (reset) // Asynchronous reset
2914
                        isr_bit4_3[4] <= 1'b0 ;
2915
                else
2916
                begin
2917
                        if (isr_sys_err_int && icr_bit4_3[4]) // Synchronous set
2918
                                isr_bit4_3[4] <= 1'b1 ;
2919
                        else if (delete_isr_bit4) // Synchronous reset
2920
                                isr_bit4_3[4] <= 1'b0 ;
2921
                end
2922
        end
2923
        // Set and clear FF
2924
        always@(posedge pci_clk or posedge reset)
2925
        begin
2926
                if (reset) // Asynchronous reset
2927
                        isr_bit4_3[3] <= 1'b0 ;
2928
                else
2929
                begin
2930
                        if (isr_par_err_int && icr_bit4_3[3]) // Synchronous set
2931
                                isr_bit4_3[3] <= 1'b1 ;
2932
                        else if (delete_isr_bit3) // Synchronous reset
2933
                                isr_bit4_3[3] <= 1'b0 ;
2934
                end
2935
        end
2936
  `endif
2937
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2938
  `ifdef HOST
2939
        reg             [4:3]   set_isr_bit4_3;
2940
        wire    delete_set_isr_bit4;
2941
        wire    delete_set_isr_bit3;
2942
        wire    block_set_isr_bit4;
2943
        wire    block_set_isr_bit3;
2944
        // Synchronization module for clearing FF between two clock domains
2945
        pci_sync_module                 sync_isr_4
2946
        (
2947
                .set_clk_in             (pci_clk),
2948
                .delete_clk_in  (wb_clk),
2949
                .reset_in               (reset),
2950
                .delete_set_out (delete_set_isr_bit4),
2951
                .block_set_out  (block_set_isr_bit4),
2952
                .delete_in              (delete_isr_bit4)
2953
        );
2954
        // Setting FF
2955
        always@(posedge pci_clk or posedge reset)
2956
        begin
2957
                if (reset) // Asynchronous reset
2958
                        set_isr_bit4_3[4] <= 1'b0 ;
2959
                else
2960
                begin
2961
                        if (isr_sys_err_int && icr_bit4_3[4]) // Synchronous set
2962
                                set_isr_bit4_3[4] <= 1'b1 ;
2963
                        else if (delete_set_isr_bit4) // Synchronous reset
2964
                                set_isr_bit4_3[4] <= 1'b0 ;
2965
                end
2966
        end
2967
        // Synchronization module for clearing FF between two clock domains
2968
        pci_sync_module                 sync_isr_3
2969
        (
2970
                .set_clk_in             (pci_clk),
2971
                .delete_clk_in  (wb_clk),
2972
                .reset_in               (reset),
2973
                .delete_set_out (delete_set_isr_bit3),
2974
                .block_set_out  (block_set_isr_bit3),
2975
                .delete_in              (delete_isr_bit3)
2976
        );
2977
        // Setting FF
2978
        always@(posedge pci_clk or posedge reset)
2979
        begin
2980
                if (reset) // Asynchronous reset
2981
                        set_isr_bit4_3[3] <= 1'b0 ;
2982
                else
2983
                begin
2984
                        if (isr_par_err_int && icr_bit4_3[3]) // Synchronous set
2985
                                set_isr_bit4_3[3] <= 1'b1 ;
2986
                        else if (delete_set_isr_bit3) // Synchronous reset
2987
                                set_isr_bit4_3[3] <= 1'b0 ;
2988
                end
2989
        end
2990
        wire [4:3] isr_bits4_3  =       {set_isr_bit4_3[4] && !block_set_isr_bit4,
2991
                                                                 set_isr_bit4_3[3] && !block_set_isr_bit3       } ;
2992
        wire [4:3] meta_isr_bits4_3 ;
2993
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2994 111 simons
        pci_synchronizer_flop   #(2, 0) isr_bits_sync
2995 77 mihad
        (
2996
            .data_in        (isr_bits4_3),
2997
            .clk_out        (wb_clk),
2998
            .sync_data_out  (meta_isr_bits4_3),
2999
            .async_reset    (reset)
3000
        ) ;
3001
        always@(posedge wb_clk or posedge reset)
3002
        begin
3003
            if (reset)
3004
                isr_bit4_3[4:3] <= 2'b0 ;
3005
            else
3006
                isr_bit4_3[4:3] <= meta_isr_bits4_3[4:3] ;
3007
        end
3008
  `endif
3009
`endif
3010
 
3011
// PCI_EINT and WB_EINT STATUS BITS of ISR - interrupt status register
3012
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3013
  // WB_EINT STATUS BIT
3014
        // Set and clear FF
3015
        always@(posedge pci_clk or posedge reset)
3016
        begin
3017
                if (reset) // Asynchronous reset
3018
                        isr_bit2_0[1] <= 1'b0 ;
3019
                else
3020
                begin
3021
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
3022
                                isr_bit2_0[1] <= 1'b1 ;
3023
                        else if (delete_isr_bit1) // Synchronous reset
3024
                                isr_bit2_0[1] <= 1'b0 ;
3025
                end
3026
        end
3027
  // PCI_EINT STATUS BIT
3028
        // Set and clear FF
3029
        always@(posedge pci_clk or posedge reset)
3030
        begin
3031
                if (reset) // Asynchronous reset
3032
                        isr_bit2_0[2] <= 1'b0 ;
3033
                else
3034
                begin
3035
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
3036
                                isr_bit2_0[2] <= 1'b1 ;
3037
                        else if (delete_isr_bit2) // Synchronous reset
3038
                                isr_bit2_0[2] <= 1'b0 ;
3039
                end
3040
        end
3041
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
3042
  `ifdef HOST
3043
  // WB_EINT STATUS BIT
3044
        reg             set_isr_bit1;
3045
        wire    delete_set_isr_bit1;
3046
        wire    block_set_isr_bit1;
3047
        // Synchronization module for clearing FF between two clock domains
3048
        pci_sync_module                 sync_isr_1
3049
        (
3050
                .set_clk_in             (pci_clk),
3051
                .delete_clk_in  (wb_clk),
3052
                .reset_in               (reset),
3053
                .delete_set_out (delete_set_isr_bit1),
3054
                .block_set_out  (block_set_isr_bit1),
3055
                .delete_in              (delete_isr_bit1)
3056
        );
3057
        // Setting FF
3058
        always@(posedge pci_clk or posedge reset)
3059
        begin
3060
                if (reset) // Asynchronous reset
3061
                        set_isr_bit1 <= 1'b0 ;
3062
                else
3063
                begin
3064
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
3065
                                set_isr_bit1 <= 1'b1 ;
3066
                        else if (delete_set_isr_bit1) // Synchronous reset
3067
                                set_isr_bit1 <= 1'b0 ;
3068
                end
3069
        end
3070
        wire    isr_bit1        = set_isr_bit1 && !block_set_isr_bit1 ;
3071
        wire    meta_isr_bit1 ;
3072
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3073 111 simons
        pci_synchronizer_flop   #(1, 0) isr_bit1_sync
3074 77 mihad
        (
3075
            .data_in        (isr_bit1),
3076
            .clk_out        (wb_clk),
3077
            .sync_data_out  (meta_isr_bit1),
3078
            .async_reset    (reset)
3079
        ) ;
3080
        always@(posedge wb_clk or posedge reset)
3081
        begin
3082
            if (reset)
3083
                isr_bit2_0[1]   <= 1'b0 ;
3084
            else
3085
                isr_bit2_0[1]   <= meta_isr_bit1 ;
3086
        end
3087
  // PCI_EINT STATUS BIT
3088
        // Set and clear FF
3089
        always@(posedge wb_clk or posedge reset)
3090
        begin
3091
                if (reset) // Asynchronous reset
3092
                        isr_bit2_0[2] <= 1'b0 ;
3093
                else
3094
                begin
3095
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
3096
                                isr_bit2_0[2] <= 1'b1 ;
3097
                        else if (delete_isr_bit2) // Synchronous reset
3098
                                isr_bit2_0[2] <= 1'b0 ;
3099
                end
3100
        end
3101
  `else // GUEST
3102
  // WB_EINT STATUS BIT
3103
        // Set and clear FF
3104
        always@(posedge pci_clk or posedge reset)
3105
        begin
3106
                if (reset) // Asynchronous reset
3107
                        isr_bit2_0[1] <= 1'b0 ;
3108
                else
3109
                begin
3110
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
3111
                                isr_bit2_0[1] <= 1'b1 ;
3112
                        else if (delete_isr_bit1) // Synchronous reset
3113
                                isr_bit2_0[1] <= 1'b0 ;
3114
                end
3115
        end
3116
  // PCI_EINT STATUS BIT
3117
        reg             set_isr_bit2;
3118
        wire    delete_set_isr_bit2;
3119
        wire    block_set_isr_bit2;
3120
        // Synchronization module for clearing FF between two clock domains
3121
        pci_sync_module                 sync_isr_2
3122
        (
3123
                .set_clk_in             (wb_clk),
3124
                .delete_clk_in  (pci_clk),
3125
                .reset_in               (reset),
3126
                .delete_set_out (delete_set_isr_bit2),
3127
                .block_set_out  (block_set_isr_bit2),
3128
                .delete_in              (delete_isr_bit2)
3129
        );
3130
        // Setting FF
3131
        always@(posedge wb_clk or posedge reset)
3132
        begin
3133
                if (reset) // Asynchronous reset
3134
                        set_isr_bit2 <= 1'b0 ;
3135
                else
3136
                begin
3137
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
3138
                                set_isr_bit2 <= 1'b1 ;
3139
                        else if (delete_set_isr_bit2) // Synchronous reset
3140
                                set_isr_bit2 <= 1'b0 ;
3141
                end
3142
        end
3143
        wire    isr_bit2        = set_isr_bit2 && !block_set_isr_bit2 ;
3144
        wire    meta_isr_bit2 ;
3145
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3146 111 simons
        pci_synchronizer_flop   #(1, 0) isr_bit2_sync
3147 77 mihad
        (
3148
            .data_in        (isr_bit2),
3149
            .clk_out        (pci_clk),
3150
            .sync_data_out  (meta_isr_bit2),
3151
            .async_reset    (reset)
3152
        ) ;
3153
        always@(posedge pci_clk or posedge reset)
3154
        begin
3155
            if (reset)
3156
                isr_bit2_0[2]   <= 1'b0 ;
3157
            else
3158
                isr_bit2_0[2]   <= meta_isr_bit2 ;
3159
        end
3160
  `endif
3161
`endif
3162
 
3163
// INT BIT of ISR - interrupt status register
3164
`ifdef HOST
3165
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3166
        wire    meta_isr_int_prop_bit ;
3167
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3168 111 simons
        pci_synchronizer_flop   #(1, 0) isr_bit0_sync
3169 77 mihad
        (
3170
            .data_in        (isr_int_prop_bit),
3171
            .clk_out        (wb_clk),
3172
            .sync_data_out  (meta_isr_int_prop_bit),
3173
            .async_reset    (reset)
3174
        ) ;
3175
        always@(posedge wb_clk or posedge reset)
3176
        begin
3177
            if (reset)
3178
                isr_bit2_0[0]    <= 1'b0 ;
3179
            else
3180
                isr_bit2_0[0]    <= meta_isr_int_prop_bit ;
3181
        end
3182
`else // GUEST
3183
  `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3184
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3185
        always@(posedge pci_clk or posedge reset)
3186
        begin
3187
            if (reset)
3188
                isr_bit2_0[0]    <= 1'b0 ;
3189
            else
3190
                isr_bit2_0[0]    <= isr_int_prop_bit ;
3191
        end
3192
  `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3193
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3194
        wire    meta_isr_int_prop_bit ;
3195
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3196 111 simons
        pci_synchronizer_flop   #(1, 0) isr_bit0_sync
3197 77 mihad
        (
3198
            .data_in        (isr_int_prop_bit),
3199
            .clk_out        (pci_clk),
3200
            .sync_data_out  (meta_isr_int_prop_bit),
3201
            .async_reset    (reset)
3202
        ) ;
3203
        always@(posedge pci_clk or posedge reset)
3204
        begin
3205
            if (reset)
3206
                isr_bit2_0[0]    <= 1'b0 ;
3207
            else
3208
                isr_bit2_0[0]    <= meta_isr_int_prop_bit ;
3209
        end
3210
  `endif
3211
`endif
3212
 
3213
// INT PIN
3214
wire    int_in;
3215
wire    int_meta;
3216
reg             interrupt_out;
3217
`ifdef HOST
3218
 `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3219
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2_0[2] || isr_bit4_3[3]  || isr_bit4_3[4];
3220
 `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3221
        assign  int_in = isr_int_prop_bit || isr_bit1      || isr_bit2_0[2] || isr_bits4_3[3] || isr_bits4_3[4];
3222
 `endif
3223
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3224 111 simons
        pci_synchronizer_flop   #(1, 0) int_pin_sync
3225 77 mihad
        (
3226
            .data_in        (int_in),
3227
            .clk_out        (wb_clk),
3228
            .sync_data_out  (int_meta),
3229
            .async_reset    (reset)
3230
        ) ;
3231
        always@(posedge wb_clk or posedge reset)
3232
        begin
3233
            if (reset)
3234
                interrupt_out   <= 1'b0 ;
3235
            else
3236
                interrupt_out   <= int_meta ;
3237
        end
3238
`else // GUEST
3239
 `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3240
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2_0[2];
3241
 `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3242
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2;
3243
 `endif
3244
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3245 111 simons
        pci_synchronizer_flop   #(1, 0) int_pin_sync
3246 77 mihad
        (
3247
            .data_in        (int_in),
3248
            .clk_out        (pci_clk),
3249
            .sync_data_out  (int_meta),
3250
            .async_reset    (reset)
3251
        ) ;
3252
        always@(posedge pci_clk or posedge reset)
3253
        begin
3254
            if (reset)
3255
                interrupt_out   <= 1'b0 ;
3256
            else
3257
                interrupt_out   <= int_meta ;
3258
        end
3259
`endif
3260
 
3261 132 mihad
 
3262
`ifdef PCI_CPCI_HS_IMPLEMENT
3263
    reg [hs_es_cnt_width - 1:0] hs_es_cnt ; // debounce counter
3264
    reg hs_es_in_state,   // current state of ejector switch input - synchronized
3265
        hs_es_sync,       // synchronization flop for ejector switch input
3266
        hs_es_cur_state ; // current valid state of ejector switch
3267
 
3268
`ifdef ACTIVE_HIGH_OE
3269
    wire oe_active_val = 1'b1 ;
3270
`endif
3271
 
3272
`ifdef ACTIVE_LOW_OE
3273
    wire oe_active_val = 1'b0 ;
3274
`endif
3275
 
3276
        always@(posedge pci_clk or posedge reset)
3277
        begin
3278
            if (reset)
3279
        begin
3280
                hs_ins          <= 1'b0 ;
3281
            hs_ins_armed    <= 1'b1 ;
3282
            hs_ext          <= 1'b0 ;
3283
            hs_ext_armed    <= 1'b0 ;
3284
            hs_es_in_state  <= 1'b0 ;
3285
            hs_es_sync      <= 1'b0 ;
3286
            hs_es_cur_state <= 1'b0 ;
3287
            hs_es_cnt       <= 'h0  ;
3288
 
3289
        `ifdef ACTIVE_LOW_OE
3290
            pci_cpci_hs_enum_oe_o   <= 1'b1 ;
3291
            pci_cpci_hs_led_oe_o    <= 1'b0 ;
3292
        `endif
3293
 
3294
        `ifdef ACTIVE_HIGH_OE
3295
            pci_cpci_hs_enum_oe_o   <= 1'b0 ;
3296
            pci_cpci_hs_led_oe_o    <= 1'b1 ;
3297
        `endif
3298
 
3299
        end
3300
            else
3301
        begin
3302
            // INS
3303
            if (hs_ins)
3304
            begin
3305
                if (w_conf_data_in[23] & ~w_byte_en[2] & w_we & w_reg_select_dec[56]) // clear
3306
                    hs_ins <= 1'b0 ;
3307
            end
3308
            else if (hs_ins_armed)  // set
3309
                hs_ins <= init_complete & (hs_es_cur_state == 1'b1) ;
3310
 
3311
            // INS armed
3312
            if (~hs_ins & hs_ins_armed & init_complete & (hs_es_cur_state == 1'b1)) // clear
3313
                hs_ins_armed <= 1'b0 ;
3314
            else if (hs_ext)  // set
3315
                hs_ins_armed <= w_conf_data_in[22] & ~w_byte_en[2] & w_we & w_reg_select_dec[56] ;
3316
 
3317
            // EXT
3318
            if (hs_ext) // clear
3319
            begin
3320
                if (w_conf_data_in[22] & ~w_byte_en[2] & w_we & w_reg_select_dec[56])
3321
                    hs_ext <= 1'b0 ;
3322
            end
3323
            else if (hs_ext_armed)  // set
3324
                hs_ext <= (hs_es_cur_state == 1'b0) ;
3325
 
3326
            // EXT armed
3327
            if (~hs_ext & hs_ext_armed & (hs_es_cur_state == 1'b0)) // clear
3328
                hs_ext_armed <= 1'b0 ;
3329
            else if (hs_ins)  // set
3330
                hs_ext_armed <= w_conf_data_in[23] & !w_byte_en[2] & w_we & w_reg_select_dec[56] ;
3331
 
3332
            // ejector switch debounce counter logic
3333
            hs_es_sync     <= pci_cpci_hs_es_i  ;
3334
            hs_es_in_state <= hs_es_sync        ;
3335
 
3336
            if (hs_es_in_state == hs_es_cur_state)
3337
                hs_es_cnt <= 'h0 ;
3338
            else
3339
                hs_es_cnt <= hs_es_cnt + 1'b1 ;
3340
 
3341
            if (hs_es_cnt == {hs_es_cnt_width{1'b1}})
3342
                hs_es_cur_state <= hs_es_in_state ;
3343
 
3344
            if ((hs_ins | hs_ext) & ~hs_eim)
3345
                pci_cpci_hs_enum_oe_o   <=  oe_active_val   ;
3346
            else
3347
                pci_cpci_hs_enum_oe_o   <= ~oe_active_val   ;
3348
 
3349
            if (~init_complete | hs_loo)
3350
                pci_cpci_hs_led_oe_o    <=  oe_active_val   ;
3351
            else
3352
                pci_cpci_hs_led_oe_o    <= ~oe_active_val   ;
3353
        end
3354
        end
3355
`endif
3356
 
3357
 
3358 77 mihad
/*-----------------------------------------------------------------------------------------------------------
3359
        OUTPUTs from registers !!!
3360
-----------------------------------------------------------------------------------------------------------*/
3361
 
3362
// if bridge is HOST then write clock is equal to WB clock, and synchronization of outputs has to be done
3363
`ifdef  HOST
3364
  wire [3:0] command_bits = {command_bit8, command_bit6, command_bit2_0[1:0]} ;
3365
  wire [3:0] meta_command_bits ;
3366
  reg  [3:0] sync_command_bits ;
3367 111 simons
  pci_synchronizer_flop   #(4, 0)  command_bits_sync
3368 77 mihad
  (
3369
      .data_in        (command_bits),
3370
      .clk_out        (pci_clk),
3371
      .sync_data_out  (meta_command_bits),
3372
      .async_reset    (reset)
3373
  ) ;
3374
  always@(posedge pci_clk or posedge reset)
3375
  begin
3376
      if (reset)
3377
          sync_command_bits <= 4'b0 ;
3378
      else
3379
          sync_command_bits <= meta_command_bits ;
3380
  end
3381
  wire  sync_command_bit8 = sync_command_bits[3] ;
3382
  wire  sync_command_bit6 = sync_command_bits[2] ;
3383
  wire  sync_command_bit1 = sync_command_bits[1] ;
3384
  wire  sync_command_bit0 = sync_command_bits[0] ;
3385
  wire  sync_command_bit2 = command_bit2_0[2] ;
3386
`else   // GUEST
3387
  wire       command_bit = command_bit2_0[2] ;
3388
  wire       meta_command_bit ;
3389
  reg        sync_command_bit ;
3390 111 simons
  pci_synchronizer_flop   #(1, 0) command_bit_sync
3391 77 mihad
  (
3392
      .data_in        (command_bit),
3393
      .clk_out        (pci_clk),
3394
      .sync_data_out  (meta_command_bit),
3395
      .async_reset    (reset)
3396
  ) ;
3397
  always@(posedge pci_clk or posedge reset)
3398
  begin
3399
      if (reset)
3400
          sync_command_bit <= 1'b0 ;
3401
      else
3402
          sync_command_bit <= meta_command_bit ;
3403
  end
3404
  wire  sync_command_bit8 = command_bit8 ;
3405
  wire  sync_command_bit6 = command_bit6 ;
3406
  wire  sync_command_bit1 = command_bit2_0[1] ;
3407
  wire  sync_command_bit0 = command_bit2_0[0] ;
3408
  wire  sync_command_bit2 = sync_command_bit ;
3409
`endif
3410
// PCI header outputs from command register
3411
assign          serr_enable = sync_command_bit8 ;                                       // to PCI clock
3412
assign          perr_response = sync_command_bit6 ;                     // to PCI clock
3413
assign          pci_master_enable = sync_command_bit2 ;                 // to WB clock
3414
assign          memory_space_enable = sync_command_bit1 ;                       // to PCI clock
3415
assign          io_space_enable = sync_command_bit0 ;                           // to PCI clock
3416
 
3417
// if bridge is HOST then write clock is equal to WB clock, and synchronization of outputs has to be done
3418
        // We don't support cache line sizes smaller that 4 and it must have last two bits zero!!!
3419
wire    cache_lsize_not_zero = ((cache_line_size_reg[7] || cache_line_size_reg[6] || cache_line_size_reg[5] ||
3420
                                                                 cache_line_size_reg[4] || cache_line_size_reg[3] || cache_line_size_reg[2]) &&
3421
                                                                (!cache_line_size_reg[1] && !cache_line_size_reg[0]) );
3422
`ifdef  HOST
3423
  wire [7:2] cache_lsize_to_pci_bits = { cache_line_size_reg[7:2] } ;
3424
  wire [7:2] meta_cache_lsize_to_pci_bits ;
3425
  reg  [7:2] sync_cache_lsize_to_pci_bits ;
3426 111 simons
  pci_synchronizer_flop   #(6, 0)  cache_lsize_to_pci_bits_sync
3427 77 mihad
  (
3428
      .data_in        (cache_lsize_to_pci_bits),
3429
      .clk_out        (pci_clk),
3430
      .sync_data_out  (meta_cache_lsize_to_pci_bits),
3431
      .async_reset    (reset)
3432
  ) ;
3433
  always@(posedge pci_clk or posedge reset)
3434
  begin
3435
      if (reset)
3436
          sync_cache_lsize_to_pci_bits <= 6'b0 ;
3437
      else
3438
          sync_cache_lsize_to_pci_bits <= meta_cache_lsize_to_pci_bits ;
3439
  end
3440
  wire [7:2] sync_cache_line_size_to_pci_reg    = sync_cache_lsize_to_pci_bits[7:2] ;
3441
  wire [7:2] sync_cache_line_size_to_wb_reg             = cache_line_size_reg[7:2] ;
3442
  wire           sync_cache_lsize_not_zero_to_wb        = cache_lsize_not_zero ;
3443
// Latency timer is sinchronized only to PCI clock when bridge implementation is HOST
3444
  wire [7:0] latency_timer_bits = latency_timer ;
3445
  wire [7:0] meta_latency_timer_bits ;
3446
  reg  [7:0] sync_latency_timer_bits ;
3447 111 simons
  pci_synchronizer_flop   #(8, 0)  latency_timer_bits_sync
3448 77 mihad
  (
3449
      .data_in        (latency_timer_bits),
3450
      .clk_out        (pci_clk),
3451
      .sync_data_out  (meta_latency_timer_bits),
3452
      .async_reset    (reset)
3453
  ) ;
3454
  always@(posedge pci_clk or posedge reset)
3455
  begin
3456
      if (reset)
3457
          sync_latency_timer_bits <= 8'b0 ;
3458
      else
3459
          sync_latency_timer_bits <= meta_latency_timer_bits ;
3460
  end
3461
  wire [7:0] sync_latency_timer = sync_latency_timer_bits ;
3462
`else   // GUEST
3463
  wire [8:2] cache_lsize_to_wb_bits = { cache_lsize_not_zero, cache_line_size_reg[7:2] } ;
3464
  wire [8:2] meta_cache_lsize_to_wb_bits ;
3465
  reg  [8:2] sync_cache_lsize_to_wb_bits ;
3466 111 simons
  pci_synchronizer_flop   #(7, 0)  cache_lsize_to_wb_bits_sync
3467 77 mihad
  (
3468
      .data_in        (cache_lsize_to_wb_bits),
3469
      .clk_out        (wb_clk),
3470
      .sync_data_out  (meta_cache_lsize_to_wb_bits),
3471
      .async_reset    (reset)
3472
  ) ;
3473
  always@(posedge wb_clk or posedge reset)
3474
  begin
3475
      if (reset)
3476
          sync_cache_lsize_to_wb_bits <= 7'b0 ;
3477
      else
3478
          sync_cache_lsize_to_wb_bits <= meta_cache_lsize_to_wb_bits ;
3479
  end
3480
  wire [7:2] sync_cache_line_size_to_pci_reg    = cache_line_size_reg[7:2] ;
3481
  wire [7:2] sync_cache_line_size_to_wb_reg             = sync_cache_lsize_to_wb_bits[7:2] ;
3482
  wire           sync_cache_lsize_not_zero_to_wb        = sync_cache_lsize_to_wb_bits[8] ;
3483
// Latency timer
3484
  wire [7:0] sync_latency_timer = latency_timer ;
3485
`endif
3486
// PCI header output from cache_line_size, latency timer and interrupt pin
3487
assign          cache_line_size_to_pci          = {sync_cache_line_size_to_pci_reg, 2'h0} ;  // [7 : 0] to PCI clock
3488
assign          cache_line_size_to_wb           = {sync_cache_line_size_to_wb_reg, 2'h0} ;   // [7 : 0] to WB clock
3489
assign          cache_lsize_not_zero_to_wb      = sync_cache_lsize_not_zero_to_wb ;
3490
 
3491
assign          latency_tim[7 : 0]     = sync_latency_timer ;                    // to PCI clock
3492
//assign                int_pin[2 : 0]         = r_interrupt_pin ;
3493
assign          int_out                            = interrupt_out ;
3494
// PCI output from image registers
3495
//   base address, address mask, translation address and control registers are sinchronized in PCI_DECODER.V module
3496
assign          pci_base_addr0 = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3497
assign          pci_base_addr1 = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3498
assign          pci_base_addr2 = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3499
assign          pci_base_addr3 = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3500
assign          pci_base_addr4 = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3501
assign          pci_base_addr5 = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3502
assign          pci_memory_io0 = pci_ba0_bit0 ;
3503
assign          pci_memory_io1 = pci_ba1_bit0 ;
3504
assign          pci_memory_io2 = pci_ba2_bit0 ;
3505
assign          pci_memory_io3 = pci_ba3_bit0 ;
3506
assign          pci_memory_io4 = pci_ba4_bit0 ;
3507
assign          pci_memory_io5 = pci_ba5_bit0 ;
3508
assign          pci_addr_mask0 = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3509
assign          pci_addr_mask1 = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3510
assign          pci_addr_mask2 = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3511
assign          pci_addr_mask3 = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3512
assign          pci_addr_mask4 = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3513
assign          pci_addr_mask5 = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3514
assign          pci_tran_addr0 = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3515
assign          pci_tran_addr1 = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3516
assign          pci_tran_addr2 = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3517
assign          pci_tran_addr3 = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3518
assign          pci_tran_addr4 = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3519
assign          pci_tran_addr5 = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3520
assign          pci_img_ctrl0[2 : 1] = pci_img_ctrl0_bit2_1 ;
3521
assign          pci_img_ctrl1[2 : 1] = pci_img_ctrl1_bit2_1 ;
3522
assign          pci_img_ctrl2[2 : 1] = pci_img_ctrl2_bit2_1 ;
3523
assign          pci_img_ctrl3[2 : 1] = pci_img_ctrl3_bit2_1 ;
3524
assign          pci_img_ctrl4[2 : 1] = pci_img_ctrl4_bit2_1 ;
3525
assign          pci_img_ctrl5[2 : 1] = pci_img_ctrl5_bit2_1 ;
3526
// WISHBONE output from image registers
3527
//   base address, address mask, translation address and control registers are sinchronized in DECODER.V module
3528
assign          wb_base_addr0 = wb_ba0_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3529
assign          wb_base_addr1 = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3530
assign          wb_base_addr2 = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3531
assign          wb_base_addr3 = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3532
assign          wb_base_addr4 = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3533
assign          wb_base_addr5 = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3534
assign          wb_memory_io0 = wb_ba0_bit0 ;
3535
assign          wb_memory_io1 = wb_ba1_bit0 ;
3536
assign          wb_memory_io2 = wb_ba2_bit0 ;
3537
assign          wb_memory_io3 = wb_ba3_bit0 ;
3538
assign          wb_memory_io4 = wb_ba4_bit0 ;
3539
assign          wb_memory_io5 = wb_ba5_bit0 ;
3540
assign          wb_addr_mask0 = wb_am0[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3541
assign          wb_addr_mask1 = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3542
assign          wb_addr_mask2 = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3543
assign          wb_addr_mask3 = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3544
assign          wb_addr_mask4 = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3545
assign          wb_addr_mask5 = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3546
assign          wb_tran_addr0 = wb_ta0[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3547
assign          wb_tran_addr1 = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3548
assign          wb_tran_addr2 = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3549
assign          wb_tran_addr3 = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3550
assign          wb_tran_addr4 = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3551
assign          wb_tran_addr5 = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3552
assign          wb_img_ctrl0[2 : 0] = wb_img_ctrl0_bit2_0 ;
3553
assign          wb_img_ctrl1[2 : 0] = wb_img_ctrl1_bit2_0 ;
3554
assign          wb_img_ctrl2[2 : 0] = wb_img_ctrl2_bit2_0 ;
3555
assign          wb_img_ctrl3[2 : 0] = wb_img_ctrl3_bit2_0 ;
3556
assign          wb_img_ctrl4[2 : 0] = wb_img_ctrl4_bit2_0 ;
3557
assign          wb_img_ctrl5[2 : 0] = wb_img_ctrl5_bit2_0 ;
3558
// GENERAL output from conf. cycle generation register & int. control register
3559
assign          config_addr[23 : 0] = { cnf_addr_bit23_2, 1'b0, cnf_addr_bit0 } ;
3560
assign          icr_soft_res = icr_bit31 ;
3561
 
3562
 
3563
endmodule
3564
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.