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

Subversion Repositories xgate

[/] [xgate/] [trunk/] [rtl/] [verilog/] [xgate_risc.v] - Diff between revs 89 and 97

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 89 Rev 97
Line 106... Line 106...
  integer j;     // Loop counters for decode of XGATE Interrupt Register
  integer j;     // Loop counters for decode of XGATE Interrupt Register
  integer k;     // Loop counter for Bit Field Insert decode
  integer k;     // Loop counter for Bit Field Insert decode
  integer bfi, bfii;   // Loop counter for Bit Field Insert function
  integer bfi, bfii;   // Loop counter for Bit Field Insert function
 
 
  // State machine sequence
  // State machine sequence
  parameter [3:0]      //synopsys enum state_info
  localparam [3:0]      //synopsys enum state_info
       IDLE    = 4'b0000,      // waiting for interrupt
       IDLE    = 4'b0000,      // waiting for interrupt
       CONT    = 4'b0001,      // Instruction processing state, first state
       CONT    = 4'b0001,      // Instruction processing state, first state
       S_STALL = 4'b0010,      // Simple Stall while updating PC after change of flow
       S_STALL = 4'b0010,      // Simple Stall while updating PC after change of flow
       W_STORE = 4'b1101,      // Stall while doing memory word write access
       W_STORE = 4'b1101,      // Stall while doing memory word write access
       W_LOAD  = 4'b0011,      // Stall while doing memory word read access
       W_LOAD  = 4'b0011,      // Stall while doing memory word read access
Line 124... Line 124...
       BOOT_3  = 4'b1011,      //
       BOOT_3  = 4'b1011,      //
       CHG_CHID = 4'b1100;
       CHG_CHID = 4'b1100;
 
 
 
 
  // Semaphore states
  // Semaphore states
  parameter [1:0] NO_LOCK = 2'b00,
  localparam [1:0] NO_LOCK   = 2'b00,
                  RISC_LOCK = 2'b10,
                  RISC_LOCK = 2'b10,
                  HOST_LOCK = 2'b11;
                  HOST_LOCK = 2'b11;
 
 
 
 
  reg  [ 3:0] cpu_state;         // State register for instruction processing
  reg  [ 3:0] cpu_state;         // State register for instruction processing
Line 139... Line 139...
  wire [15:0] pc_sum;            // Program Counter Adder
  wire [15:0] pc_sum;            // Program Counter Adder
  reg  [15:0] pc_incr_mux;       // Pseudo Register, mux to select the Program Counter Increment value
  reg  [15:0] pc_incr_mux;       // Pseudo Register, mux to select the Program Counter Increment value
  reg  [15:0] next_pc;           // Pseudo Register
  reg  [15:0] next_pc;           // Pseudo Register
  wire [15:0] jump_offset;       // Address offset to be added to pc on conditional branch instruction
  wire [15:0] jump_offset;       // Address offset to be added to pc on conditional branch instruction
  wire [15:0] bra_offset;        // Address offset to be added to pc on branch always instruction
  wire [15:0] bra_offset;        // Address offset to be added to pc on branch always instruction
 
  wire        pc_carry;          // Carry out bit from pc adder
 
  wire        pc_overflow;       // Next pc is out-of-range
 
  wire        pc_underflow;      // Next pc is out-of-range
 
  wire        pc_error;          // Next pc calculation error
  reg  [15:0] alu_result;        // Pseudo Register,
  reg  [15:0] alu_result;        // Pseudo Register,
  reg  [15:0] op_code;           // Register for instruction being executed
  reg  [15:0] op_code;           // Register for instruction being executed
  reg         ena_rd_low_byte;   // Pseudo Register,
  reg         ena_rd_low_byte;   // Pseudo Register,
  reg         ena_rd_high_byte;  // Pseudo Register,
  reg         ena_rd_high_byte;  // Pseudo Register,
 
 
Line 209... Line 213...
  reg  [ 1:0] chid_sm_ns;    // Pseudo Register for State Machine next state logic,
  reg  [ 1:0] chid_sm_ns;    // Pseudo Register for State Machine next state logic,
  reg  [ 1:0] chid_sm;       //
  reg  [ 1:0] chid_sm;       //
  wire        chid_goto_idle; //
  wire        chid_goto_idle; //
 
 
  // Debug states for change CHID
  // Debug states for change CHID
  parameter [1:0] CHID_IDLE = 2'b00,
  localparam [1:0] CHID_IDLE = 2'b00,
                  CHID_TEST = 2'b10,
                  CHID_TEST = 2'b10,
                  CHID_WAIT = 2'b11;
                  CHID_WAIT = 2'b11;
 
 
 
 
  assign jump_offset = {{6{op_code[8]}}, op_code[8:0], 1'b0};
  assign jump_offset = {{6{op_code[8]}}, op_code[8:0], 1'b0};
  assign bra_offset  = {{5{op_code[9]}}, op_code[9:0], 1'b0};
  assign bra_offset  = {{5{op_code[9]}}, op_code[9:0], 1'b0};
  assign pc_sum      = program_counter + pc_incr_mux;
  assign pc_overflow  = pc_carry & !pc_incr_mux[15];
 
  assign pc_underflow = !pc_carry & pc_incr_mux[15];
 
  assign pc_error     = pc_overflow || pc_underflow;
 
 
 
  assign {pc_carry, pc_sum} = program_counter + pc_incr_mux;
 
 
  assign xgate_address = data_access ? data_address : program_counter;
  assign xgate_address = data_access ? data_address : program_counter;
 
 
  //assign mem_access = data_access || load_next_inst || start_thread;
  //assign mem_access = data_access || load_next_inst || start_thread;
  assign mem_access = data_access || load_next_inst || (cpu_state == CONT) ||
  assign mem_access = data_access || load_next_inst || (cpu_state == CONT) ||
Line 238... Line 246...
  assign cpu_is_idle = (cpu_state == IDLE);
  assign cpu_is_idle = (cpu_state == IDLE);
  assign perif_wrt_ena = (cpu_is_idle && ~xge) || debug_active;
  assign perif_wrt_ena = (cpu_is_idle && ~xge) || debug_active;
 
 
  // Decode register select for RD and RS
  // Decode register select for RD and RS
  always @*
  always @*
    begin
 
      case (op_code[10:8]) // synopsys parallel_case
      case (op_code[10:8]) // synopsys parallel_case
        3'b001 : rd_data = xgr1;
        3'b001 : rd_data = xgr1;
        3'b010 : rd_data = xgr2;
        3'b010 : rd_data = xgr2;
        3'b011 : rd_data = xgr3;
        3'b011 : rd_data = xgr3;
        3'b100 : rd_data = xgr4;
        3'b100 : rd_data = xgr4;
        3'b101 : rd_data = xgr5;
        3'b101 : rd_data = xgr5;
        3'b110 : rd_data = xgr6;
        3'b110 : rd_data = xgr6;
        3'b111 : rd_data = xgr7;
        3'b111 : rd_data = xgr7;
        default : rd_data = 16'h0;  // XGR0 is always Zero
        default : rd_data = 16'h0;  // XGR0 is always Zero
      endcase
      endcase
    end
 
 
 
  assign wrt_reg_sel = (cpu_state == BOOT_3) ? 3'b001 :
  assign wrt_reg_sel = (cpu_state == BOOT_3) ? 3'b001 :
                       (sel_rd_field ? op_code[10:8] : op_code[4:2]);
                       (sel_rd_field ? op_code[10:8] : op_code[4:2]);
 
 
  // Decode register write select for eather RD or RI/RS2
  // Decode register write select for eather RD or RI/RS2
Line 310... Line 316...
  //  Software Error Interrupt Latch
  //  Software Error Interrupt Latch
  always @(posedge risc_clk or negedge async_rst_b)
  always @(posedge risc_clk or negedge async_rst_b)
    if ( !async_rst_b )
    if ( !async_rst_b )
      software_error <= 1'b0;
      software_error <= 1'b0;
    else
    else
      software_error <= addr_error || op_code_error ||
      software_error <= addr_error || op_code_error || pc_error ||
                        (brk_set_dbg && brk_irq_ena) || (software_error && !xgsweif_c);
                        (brk_set_dbg && brk_irq_ena) || (software_error && !xgsweif_c);
 
 
  assign xg_sw_irq = software_error && xgie;
  assign xg_sw_irq = software_error && xgie;
 
 
  //  Latch the need to go to debug state set by xgdb
  //  Latch the need to go to debug state set by xgdb
Line 336... Line 342...
        debug_active  <= 1'b0;
        debug_active  <= 1'b0;
        debug_edge    <= 0;
        debug_edge    <= 0;
      end
      end
    else
    else
      begin
      begin
        debug_active  <= !xgdbg_clear && (cmd_dbg ||
        debug_active  <= !xgdbg_clear && (cmd_dbg || pc_error ||
                         brk_set_dbg || op_code_error || debug_active);
                         brk_set_dbg || op_code_error || debug_active);
        debug_edge    <= debug_active;
        debug_edge    <= debug_active;
      end
      end
 
 
  assign debug_ack = debug_active && !debug_edge; // Posedge of debug_active
  assign debug_ack = debug_active && !debug_edge; // Posedge of debug_active
Line 359... Line 365...
  //  CPU State Register
  //  CPU State Register
  always @(posedge risc_clk or negedge async_rst_b)
  always @(posedge risc_clk or negedge async_rst_b)
    if ( !async_rst_b )
    if ( !async_rst_b )
      cpu_state  <= IDLE;
      cpu_state  <= IDLE;
    else
    else
      cpu_state  <= (mem_req_ack || stm_auto_advance) ? next_cpu_state : cpu_state;
      cpu_state  <= (mem_req_ack || stm_auto_advance || ~xge) ? next_cpu_state : cpu_state;
 
 
  //  CPU Instruction Register
  //  CPU Instruction Register
  always @(posedge risc_clk or negedge async_rst_b)
  always @(posedge risc_clk or negedge async_rst_b)
    if ( !async_rst_b )
    if ( !async_rst_b )
      op_code  <= 16'h0000;
      op_code  <= 16'h0000;
Line 457... Line 463...
        begin
        begin
         xgif_d[j]  = xgif_status[j] || (set_irq_flag == j);
         xgif_d[j]  = xgif_status[j] || (set_irq_flag == j);
         j = j + 1;
         j = j + 1;
        end
        end
      if (clear_xgif_0)
      if (clear_xgif_0)
        xgif_d[15: 1]  = ~clear_xgif_data & xgif_status[15: 1];
        xgif_d[15: 1]  = ~clear_xgif_data[15:1] & xgif_status[15:1];
      if (clear_xgif_1)
      if (clear_xgif_1)
        xgif_d[31:16]  = ~clear_xgif_data & xgif_status[31:16];
        xgif_d[31:16]  = ~clear_xgif_data & xgif_status[31:16];
      if (clear_xgif_2)
      if (clear_xgif_2)
        xgif_d[47:32]  = ~clear_xgif_data & xgif_status[47:32];
        xgif_d[47:32]  = ~clear_xgif_data & xgif_status[47:32];
      if (clear_xgif_3)
      if (clear_xgif_3)
Line 2121... Line 2127...
  );
  );
 
 
  // Three to Eight line decoder
  // Three to Eight line decoder
  always @*
  always @*
    case (semaph_risc)  // synopsys parallel_case
    case (semaph_risc)  // synopsys parallel_case
      4'h0 : semap_risc_bit = 8'b0000_0001;
      3'h0 : semap_risc_bit = 8'b0000_0001;
      4'h1 : semap_risc_bit = 8'b0000_0010;
      3'h1 : semap_risc_bit = 8'b0000_0010;
      4'h2 : semap_risc_bit = 8'b0000_0100;
      3'h2 : semap_risc_bit = 8'b0000_0100;
      4'h3 : semap_risc_bit = 8'b0000_1000;
      3'h3 : semap_risc_bit = 8'b0000_1000;
      4'h4 : semap_risc_bit = 8'b0001_0000;
      3'h4 : semap_risc_bit = 8'b0001_0000;
      4'h5 : semap_risc_bit = 8'b0010_0000;
      3'h5 : semap_risc_bit = 8'b0010_0000;
      4'h6 : semap_risc_bit = 8'b0100_0000;
      3'h6 : semap_risc_bit = 8'b0100_0000;
      4'h7 : semap_risc_bit = 8'b1000_0000;
      3'h7 : semap_risc_bit = 8'b1000_0000;
    endcase
    endcase
 
 
  assign semaph_stat = |risc_semap;
  assign semaph_stat = |risc_semap;
 
 
  // Semaphore Bits
  // Semaphore Bits
Line 2391... Line 2397...
      semap_state <= NO_LOCK;
      semap_state <= NO_LOCK;
    else
    else
      semap_state <= next_semap_state;
      semap_state <= next_semap_state;
 
 
  always @*
  always @*
    begin
 
      case(semap_state)
      case(semap_state)
        NO_LOCK:
        NO_LOCK:
          begin
          begin
            if (host_wrt && host_bit_mask && host_bit)
            if (host_wrt && host_bit_mask && host_bit)
              next_semap_state = HOST_LOCK;
              next_semap_state = HOST_LOCK;
Line 2419... Line 2424...
              next_semap_state = HOST_LOCK;
              next_semap_state = HOST_LOCK;
           end
           end
        default:
        default:
          next_semap_state = NO_LOCK;
          next_semap_state = NO_LOCK;
      endcase
      endcase
    end
 
 
 
endmodule  // semaphore_bit
endmodule  // semaphore_bit
 
 
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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