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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_00/] [rtl/] [verilog/] [conf_space.v] - Blame information for rev 154

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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