HierarchyFilesModulesSignalsTasksFunctionsHelp
Prev12345678910
	                      end
	     mem_write64:     begin 
                                bus_64 = `true;
                                size = 64;
                                bit_cmd = 4'b0111;
		                hexaddress[1 : 0] = mode_local;
	                      end
	     rsvd9:           begin 
                                bus_64 = `false;
                                size = 32;
                                bit_cmd = 4'b1001;
			        hexaddress[1 : 0] = mode_local;				   
	                      end
	     config_write:    begin
                                bus_64 = `false;
                                size = 32;
                                bit_cmd = 4'b1011;
	                      end
	     mem_write_inv:   begin 
                                bus_64 = `false;
                                size = 32;
                                bit_cmd = 4'b1111;
		                hexaddress[1 : 0] = mode_local;
	                      end
	     mem_write_inv64: begin 
                                bus_64 = `true;
                                size = 64;
                                bit_cmd = 4'b1111;
		                hexaddress[1 : 0] = mode_local;
	                      end
	   endcase
	end // if
        addr = hexaddress;
	pci_command = (bit_cmd);
        cmmd = bit_cmd;
        if ( bit_cmd[0] ===1'b0 ) begin 
          command = read;
        end else if ( bit_cmd[0] ===1'b1 ) begin 
          command = write;
        end else begin
          if (!((msg_level<`warnings))) begin
            $display("NOTE at %0t from %m",$time);
            $write("     \"error! command is unknown");
            $display("\"");
          end
        end // if

  	cdelay_local = cdelay_local_tmp;
      
        if ( curr_cmd[inlock1:inlock2] ) begin
          bits[1] = 1'b1;
        end else begin
          bits[1] = 1'b0;
        end // if
      
        bits[3] = 1'b1;     // set to check_data true always
  
        if ( command === write ) begin
          was_wr = 1'b1;
        end else begin
          was_wr = 1'b0;
        end // if
      
        same_agnt = bits[0];
        lock = bits[1];
        back2back = bits[2];
        check_data = (bits[3] === 1'b1);    // not used in the model

      
// do the following so that the step line gets initialized appropriately

        if ( initialize && sdelay !== 0 && cdelay_local === 0 ) begin
          cdelay_local = 1;
        end // if
      
        if ( cdelay_local !== 0 ) begin
          cstate = cmd_dly;
          cstate_rw = `false;
	  cmd_in_progress = 1'b0;    
          cmmd_ready = 1'b0;
          back_to_back = 1'b0;
        end else if ( !(burst_cycle) ) begin              // cstate becomes cmd_rdy only after burst cycles
          cstate = cmd_rdy;
          cstate_rw = `false;
          cmmd_ready = 1'b1;
          back_to_back = back2back;
        end // if
      end // if           

       if ( (wakeup_num === 0) && !(syncout_active[0]) ) begin    
         syncout[0]  <= #(1*`time_scale_multiplier)  1'b1   ;                             
         syncout_active[0] = `true;
       end // if
       if ( (wakeup_num === 1) && !(syncout_active[1]) ) begin
         syncout[1]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[1] = `true;
       end // if
       if ( (wakeup_num === 2) && !(syncout_active[2]) ) begin
         syncout[2]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[2] = `true;
       end // if
       if ( (wakeup_num === 3) && !(syncout_active[3]) ) begin
         syncout[3]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[3] = `true;
       end // if
       if ( (wakeup_num === 4) && !(syncout_active[4]) ) begin
         syncout[4]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[4] = `true;
       end // if
       if ( (wakeup_num === 5) && !(syncout_active[5]) ) begin
         syncout[5]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[5] = `true;
       end // if
       if ( (wakeup_num === 6) && !(syncout_active[6]) ) begin
         syncout[6]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[6] = `true;
       end // if
       if ( (wakeup_num === 7) && !(syncout_active[7]) ) begin
         syncout[7]  <= #(1*`time_scale_multiplier)  1'b1   ;      
         syncout_active[7] = `true;
       end // if
       
       wakeup_num = -1;
       if ( pe === 1 ) begin
          bad_data_parity = `true;
          bad_addr_parity = `false;
        end else if ( pe === 2 ) begin
          bad_addr_parity = `true;
          bad_data_parity = `false;
        end else begin
          bad_data_parity = `false;
          bad_addr_parity = `false;
        end // if

        temp_byte = curr_cmd[inbyten1:inbyten2];
        byte_enables = temp_byte[3:0];
        if ( (size === 64) ) begin
//  	  {byte_enables_7to4, byte_enables} = curr_cmd[inbyten1:inbyten2];
  	  byte_enables_7to4 = temp_byte[7:4];
        end // if

        delays = curr_cmd[indelay1:indelay2];                   
        if ( command === write ) begin
	  if ( (size === 64) ) begin
	    temp_data = curr_cmd[indata1:indata2];
	    data_words = temp_data[31 : 0];
	    data_words_63to32 = temp_data[63 : 32];
          end else begin
	    temp_data = curr_cmd[indata1:indata2];
	    data_words = temp_data[31 : 0];
//	    data_words = curr_cmd[indata1:indata2];
          end // if
        end // if 


        case ( pci_command )
           0      : begin cmdstr = "INTERRUPT ACKNOWLEDGE    ";
          end
           1      : begin cmdstr = "SPECIAL CYCLE            ";
          end
           2      : begin cmdstr = "I/O READ                 ";
          end
           3      : begin cmdstr = "I/O WRITE                ";
          end
           4      : begin cmdstr = "RESERVED 4               ";
          end
           5      : begin cmdstr = "RESERVED 5               ";
          end
           6      : begin cmdstr = "MEMORY READ              ";
          end
           7      : begin cmdstr = "MEMORY WRITE             ";
          end
           8      : begin cmdstr = "RESERVED 8               ";
          end
           9      : begin cmdstr = "RESERVED 9               ";
          end
           10     : begin cmdstr = "CONFIGURATION READ       ";
          end
           11     : begin cmdstr = "CONFIGURATION WRITE      ";
          end
           12     : begin cmdstr = "MEMORY READ MULTIPLE     ";
          end
           13     : begin cmdstr = "DUAL ADDRESS CYCLE       ";
          end
           14     : begin cmdstr = "MEMORY READ LINE         ";
          end
           15     : begin cmdstr = "MEMORY WRITE & INVALIDATE";
          end
           16     : begin cmdstr = "NONE                     ";
          end
           default begin  cmdstr = "UNKNOWN COMMAND          ";
	 end
	 endcase

       if ((pci_command === 15) && ((curr_cmd[incode1:incode2]  === 
           `write_cycle_cmd)||(curr_cmd[incode1:incode2]===`read_cycle_cmd))) begin
         if (mode_local != 2'b00) begin
           if (!((msg_level<`warnings))) begin
             $display("NOTE at %0t from %m",$time);
             $write("     Illegal MWI command : Only linear addressing order can be used");
             $display(" for Memory write and Invalidate cycles");
           end
         end
         if (tc-1 != cacheline_size_reg) begin
           if (!((msg_level<`warnings))) begin
             $display("NOTE at %0t from %m",$time);
             $write("     Illegal MWI command : transfer count parameter specified in command");
             $display(" is not equal to cacheline size");
           end   
         end
         if (cacheline_size_reg === 0) begin
           if (!((msg_level<`warnings))) begin
             $display("NOTE at %0t from %m",$time);
             $write("     Illegal MWI command : cacheline size = 0");
             $display("");
           end
         end
         else if ((addr[9:2] % (cacheline_size_reg + 1)) !== 0) begin
$display($time, ,"%h %h",addr[9:2], cacheline_size_reg);
             $display("NOTE at %0t from %m",$time);
             $write("     Illegal MWI command : address is not cacheline size aligned");
             $display("");
         end
       end  
       if ( curr_cmd[inlock1:inlock2] === `true ) begin
         lock_str = "TRUE ";
       end // if
       if ( lastcmd_back === `true ) begin
         back_str = "TRUE ";
       end // if
       if ( lastcmd_same === `true ) begin
         same_str = "TRUE ";
       end // if
       if ( addr_64 === `true ) begin
         a64_str = "TRUE ";
       end // if
     
       if (!((msg_level<`debug_2))) begin
         $display("NOTE at %0t from %m",$time);
         $write("     \" ");
         $display("");
         $write("READ_WRITE_CMD");
         $display("");
         $write("CODE        = ");
         $write("%0h",(pci_command));
         $write("  : ");
         $write("%s",cmdstr);
         $display("");
         $write("SIZE        = ");
         $write("%0d",size);
         $display("");
         $write("UPPER_ADDR  = ");
         $write("%h",upper_addr);
         $display("");
         $write("ADDR        = ");
         $write("%h",(curr_cmd[inaddr1:inaddr2]));
         $display("");
         $write("TC          = ");
         $write("%0d",(curr_cmd[intc1:intc2]));
         $display("");
         $write("BYTEN       = ");
         $write("%h",(curr_cmd[inbyten1:inbyten2]));
         $display("");
         $write("CDELAY      = ");
         $write("%0d",cdelay_local1);
         $display("");
         $write("UPPER_DATA  = ");
         $write("%h",(data_words_63to32));
         $display("");
         $write("DATA        = ");
         $write("%h",(data_words));
         $display("");
         $write("DELAY       = ");
         $write("%0d",(curr_cmd[indelay1:indelay2]));
         $display("");
         $write("LOCK        = ");
         $write("%s",lock_str);
         $display("");
         $write("BACK        = ");
         $write("%s",back_str);
         $display("");
         $write("SAME        = ");
         $write("%s",same_str);
         $display("");
         $write("STEP        = ");
         $write("%0d",sdelay);
         $display("");
         $write("ADDR_64     = ");
         $write("%s",a64_str);
         $display("");
         $write("PE          = ");
         $write("%0d",pe);
         $display("");
         $display("\"");
       end
      
      get_non_immed(2, next_cmd);
      if ( tc > 1 ) begin
        get_addr = `false;
        tc = tc - 1;
        burst_cycle = `true;
      end else if ( tc === 1 ) begin
        get_addr = `true;
        burst_cycle = `false;
      end else begin
//        $write("tc is not a correct value \n"); 
      end // if
     
  
      if ( (transfer_cnt < transfer_limit) && (cstate === data_rd) ) begin         // for burst read cycle delays
        transfer_cnt = transfer_cnt + 1;
        byte_en = byte_enables;
        byte_en_7to4 = byte_enables_7to4;
        if ( delays === 0 ) begin
          ready = 1'b1;
          if ( transfer_cnt === transfer_limit && !(bus_64 && (INP.pack64nn === 1'b1)) ) begin
            last_data = 1'b1;
          end else begin
            last_data = 1'b0;
          end // if
          cstate = data_rd;
          cstate_rw = `true;
        end else begin
          if ( !(disconnect_b) ) begin        
            if (!((msg_level<`debug_3))) begin
              $display("NOTE at %0t from %m",$time);
              $write("     \" delays > 0 , ready => '0' after time_unit");
              $display("\"");
            end

            ready = 1'b0;    // frame to '0' and irdy to '1'
          end // if
          delay_cnt = delays;
          cstate = ddelay;
          cstate_rw = `false;
        end // if
      end // if                       
   end

  default 
    begin  
      if (!((INP.prstnn===1'b0))) begin
        $display("NOTE at %0t from %m",$time);
        $write("     \"READ_WRITE CMD : CMD unknown ");
        $display("\"");
      end
    end
  endcase
end
endtask // read_write_cmd;

task masterbe;
begin
  if (!((msg_level<`debug_3))) begin
    $display("NOTE at %0t from %m",$time);
    $write("     \"masterbe");
    $display("\"");
  end

  if ( gnc ) begin
  end else begin
    if ( first_command ) begin
      if ( (curr_cmd[incode1:incode2] !== `configure_cmd) ) begin
        read_write_cmd;
        if ( ! first_reset ) begin
           first_command = `false;
        end // if
      end // if
      if ( sync_first ) begin
	sync_first = `false;
        syncout[7 : 0]  <= #(`time_unit)  (8'b00000000)  ;
      end // if
    end // if

    if ( INP.prstnn_event && (INP.prstnn === 1'b0) && !(reset_model) ) begin                  // do reset 
      reset_model = `true;
      old_reset_model = `true; // laverty
    end else if ( INP.pclk_event && (INP.pclk === 1'b1) && reset_model && (INP.prstnn === 1'b1) ) begin 
      reset_model = `false;                
        
      if ( (cstate === data_wr) ) begin   
        tc = 1;
        get_addr = `true;
        burst_cycle = `false;

// to get rid of burst cycles for write cycles

        gnc = `true;
        ready = 1'b0;
	if ( curr_cmd[incode1:incode2] === `write_cycle_cmd || curr_cmd[incode1:incode2] === `write_continue_cmd ) begin
          delete_cmd_code = `write_continue_cmd;
	  get_nxt_cmd;
	end // if

      end else if ( (cstate === data_rd) ) begin   
        tc = 1;
        get_addr = `true;
        burst_cycle = `false;

// to get rid of burst cycles for read cycles

        gnc = `true;
        ready = 1'b0;

        if ( (INP.pack64nn === 1'b0) ) begin
	  return_data_addrv(addr,x_64);
        end else begin
	  return_data_addrv(addr,x_32);
        end // if
	if ( curr_cmd[incode1:incode2] === `read_cycle_cmd || curr_cmd[incode1:incode2] === `read_continue_cmd ) begin
          delete_cmd_code = `read_continue_cmd;
	  get_nxt_cmd;
	end // if
      end // if
    end else if ( INP.pclk_event && (INP.pclk === 1'b1) && (INP.prstnn === 1'b1) ) begin
      if ( syncout_active[0] ) begin             // deactive syncout after being actived for one clk
        syncout[0]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[0] = `false;
      end // if
      if ( syncout_active[1] ) begin
        syncout[1]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[1] = `false;
      end // if
      if ( syncout_active[2] ) begin
        syncout[2]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[2] = `false;
      end // if
      if ( syncout_active[3] ) begin
        syncout[3]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[3] = `false;
      end // if
      if ( syncout_active[4] ) begin
        syncout[4]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[4] = `false;
      end // if
      if ( syncout_active[5] ) begin
        syncout[5]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[5] = `false;
      end // if
      if ( syncout_active[6] ) begin
        syncout[6]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[6] = `false;
      end // if
      if ( syncout_active[7] ) begin
        syncout[7]  <= #(1*`time_scale_multiplier)  1'b0   ;      
        syncout_active[7] = `false;
      end // if

      if ( (enable === 1'b0) ) begin               
        cycle_stalled;
        back_to_back = 1'b0;
        cstate = disabled;
        cstate_rw = `false;
      end // if

      if ( wait_sync[0] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[0] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[1] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[1] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[2] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[2] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[3] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[3] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[4] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[4] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[5] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[5] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[6] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[6] is true");
          $display("\"");
        end

      end // if
      if ( wait_sync[7] ) begin
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" wait_sync[7] is true");
          $display("\"");
        end

      end // if

      if ( retry_counter >= internal_retry_limit ) begin  
        retry_counter= 0;
        cycle_stalled;
        gnc = `true;
      end // if

      if ( (INP.pstopnn === 1'b0) && (INP.pframenn === 1'b0) && (INP.pirdynn === 1'b1) && 
         (INP.ptrdynn === 1'b0) && (INP.pdevselnn === 1'b0) && (last_bstate === sm_data) && !(disconnect_a || disconnect_b || disconnect_c) ) begin       
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" disconnect_a is true ");
          $display("\"");
        end

        disconnect_a = `true;
        disconnect_b = `false;
        disconnect_c = `false;
        if ( (cmmd === 4'b1111) ) begin     // disconnect mem_write_inv will switch command to mem_write
          cmmd = (4'b0111);   
        end // if

        if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn !== 1'b0) ) begin
          retry64_32 = `true;
        end // if

        if ( bus_64 && (transfer_cnt > transfer_limit) && (transfer_limit !== 1) ) begin       // for 64-bit single data transfer(disconnected laster burst)
          cstate = cmd_rdy;
          cstate_rw = `false;
          ready = 1'b0;          
        end // if

      end else if ( (INP.pstopnn === 1'b0) && (INP.pframenn === 1'b0) && (INP.pirdynn === 1'b0) && 
         (INP.ptrdynn === 1'b0) && (INP.pdevselnn === 1'b0) && (last_bstate === sm_data) && !(disconnect_a || disconnect_b || disconnect_c) ) begin          
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" disconnect_b is true ");
          $display("\"");
        end

        disconnect_a = `false;
        disconnect_b = `true;
        disconnect_c = `false;
        if ( (cmmd === 4'b1111) ) begin     // disconnect mem_write_inv will switch command to mem_write
          cmmd = (4'b0111);   
        end // if

        if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn !== 1'b0) ) begin
          retry64_32 = `true;
        end // if

        if ( bus_64 && (transfer_cnt === transfer_limit) && (transfer_limit !== 1) ) begin       // for 64-bit single data transfer(disconnected laster burst)
          cstate = cmd_rdy;
          cstate_rw = `false;
          ready = 1'b0;             
        end // if

      end else if ( (INP.pstopnn === 1'b0) && (INP.pframenn === 1'b1) &&
            (INP.ptrdynn === 1'b1) && (INP.pdevselnn === 1'b0) && (last_bstate === sm_data) && !(disconnect_a || disconnect_b || disconnect_c) ) begin      
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \" disconnect_c is true ");
          $display("\"");
        end

        disconnect_a = `false;
        disconnect_b = `false;
        disconnect_c = `true;
        if ( (cmmd === 4'b1111) && (transfer_cnt > 1)) begin     // disconnect mem_write_inv will switch command to mem_write
          cmmd = (4'b0111);   
        end // if

        if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn !== 1'b0) ) begin
          retry64_32 = `true;
        end // if
        retry_counter = retry_counter + 1;  
        if (!((msg_level<`debug_3))) begin
          $display("NOTE at %0t from %m",$time);
          $write("     \"retry_counter is ");
          $write("%0d",(retry_counter));
          $display("\"");
        end
   
        if ( (delays > 0) ) begin        // to restart retry cycle with irdy delay information                                       
          ready = 1'b0;             //  set irdy to '1'
          delay_cnt = delays;
          cstate = cmd_rdy;
          cstate_rw = `false;
          cmmd_ready = 1'b1;
        end // if

        if ( bus_64 && (transfer_cnt === transfer_limit) && (transfer_limit !== 1) ) begin       // for 64-bit single data transfer(disconnected laster burst)
          cstate = cmd_rdy;
          cstate_rw = `false;
          ready = 1'b0;         
        end // if

      end else if ( (INP.pstopnn === 1'b0) && (INP.pdevselnn === 1'b1) && (bstate === sm_data) ) begin      
        if ( (delays > 0) ) begin                                               
          ready = 1'b1;             //  set frame to '1' and irdy to '0'
        end // if

      end // if
      if ( INP.pstopnn === 1'b1 ) begin       
        disconnect_a = `false;
        disconnect_b = `false;
        disconnect_c = `false;
      end // if

      
      // if burst mode is reserved, cycle is ended
      if ((disconnect_a || disconnect_b || disconnect_c) && (mode_local[0] !== 1'b0)&&
         ((curr_cmd[incode1:incode2] === `read_continue_cmd) || 
          (curr_cmd[incode1:incode2] === `write_continue_cmd))) begin
         cycle_stalled;
         get_addr = `true;
         gnc = `true;
      end 
      // disconnect-c case           
      if ( (INP.pstopnn === 1'b0) && (INP.pframenn === 1'b0) && 
         (INP.pdevselnn === 1'b0) && (INP.ptrdynn === 1'b1) && 
         (bstate === sm_data)) begin   
      end else if ( (master_abort === 1'b1) ) begin
        if (!((msg_level<`debug_3))) begin
          $display("WARNING at %0t from %m",$time);
          $write("     \"pci_master_backend: received a master_abort");
          $display("\"");
        end

        
        cycle_stalled;
        gnc = `true;
 
      end else if ( (target_abort === 1'b1) ) begin
        if (!((msg_level<`debug_3))) begin
          $display("WARNING at %0t from %m",$time);
          $write("     \"pci_master_backend: received a target_abort");
          $display("\"");
        end


        cycle_stalled;
        gnc = `true;
      end // if

      case ( cstate )
       cmd_rdy : begin
  
        if ( cmd_ack === 1'b1 && double_addr ) begin
          double_addr = `false;
        end else if ( cmd_ack === 1'b1 ) begin

          cmmd_ready = 1'b0;
          byte_en = byte_enables;
          byte_en_7to4 = byte_enables_7to4;
          if ( delays !== 0 ) begin
            delay_cnt = delays;
            cstate = ddelay;
            cstate_rw = `false;
          end else begin
            delay_cnt = 0;
            if ( transfer_cnt === transfer_limit ) begin
              if ( bus_64 ) begin       // for 64-bit single data transfer 
                cstate = ddelay;
                cstate_rw = `false;
              end else begin                        
                if ( (cmmd === 4'b0001) ) begin
                  last_data = 1'b0;      // special cycle keeps frame asserted (bstate stay in mdata phase) to do master abort
//                  get_nxt_cmd;
                end else begin
                  last_data = 1'b1;
                end // if
                ready = 1'b1;
                case ( command )
                   read : begin                    
                    cstate = data_rd;
                    cstate_rw = `true;
                  end
                   write : begin                   
                    dataout = (data_words);                  
                    if ( bus_64 ) begin
                      dataout_63to32 = (data_words_63to32);  
                    end // if
                    cstate = data_wr;
                    cstate_rw = `true;
		  end
		   default begin  /* null */
                 end
                 endcase
              end // if
            end else begin
              last_data = 1'b0;
              ready = 1'b1;
              case ( command )
                 read : begin                    
                  cstate = data_rd;
                  cstate_rw = `true;
                end
                 write : begin                   
                  dataout = (data_words);                  
                  if ( bus_64 ) begin
                    dataout_63to32 = (data_words_63to32);  
                  end // if
                  cstate = data_wr;
                  cstate_rw = `true;
		end
		 default begin  /* null */
               end
               endcase
            end // if
          end // if
        end // if
  
      end
       data_wr : begin                                              
        if ( INP.ptrdynn === 1'b0 && data_phase === 1'b1 && master_abort === 1'b0) begin 
          increment_address;
          addr = hexaddress;

                          
          if ( transfer_cnt < transfer_limit ) begin
            if (!((msg_level<`debug_3))) begin
              $display("NOTE at %0t from %m",$time);
              $write("     \" transfer_cnt < transfer_limit");
              $display("\"");
            end

            if ( !(bus_64) ) begin
              get_nxt_cmd;
              read_write_cmd;      // get next command to update the data before output them           
              transfer_cnt = transfer_cnt + 1;
              if (!((msg_level<`debug_3))) begin
                $display("NOTE at %0t from %m",$time);
                $write("     \" transfer_cnt value increased 1 when cstate = data_wr ");
                $display("\"");
              end


              byte_en = byte_enables;

            end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_be_transfer) ) begin
              get_nxt_cmd;
              read_write_cmd;                
              transfer_cnt = transfer_cnt + 1;
              if (!((msg_level<`debug_3))) begin
                $display("NOTE at %0t from %m",$time);
                $write("     \" transfer_cnt value increased 1 when cstate = data_wr ");
                $display("\"");
              end


              byte_en = byte_enables;
              byte_en_7to4 = byte_enables_7to4;
              second_be_transfer = `false; 
            end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
              byte_en = byte_enables_7to4;     // previous cycle pbenn data send to pcxbenn
              second_be_transfer = `true; 
            end // if


            if ( delays === 0 ) begin
              if ( !(bus_64) ) begin
                dataout = (data_words);                
              end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_data_transfer) ) begin
                dataout = (data_words);                
                dataout_63to32 = (data_words_63to32);               
                second_data_transfer = `false; 
              end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
                dataout = (data_words_63to32);                
                second_data_transfer = `true; 
              end // if

              if ( transfer_cnt === transfer_limit && !(bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1)) ) begin
                last_data = 1'b1;          // last_data high causes comp high and thus frame => '1'
              end else begin
                last_data = 1'b0;
              end // if
              ready = 1'b1;
            end else begin                                     // for burst write cycle delays
              if ( !(disconnect_b) ) begin    
                if (!((msg_level<`debug_3))) begin
                  $display("NOTE at %0t from %m",$time);
                  $write("     \" delays is > 0 , ready => '0' after time_unit");
                  $display("\"");
                end

                ready = 1'b0;    // frame to '0' and irdy to '1'
              end // if

              if ( !(bus_64) ) begin
                dataout = (32'h00000000);
              end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_data_transfer) ) begin
                dataout = (32'h00000000);
                dataout_63to32 = (32'h00000000);
                second_data_transfer = `false; 
              end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
                dataout = (32'h00000000);
                second_data_transfer = `true; 
              end // if


              delay_cnt = delays;
              cstate = ddelay;
              cstate_rw = `false;
              if (!((msg_level<`debug_3))) begin
                $display("NOTE at %0t from %m",$time);
                $write("     \" cstate changes from data_wr to delay ");
                $display("\"");
              end

            end // if
          end else begin                    // transfer_cnt = transfer_limit
            if ( !(bus_64) ) begin
              ready = 1'b0;
              dataout = (32'h00000000);

              byte_en = 4'b0000;
              last_data = 1'b0;
              get_nxt_cmd;
              read_write_cmd;


            end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_data_transfer) ) begin
              ready = 1'b0;
              dataout = (32'h00000000);
              dataout_63to32 = (32'h00000000);

              byte_en = 4'b0000;
              byte_en_7to4 = 4'b0000;
              last_data = 1'b0;
              get_nxt_cmd;
              read_write_cmd;

              second_data_transfer = `false; 
            end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
              dataout = (data_words_63to32);                
              byte_en = byte_enables_7to4;
              last_data = 1'b1;         //  set frame to '1'
              second_data_transfer = `true; 

              if ( (delays > 0) ) begin
                ready = 1'b0;             //  set irdy to '1'
                byte_en = byte_enables_7to4;          // send pbenn  to pcxbenn
                dataout = (32'h00000000);

                delay_cnt = delays;
                cstate = ddelay;
                cstate_rw = `false;
                if (!((msg_level<`debug_3))) begin
                  $display("NOTE at %0t from %m",$time);
                  $write("     \" cstate delays from data_wr  ");
                  $display("\"");
                end

              end // if
            end // if
          end // if
        end // if
  
      end
       data_rd : begin
  
        if ( INP.ptrdynn === 1'b0 && data_phase === 1'b1 && master_abort === 1'b0) begin
          increment_address;


          if ( transfer_cnt === transfer_limit ) begin
            if ( !(bus_64) ) begin
	      return_data_addrv(addr,INP.pad);
              byte_en = 4'b0000;
              ready = 1'b0;
              last_data = 1'b0;
              gnc = `true;
              cstate = disabled;  // added on 4/5/94 to prevent req -> 0 at end of read because of cmd_in_progress still be 1
              cstate_rw = `false;
	      get_nxt_cmd;
            end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_data_transfer) ) begin
              if ( (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0) ) begin
		return_data_addrv(addr,{INP.pd, INP.pad});
	      end else begin
		return_data_addrv(addr,{first_data, INP.pad});
              end // if
              byte_en = 4'b0000;
              byte_en_7to4 = 4'b0000;
              ready = 1'b0;
              last_data = 1'b0;
              gnc = `true;
              second_data_transfer = `false; 
              cstate = disabled;  // added on 4/5/94 to prevent req -> 0 at end of read because of cmd_in_progress still be 1
              cstate_rw = `false;
	      get_nxt_cmd;
            end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
	      return_data_addrv(addr,INP.pad);
	      first_data = INP.pad;
              byte_en = byte_enables_7to4; 
              last_data = 1'b1;         //  set frame to '1'
              second_data_transfer = `true; 
              if ( (delays > 0) ) begin                                                 
                ready = 1'b0;             //  set irdy to '1'
                byte_en = byte_enables_7to4;          // send pbenn  to pcxbenn
                dataout = (32'h00000000);
                delay_cnt = delays;
                cstate = ddelay;
                cstate_rw = `false;
                if (!((msg_level<`debug_3))) begin
                  $display("NOTE at %0t from %m",$time);
                  $write("     \" cstate delays from data_wr  ");
                  $display("\"");
                end

              end // if
            end // if

          end else begin
            if ( !(bus_64) ) begin
	      return_data_addrv(addr,INP.pad);
              gnc = `true;
	      get_nxt_cmd;
            end else if ( bus_64 && (((INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) || second_data_transfer) ) begin
              if ( (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0) ) begin
		return_data_addrv(addr,{INP.pd, INP.pad});
	      end else begin
		return_data_addrv(addr,{first_data, INP.pad});
              end // if
              gnc = `true;
              second_data_transfer = `false; 
	      get_nxt_cmd;
            end else if ( bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b1) ) begin
	      return_data_addrv(addr,INP.pad);
              byte_en = byte_enables_7to4;
              second_data_transfer = `true; 
              if ( (delays > 0) ) begin                                               
                ready = 1'b0;             //  set irdy to '1'
                byte_en = byte_enables_7to4;          // send pbenn  to pcxbenn
                dataout = (32'h00000000);
                delay_cnt = delays;
                cstate = ddelay;
                cstate_rw = `false;
                if (!((msg_level<`debug_3))) begin
                  $display("NOTE at %0t from %m",$time);
                  $write("     \" cstate delays from data_wr  ");
                  $display("\"");
                end

              end // if
            end // if
          end // if
          addr = hexaddress;

       end // if
  
      end
       ddelay : begin                                                                     

        if ( (delay_cnt > 0) ) begin
          delay_cnt = delay_cnt - 1;
        end // if

        if ( bus_64 && (transfer_limit === transfer_limit) ) begin       // for 64-bit single data transfer 
          last_data = 1'b0;        // frame needs to wait for single data phase with 64-bit transfer
          wait_devsel_delay = `true;             // delay until frame signal being resolved by devsel and ack64
        end // if

        if ( wait_devsel_delay && (INP.pdevselnn === 1'b0) ) begin
          wait_devsel_delay = `false;
        end // if

        if ( (delay_cnt === 0) && !(wait_devsel_delay) ) begin
          ready = 1'b1;
          if ( transfer_cnt === transfer_limit ) begin
            if ( bus_64 && (INP.pdevselnn === 1'b0) &&  (INP.pack64nn !== 1'b0) && !(second_data_transfer) ) begin
              last_data = 1'b0;       // frame stay '0' for 64-bit single data transfer when ack64 is not low
            end else begin
              last_data = 1'b1;      
            end // if
          end else begin                       
            last_data = 1'b0;       // frame stay '0' for burst cycle
          end // if
          case ( command )
             read : begin
              cstate = data_rd;
Next12345678910
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 11:57:17 1999
From: ../../../sparc_v8/system/lmc/rtl/pcimaster_fm.v

Verilog converted to html by v2html 5.0 (written by Costas Calamvokis).Help