📄 pci_target32_sm.v
字号:
sm_transfere <= 1'b0 ; state_default <= 1'b0 ; n_state <= S_TRANSFERE ; end S_TRANSFERE : begin state_idle <= 1'b0 ; state_wait <= 1'b0 ; sm_transfere <= 1'b1 ; state_default <= 1'b0 ; n_state <= S_IDLE ; end default : begin state_idle <= 1'b0 ; state_wait <= 1'b0 ; sm_transfere <= 1'b0 ; state_default <= 1'b1 ; n_state <= S_IDLE ; end endcaseend // if not retry and not target abort // NO CRITICAL SIGNALSwire trdy_w = ( (state_wait && ~cnf_progress && rw_cbe0 && wr_progress && ~target_abort_in) || (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && ~target_abort_in && !pcir_fifo_data_err_in) || (state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && norm_access_to_conf_reg && ~target_abort_in) || (state_wait && cnf_progress && ~target_abort_in) ) ; // if not disconnect without data and not target abort (only during reads) // MUST BE ANDED WITH CRITICAL ~FRAMEwire trdy_w_frm = ( (state_transfere && !cnf_progress && !norm_access_to_conf_reg && rw_cbe0 && !disconect_wo_data) || (state_transfere && !cnf_progress && !norm_access_to_conf_reg && ~rw_cbe0 && !disconect_wo_data && ~pcir_fifo_data_err_in) || (state_transfere && !cnf_progress && !norm_access_to_conf_reg && disconect_w_data && pci_irdy_reg_in && ((~rw_cbe0 && ~pcir_fifo_data_err_in) || rw_cbe0)) ) ; // if not disconnect without data and not target abort (only during reads) // MUST BE ANDED WITH CRITICAL ~FRAME AND IRDYwire trdy_w_frm_irdy = ( ~bckp_trdy_in ) ;// TRDY critical module used for preserving the architecture because of minimum delay for critical inputspci_target32_trdy_crit pci_target_trdy_critical( .trdy_w (trdy_w), .trdy_w_frm (trdy_w_frm), .trdy_w_frm_irdy (trdy_w_frm_irdy), .pci_frame_in (pci_frame_in), .pci_irdy_in (pci_irdy_in), .pci_trdy_out (pci_trdy_out)); // if target abort or retry // NO CRITICAL SIGNALSwire stop_w = ( (state_wait && target_abort_in) || (state_wait && ~cnf_progress && rw_cbe0 && ~wr_progress) || (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && ~rd_progress) || (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && pcir_fifo_data_err_in) || (state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && ~norm_access_to_conf_reg) ) ; // if asserted, wait for deactivating the frame // MUST BE ANDED WITH CRITICAL ~FRAMEwire stop_w_frm = ( (state_backoff && ~bckp_stop_in) ) ; // if target abort or if disconnect without data (after data transfere) // MUST BE ANDED WITH CRITICAL ~FRAME AND ~IRDYwire stop_w_frm_irdy = ( (state_transfere && (disconect_wo_data)) || (state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in) ) ;// STOP critical module used for preserving the architecture because of minimum delay for critical inputspci_target32_stop_crit pci_target_stop_critical( .stop_w (stop_w), .stop_w_frm (stop_w_frm), .stop_w_frm_irdy (stop_w_frm_irdy), .pci_frame_in (pci_frame_in), .pci_irdy_in (pci_irdy_in), .pci_stop_out (pci_stop_out)); // if OK to respond and not target abort // NO CRITICAL SIGNALSwire devs_w = ( (addr_phase && config_access) || (addr_phase && ~config_access && addr_claim_in) || (state_wait && ~target_abort_in && !(~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && pcir_fifo_data_err_in) ) ) ; // if not target abort (only during reads) or if asserted, wait for deactivating the frame // MUST BE ANDED WITH CRITICAL ~FRAMEwire devs_w_frm = ( (state_transfere && rw_cbe0) || (state_transfere && ~rw_cbe0 && ~pcir_fifo_data_err_in) || (state_backoff && ~bckp_devsel_in) ) ; // if not target abort (only during reads) // MUST BE ANDED WITH CRITICAL ~FRAME AND IRDYwire devs_w_frm_irdy = ( (state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in) ) ;// DEVSEL critical module used for preserving the architecture because of minimum delay for critical inputspci_target32_devs_crit pci_target_devsel_critical( .devs_w (devs_w), .devs_w_frm (devs_w_frm), .devs_w_frm_irdy (devs_w_frm_irdy), .pci_frame_in (pci_frame_in), .pci_irdy_in (pci_irdy_in), .pci_devsel_out (pci_devsel_out));// signal used in AD enable module with preserving the hierarchy because of minimum delay for critical inputsassign pci_ad_en_out = ( (addr_phase && config_access && ~pci_cbe_reg_in[0]) || (addr_phase && ~config_access && addr_claim_in && ~pci_cbe_reg_in[0]) || (state_wait && ~rw_cbe0) || (state_transfere && ~rw_cbe0) || (state_backoff && ~rw_cbe0 && ~pci_frame_reg_in) ) ;wire fast_back_to_back = (addr_phase && ~pci_irdy_reg_in) ; // if cycle will progress or will not be stopped // NO CRITICAL SIGNALSwire ctrl_en = /*(~wbu_frame_en_in && fast_back_to_back) ||*/ (addr_phase && config_access) || (addr_phase && ~config_access && addr_claim_in) || (state_wait) || (state_transfere && ~(pci_frame_reg_in && ~pci_irdy_reg_in && (~pci_stop_reg_in || ~pci_trdy_reg_in))) || (state_backoff && ~(pci_frame_reg_in && ~pci_irdy_reg_in && (~pci_stop_reg_in || ~pci_trdy_reg_in))) ;assign pci_trdy_en_out = ctrl_en ;assign pci_stop_en_out = ctrl_en ;assign pci_devsel_en_out = ctrl_en ;// target ready output signal delayed for one clock used in conjunction with irdy_reg to select which// data are registered in io mux module - from fifo or medoum registerreg bckp_trdy_reg ;// delayed indicators for states transfere and backoffreg state_transfere_reg ;reg state_backoff_reg ;always@(posedge clk_in or posedge reset_in)begin if (reset_in) begin bckp_trdy_reg <= #`FF_DELAY 1'b1 ; state_transfere_reg <= #`FF_DELAY 1'b0 ; state_backoff_reg <= #`FF_DELAY 1'b0 ; end else begin bckp_trdy_reg <= #`FF_DELAY bckp_trdy_in ; state_transfere_reg <= #`FF_DELAY state_transfere ; state_backoff_reg <= #`FF_DELAY state_backoff ; endend// Read control signals assignmentsassign fetch_pcir_fifo_out = ( (prepare_rd_fifo_data) || (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~target_abort_in) || (bckp_trdy_en_in && ~pci_trdy_reg_in && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~pci_irdy_reg_in) ) ;assign ad_load_out = (state_wait) ;assign ad_load_on_transfer_out = (bckp_trdy_en_in && ~rw_cbe0) ;assign load_medium_reg_out = ( (prepare_rd_fifo_data) || (state_wait && ~rw_cbe0 && ~cnf_progress && same_read_reg && rd_from_fifo && ~target_abort_in) || (~pci_irdy_reg_in && ~rw_cbe0 && ~cnf_progress && same_read_reg && rd_from_fifo && ~pci_trdy_reg_in && bckp_trdy_en_in) ) ;assign sel_fifo_mreg_out = (~pci_irdy_reg_in && ~bckp_trdy_reg) ;`ifdef HOST `ifdef NO_CNF_IMAGE assign sel_conf_fifo_out = 1'b0 ; `else assign sel_conf_fifo_out = (cnf_progress || norm_access_to_conf_reg) ; `endif`else assign sel_conf_fifo_out = (cnf_progress || norm_access_to_conf_reg) ;`endif// Write control signals assignmentsassign load_to_pciw_fifo_out = ( (state_wait && (~cnf_progress && ~norm_access_to_conf_reg) && rw_cbe0 && wr_to_fifo && ~target_abort_in) || (state_transfere_reg && ~state_backoff && rw_cbe0 && wr_to_fifo /*&& ~disconect_wo_data_reg*/ && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg)) || ((state_backoff || state_backoff_reg) && rw_cbe0 && wr_to_fifo && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg)) ) ;`ifdef HOST `ifdef NO_CNF_IMAGE assign load_to_conf_out = 1'b0 ; `else assign load_to_conf_out = ( (state_transfere_reg && cnf_progress && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) || (state_transfere_reg && norm_access_to_conf_reg && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) ) ; `endif`else assign load_to_conf_out = ( (state_transfere_reg && cnf_progress && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) || (state_transfere_reg && norm_access_to_conf_reg && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) ) ;`endif// General control sigal assignmentsassign addr_phase_out = addr_phase ;assign last_reg_out = (pci_frame_reg_in && ~pci_irdy_reg_in) ;assign frame_reg_out = pci_frame_reg_in ;assign bckp_devsel_out = bckp_devsel_in ;assign bckp_trdy_out = bckp_trdy_in ;assign bckp_stop_out = bckp_stop_in ;assign target_abort_set_out = (bckp_devsel_in && bckp_trdy_in && ~bckp_stop_in && bckp_trdy_en_in) ;// request signal for delayed sinc. modulereg master_will_request_read ;always@(posedge clk_in or posedge reset_in)begin if ( reset_in ) master_will_request_read <= #`FF_DELAY 1'b0 ; else master_will_request_read <= #`FF_DELAY ((state_wait && ~target_abort_in) || (state_backoff && ~target_abort_set_out)) && ~cnf_progress && ~norm_access_to_conf_reg && ~rw_cbe0 && rd_request ;end// MORE OPTIMIZED READS, but not easy to control in a testbench!//assign req_out = master_will_request_read ; assign req_out = master_will_request_read && !pci_irdy_reg_in && !read_processing_in ;// ready tells when address or data are written into fifo - RDY ? DATA : ADDRESSassign rdy_out = ~bckp_trdy_reg ;// data and address outputs assignments!assign pci_ad_out = data_in ;assign data_out = pci_ad_reg_in ;assign be_out = pci_cbe_reg_in ;assign next_be_out = pci_cbe_in ;assign address_out = pci_ad_reg_in ;assign bc_out = pci_cbe_reg_in ;assign bc0_out = rw_cbe0 ;endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -