📄 pci_wb_slave.v
字号:
input [31:0] SDATA_I ; // WISHBONE slave interface input data busoutput [31:0] SDATA_O ; // WISHBONE slave interface output data busoutput ACK_O ; // Acknowledge output - qualifies valid data on data output bus or received data on data input busoutput RTY_O ; // retry output - signals to WISHBONE master that cycle should be terminated and retried lateroutput ERR_O ; // Signals to WISHBONE master that access resulted in an errorinput CAB_I ; // consecutive address burst input - indicates that master will do a serial address transfer in current cycle`ifdef REGISTER_WBS_OUTPUTSreg [31:0] SDATA_O ;reg ACK_O ;reg RTY_O ;reg ERR_O ;reg [3:0] del_bc_out ; // delayed transaction bus command outputreg del_req_out ; // output for issuing delayed transaction requestsreg del_done_out ; // output indicating current delayed completion finished on WISHBONE busreg del_burst_out ; // delayed burst transaction indicatorreg del_in_progress_out ; // delayed in progress indicator - since delayed transaction can be a burst transaction, progress indicator must be used for proper operationreg del_write_out ; // write enable for delayed transaction - used for indicating that transaction is a write`ifdef HOSTreg wb_conf_wenable_out ;reg [31:0] wb_conf_data_out ; // configuration data output for configuration space`endifreg [3:0] wb_conf_be_out ; // byte enable outputs for configuration spacereg [31:0] wb_data_out ;reg [3:0] wb_cbe_out ;reg wbw_fifo_wenable_out ; // write enable for WBW_FIFO outputreg [3:0] wbw_fifo_control_out ; // control bus output for WBW_FIFOreg wbr_fifo_renable_out ; // WBR_FIFO read enable output`endifreg [(`FSM_BITS - 1):0] c_state ; //current state registerreg [(`FSM_BITS - 1):0] n_state ; //next state input to current state register// state machine register controlalways@(posedge wb_clock_in or posedge reset_in)begin if (reset_in) c_state <= #`FF_DELAY S_IDLE ; else c_state <= #`FF_DELAY n_state ;end// variable for bus command multiplexer logic output for delayed requestsreg [3:0] del_bc ;//register for intermediate data and select storagereg [35:0] d_incoming ;// enable for incoming data registerreg d_incoming_ena ;// incoming data register control logicalways@(posedge wb_clock_in or posedge reset_in)begin if (reset_in) d_incoming <= #`FF_DELAY {35{1'b0}} ; else if (d_incoming_ena) d_incoming <= #`FF_DELAY {SEL_I, SDATA_I} ;end/*===================================================================================================================================================================================Write allow for image accesses. Writes through images are allowed when all of following are true:- WBW_FIFO musn't be almost full nor full for image writes to be allowed - Every transaction takes at least two locations in the FIFO- delayed read from from WISHBONE to PCI request musn't be present- delayed read from PCI to WISHBONE completion musn't be present- lock input musn't be set - it can be set because of error reporting or because PCI master state machine is disabled===================================================================================================================================================================================*/wire wimg_wallow = ~|{ wbw_fifo_almost_full_in , wbw_fifo_full_in, wb_del_req_pending_in, pci_drcomp_pending_in, wbs_lock_in } ;reg img_wallow ;/*===================================================================================================================================================================================WISHBONE slave can request an image read accesses when all of following are true:- delayed completion is not present- delayed request is not present- operation is not locked because of error reporting mechanism or because PCI master is disabled===================================================================================================================================================================================*/wire wdo_del_request = ~|{ wb_del_req_pending_in, wb_del_comp_pending_in, wbs_lock_in } ;reg do_del_request ;/*===================================================================================================================================================================================WISHBONE slave can complete an image read accesses when all of following are true:- delayed read completion is present- delayed read completion is the same as current read access ( dread_completion_hit is 1 )- PCI Write FIFO is empty - no posted write is waiting to be finished in PCIW_FIFO- WBR_FIFO empty status is not active===================================================================================================================================================================================*/wire wdel_addr_hit = ( wb_del_addr_in == wb_addr_in ) && ( SEL_I == wb_del_be_in ) ;reg del_addr_hit ;wire wdel_completion_allow = wb_del_comp_pending_in && ((~del_write_in && ~WE_I && pciw_fifo_empty_in && ~wbr_fifo_empty_in) || (del_write_in && WE_I)) ;reg del_completion_allow ;/*----------------------------------------------------------------------------------------------------------------------img_hit - state of wb_hit_in bus when when state machine signals decode is over---------------------------------------------------------------------------------------------------------------------*/reg [4:0] img_hit ;wire wb_hit = |( img_hit ) ;/*----------------------------------------------------------------------------------------------------------------------Control logic for image control signalspref_en - prefetch enable of currently selected imagemrl_en - Memory read line enable of currently selected imagemap - Address space mapping for currently selected image---------------------------------------------------------------------------------------------------------------------*/reg pref_en, mrl_en, map ;wire wpref_en = |(wb_pref_en_in & wb_hit_in) ;wire wmrl_en = |(wb_mrl_en_in & wb_hit_in) ;wire wmap = |(wb_map_in & wb_hit_in) ;// state machine controls when results from decoders, comparison etc. are sampled into registers to decode an accessreg decode_en ;reg wb_conf_hit ;always@(posedge reset_in or posedge wb_clock_in)begin if (reset_in) begin img_wallow <= #`FF_DELAY 1'b0 ; wb_conf_hit <= #`FF_DELAY 1'b0 ; do_del_request <= #`FF_DELAY 1'b0 ; del_addr_hit <= #`FF_DELAY 1'b0 ; del_completion_allow <= #`FF_DELAY 1'b0 ; img_hit <= #`FF_DELAY 5'h00 ; pref_en <= #`FF_DELAY 1'b0 ; mrl_en <= #`FF_DELAY 1'b0 ; map <= #`FF_DELAY 1'b0 ; end else if (decode_en) begin img_wallow <= #`FF_DELAY wimg_wallow ; wb_conf_hit <= #`FF_DELAY wb_conf_hit_in ; do_del_request <= #`FF_DELAY wdo_del_request ; del_addr_hit <= #`FF_DELAY wdel_addr_hit ; del_completion_allow <= #`FF_DELAY wdel_completion_allow ; img_hit <= #`FF_DELAY wb_hit_in ; pref_en <= #`FF_DELAY wpref_en && cache_line_size_not_zero ; mrl_en <= #`FF_DELAY wmrl_en && cache_line_size_not_zero ; map <= #`FF_DELAY wmap ; endendwire del_burst = CAB_I && (pref_en || mrl_en) && ~WE_I && cache_line_size_not_zero ; // delayed burst indicator - only when WB master attempts CAB transfer and cache line size register is set appropriately and // either prefetch enable or memory read line enable of corresponding image are set - // applies for reads only - delayed write cannot be a burstwire do_dread_completion = del_completion_allow && del_addr_hit ;`ifdef GUEST // wires indicating allowance for configuration cycle generation requests wire do_ccyc_req = 1'b0 ; wire do_ccyc_comp = 1'b0 ; // wires indicating allowance for interrupt acknowledge cycle generation requests wire do_iack_req = 1'b0 ; wire do_iack_comp = 1'b0 ; // variables for configuration access control signals reg conf_wenable ; assign wb_conf_wenable_out = 1'b0 ; // configuration cycle data register hit wire ccyc_hit = 1'b0 ; wire iack_hit = 1'b0 ; wire wccyc_hit = 1'b0 ; wire wiack_hit = 1'b0 ;`else`ifdef HOST // only host implementation has access for generating interrupt acknowledge and configuration cycles // configuration cycle data register hit reg current_delayed_is_ccyc ; reg current_delayed_is_iack ; wire wccyc_hit = (wb_addr_in[8:2] == {1'b1, `CNF_DATA_ADDR}) ; wire wiack_hit = (wb_addr_in[8:2] == {1'b1, `INT_ACK_ADDR}) ; reg iack_hit ; reg ccyc_hit ; always@(posedge reset_in or posedge wb_clock_in) begin if (reset_in) begin ccyc_hit <= #`FF_DELAY 1'b0 ; iack_hit <= #`FF_DELAY 1'b0 ; end else if (decode_en) begin ccyc_hit <= #`FF_DELAY wccyc_hit ; iack_hit <= #`FF_DELAY wiack_hit ; end end // wires indicating allowance for configuration cycle generation requests wire do_ccyc_req = do_del_request && ccyc_hit; wire do_ccyc_comp = del_completion_allow && ccyc_hit && current_delayed_is_ccyc ; // && del_bc_hit // wires indicating allowance for interrupt acknowledge cycle generation requests wire do_iack_req = do_del_request && iack_hit ; wire do_iack_comp = del_completion_allow && iack_hit && current_delayed_is_iack ; // && del_bc_hit // variables for configuration access control signals reg conf_wenable ; // following flip-flops remember whether current delayed transaction is interrupt acknowledge or configuration cycle transaction always@(posedge wb_clock_in or posedge reset_in) begin if ( reset_in ) begin current_delayed_is_ccyc <= #`FF_DELAY 1'b0 ; current_delayed_is_iack <= #`FF_DELAY 1'b0 ; end else if ( del_done_out ) begin current_delayed_is_ccyc <= #`FF_DELAY 1'b0 ; current_delayed_is_iack <= #`FF_DELAY 1'b0 ; end else if ( del_req_out && wb_conf_hit ) begin current_delayed_is_ccyc <= #`FF_DELAY do_ccyc_req ; current_delayed_is_iack <= #`FF_DELAY do_iack_req ; end end`endif`endif// configuration read enable - supplied for host and guest bridgesreg conf_renable ;assign wb_conf_renable_out = conf_renable ;// burst access indicatorwire burst_transfer = CYC_I && CAB_I ;// WBW_FIFO control outputreg [3:0] wbw_fifo_control ;// WBW_FIFO wenable output assignmentreg wbw_fifo_wenable ;// WBR_FIFO control outputsreg wbr_fifo_flush, wbr_fifo_renable ; // flush and read enable outputs// flush signal for WBR_FIFO must be registered, since it asinchronously resets some status registerswire wbr_fifo_flush_reg ;pci_async_reset_flop async_reset_as_wbr_flush( .data_in (wbr_fifo_flush), .clk_in (wb_clock_in), .async_reset_data_out (wbr_fifo_flush_reg), .reset_in (reset_in)) ;assign wbr_fifo_flush_out = wbr_fifo_flush_reg ;// delayed transaction request control signalsreg del_req, del_done ;// WISHBONE handshaking control outputsreg ack, rty, err ;`ifdef REGISTER_WBS_OUTPUTS// wire for write attempt - 1 when external WB master is attempting a write// wire for read attempt - 1 when external master is attempting a readwire wattempt = ( CYC_I && STB_I && WE_I ) && (!ACK_O && !ERR_O && !RTY_O) ;wire rattempt = ( CYC_I && STB_I && ~WE_I ) && (!ACK_O && !ERR_O && !RTY_O) ;`else// wire for write attempt - 1 when external WB master is attempting a write// wire for read attempt - 1 when external master is attempting a readwire wattempt = ( CYC_I && STB_I && WE_I ) ; // write is qualified when cycle, strobe and write enable inputs are all highwire rattempt = ( CYC_I && STB_I && ~WE_I ) ; // read is qualified when cycle and strobe are high and write enable is low`endif/*----------------------------------------------------------------------------------------------------------------------Delayed transaction bus command generationBus command for delayed reads depends on image's address space mapping and control bits andwhether or not these are interrupt acknowledge requests or configuration cycle requests
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -