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

Subversion Repositories altor32

[/] [altor32/] [trunk/] [rtl/] [cpu/] [altor32_exec.v] - Diff between revs 31 and 32

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

Rev 31 Rev 32
Line 34... Line 34...
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
// Boston, MA  02111-1307  USA
// Boston, MA  02111-1307  USA
//-----------------------------------------------------------------
//-----------------------------------------------------------------
 
 
//`define CONF_CORE_DEBUG
//`define CONF_CORE_DEBUG
//`define CONF_CORE_DEBUG_BUBBLE
 
//`define CONF_CORE_TRACE
//`define CONF_CORE_TRACE
//`define CONF_CORE_FAULT_ON_OPCODE0
 
 
 
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// Includes
// Includes
//-----------------------------------------------------------------
//-----------------------------------------------------------------
`include "altor32_defs.v"
`include "altor32_defs.v"
Line 104... Line 102...
 
 
    // Memory Interface
    // Memory Interface
    output reg [31:0]   dmem_addr_o /*verilator public*/,
    output reg [31:0]   dmem_addr_o /*verilator public*/,
    output reg [31:0]   dmem_data_out_o /*verilator public*/,
    output reg [31:0]   dmem_data_out_o /*verilator public*/,
    input [31:0]        dmem_data_in_i /*verilator public*/,
    input [31:0]        dmem_data_in_i /*verilator public*/,
    output reg [3:0]    dmem_wr_o /*verilator public*/,
    output reg [3:0]    dmem_sel_o /*verilator public*/,
    output reg          dmem_rd_o /*verilator public*/,
    output reg          dmem_we_o /*verilator public*/,
    input               dmem_accept_i /*verilator public*/,
    output reg          dmem_stb_o /*verilator public*/,
 
    output reg          dmem_cyc_o /*verilator public*/,
 
    input               dmem_stall_i /*verilator public*/,
    input               dmem_ack_i /*verilator public*/
    input               dmem_ack_i /*verilator public*/
);
);
 
 
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// Params
// Params
Line 747... Line 747...
end
end
 
 
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// Comparisons
// Comparisons
//-----------------------------------------------------------------
//-----------------------------------------------------------------
 
reg [31:0] compare_a_r;
 
reg [31:0] compare_b_r;
always @ *
always @ *
begin
begin
    compare_result_r = 1'b0;
    compare_a_r = reg_ra_r;
 
    compare_b_r = reg_rb_r;
 
 
    case (1'b1)
    case (1'b1)
    inst_sfeq_w: // l.sfeq
    inst_sfeqi_w,  // l.sfeqi
    begin
    inst_sfgesi_w, // l.sfgesi
        if (reg_ra_r == reg_rb_r)
    inst_sfgeui_w, // l.sfgeui
            compare_result_r = 1'b1;
    inst_sfgtsi_w, // l.sfgtsi
        else
    inst_sfgtui_w, // l.sfgtui
            compare_result_r = 1'b0;
    inst_sflesi_w, // l.sflesi
 
    inst_sfleui_w, // l.sfleui
 
    inst_sfltsi_w, // l.sfltsi
 
    inst_sfltui_w, // l.sfltui
 
    inst_sfnei_w:  // l.sfnei
 
        compare_b_r = int32_r;
 
    default:
 
        ;
 
    endcase
    end
    end
 
 
    inst_sfeqi_w: // l.sfeqi
reg compare_equal_r;
 
reg compare_gts_r;
 
reg compare_gt_r;
 
reg compare_lts_r;
 
reg compare_lt_r;
 
always @ *
    begin
    begin
        if (reg_ra_r == int32_r)
    if (compare_a_r == compare_b_r)
            compare_result_r = 1'b1;
        compare_equal_r = 1'b1;
        else
        else
            compare_result_r = 1'b0;
        compare_equal_r = 1'b0;
    end
 
 
 
    inst_sfges_w: // l.sfges
    compare_lts_r = less_than_signed(compare_a_r, compare_b_r);
    begin
 
        if (greater_than_equal_signed(reg_ra_r, reg_rb_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfgesi_w: // l.sfgesi
    if (compare_a_r < compare_b_r)
    begin
        compare_lt_r = 1'b1;
        if (greater_than_equal_signed(reg_ra_r, int32_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
        else
            compare_result_r = 1'b0;
        compare_lt_r = 1'b0;
    end
 
 
 
    inst_sfgeu_w: // l.sfgeu
    // Greater than (signed)
    begin
    compare_gts_r = ~(compare_lts_r | compare_equal_r);
        if (reg_ra_r >= reg_rb_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfgeui_w: // l.sfgeui
    if (compare_a_r > compare_b_r)
    begin
        compare_gt_r = 1'b1;
        if (reg_ra_r >= int32_r)
 
            compare_result_r = 1'b1;
 
        else
        else
            compare_result_r = 1'b0;
        compare_gt_r = 1'b0;
    end
    end
 
 
    inst_sfgts_w: // l.sfgts
always @ *
    begin
    begin
        if (greater_than_signed(reg_ra_r, reg_rb_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
            compare_result_r = 1'b0;
    end
 
 
 
    inst_sfgtsi_w: // l.sfgtsi
    case (1'b1)
    begin
    inst_sfeq_w, // l.sfeq
        if (greater_than_signed(reg_ra_r, int32_r) == 1'b1)
    inst_sfeqi_w: // l.sfeqi
            compare_result_r = 1'b1;
        compare_result_r = compare_equal_r;
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfgtu_w: // l.sfgtu
    inst_sfges_w,  // l.sfges
    begin
    inst_sfgesi_w: // l.sfgesi
        if (reg_ra_r > reg_rb_r)
        compare_result_r = compare_gts_r | compare_equal_r;
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfgtui_w: // l.sfgtui
    inst_sfgeu_w,  // l.sfgeu
    begin
    inst_sfgeui_w: // l.sfgeui
        if (reg_ra_r > int32_r)
        compare_result_r = compare_gt_r | compare_equal_r;
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfles_w: // l.sfles
    inst_sfgts_w,  // l.sfgts
    begin
    inst_sfgtsi_w: // l.sfgtsi
        if (less_than_equal_signed(reg_ra_r, reg_rb_r) == 1'b1)
        compare_result_r = compare_gts_r;
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
 
    inst_sfgtu_w,  // l.sfgtu
 
    inst_sfgtui_w: // l.sfgtui
 
        compare_result_r = compare_gt_r;
 
 
 
    inst_sfles_w,  // l.sfles
    inst_sflesi_w: // l.sflesi
    inst_sflesi_w: // l.sflesi
    begin
        compare_result_r = compare_lts_r | compare_equal_r;
        if (less_than_equal_signed(reg_ra_r, int32_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfleu_w: // l.sfleu
    inst_sfleu_w,  // l.sfleu
    begin
 
        if (reg_ra_r <= reg_rb_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfleui_w: // l.sfleui
    inst_sfleui_w: // l.sfleui
    begin
        compare_result_r = compare_lt_r | compare_equal_r;
        if (reg_ra_r <= int32_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sflts_w: // l.sflts
    inst_sflts_w,  // l.sflts
    begin
 
        if (less_than_signed(reg_ra_r, reg_rb_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfltsi_w: // l.sfltsi
    inst_sfltsi_w: // l.sfltsi
    begin
        compare_result_r = compare_lts_r;
        if (less_than_signed(reg_ra_r, int32_r) == 1'b1)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfltu_w: // l.sfltu
    inst_sfltu_w,  // l.sfltu
    begin
 
        if (reg_ra_r < reg_rb_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfltui_w: // l.sfltui
    inst_sfltui_w: // l.sfltui
    begin
        compare_result_r = compare_lt_r;
        if (reg_ra_r < int32_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfne_w: // l.sfne
    inst_sfne_w,  // l.sfne
    begin
 
        if (reg_ra_r != reg_rb_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
 
 
    inst_sfnei_w: // l.sfnei
    inst_sfnei_w: // l.sfnei
    begin
        compare_result_r = ~compare_equal_r;
        if (reg_ra_r != int32_r)
 
            compare_result_r = 1'b1;
 
        else
 
            compare_result_r = 1'b0;
 
    end
 
    default:
    default:
        ;
        ;
    endcase
    endcase
end
end
 
 
Line 1328... Line 1264...
   if (rst_i == 1'b1)
   if (rst_i == 1'b1)
   begin
   begin
       // Data memory
       // Data memory
       dmem_addr_o          <= 32'h00000000;
       dmem_addr_o          <= 32'h00000000;
       dmem_data_out_o      <= 32'h00000000;
       dmem_data_out_o      <= 32'h00000000;
       dmem_rd_o            <= 1'b0;
       dmem_we_o            <= 1'b0;
       dmem_wr_o            <= 4'b0000;
       dmem_sel_o           <= 4'b0000;
 
       dmem_stb_o           <= 1'b0;
 
       dmem_cyc_o           <= 1'b0;
 
 
       r_mem_load           <= 1'b0;
       r_mem_load           <= 1'b0;
       r_mem_store          <= 1'b0;
       r_mem_store          <= 1'b0;
       r_mem_access         <= 1'b0;
       r_mem_access         <= 1'b0;
 
 
Line 1345... Line 1283...
   end
   end
   else
   else
   begin
   begin
 
 
       // If memory access accepted by slave
       // If memory access accepted by slave
       if (dmem_accept_i)
       if (~dmem_stall_i)
       begin
           dmem_stb_o   <= 1'b0;
           dmem_rd_o            <= 1'b0;
 
           dmem_wr_o            <= 4'b0000;
 
       end
 
 
 
 
       if (dmem_ack_i)
 
            dmem_cyc_o  <= 1'b0;
       r_mem_access     <= 1'b0;
       r_mem_access     <= 1'b0;
       d_mem_load       <= r_mem_access & r_mem_load;
       d_mem_load       <= r_mem_access & r_mem_load;
 
 
       // Pending accesses
       // Pending accesses
       r_mem_load   <= load_pending;
       r_mem_load   <= load_pending;
Line 1389... Line 1326...
             // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
             // l.lbs l.lhs l.lws l.lbz l.lhz l.lwz
             load_inst_r:
             load_inst_r:
             begin
             begin
                 dmem_addr_o      <= mem_addr_r;
                 dmem_addr_o      <= mem_addr_r;
                 dmem_data_out_o  <= 32'h00000000;
                 dmem_data_out_o  <= 32'h00000000;
                 dmem_rd_o        <= 1'b1;
                 dmem_sel_o       <= 4'b1111;
 
                 dmem_we_o        <= 1'b0;
 
                 dmem_stb_o       <= 1'b1;
 
                 dmem_cyc_o       <= 1'b1;
 
 
                 // Mark load as pending
                 // Mark load as pending
                 r_mem_load      <= 1'b1;
                 r_mem_load      <= 1'b1;
                 r_mem_access    <= 1'b1;
                 r_mem_access    <= 1'b1;
 
 
Line 1413... Line 1353...
                 r_mem_access <= 1'b1;
                 r_mem_access <= 1'b1;
                 case (mem_addr_r[1:0])
                 case (mem_addr_r[1:0])
                     2'b00 :
                     2'b00 :
                     begin
                     begin
                         dmem_data_out_o  <= {reg_rb_r[7:0],24'h000000};
                         dmem_data_out_o  <= {reg_rb_r[7:0],24'h000000};
                         dmem_wr_o        <= 4'b1000;
                         dmem_sel_o       <= 4'b1000;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     2'b01 :
                     2'b01 :
                     begin
                     begin
                         dmem_data_out_o  <= {{8'h00,reg_rb_r[7:0]},16'h0000};
                         dmem_data_out_o  <= {{8'h00,reg_rb_r[7:0]},16'h0000};
                         dmem_wr_o        <= 4'b0100;
                         dmem_sel_o       <= 4'b0100;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     2'b10 :
                     2'b10 :
                     begin
                     begin
                         dmem_data_out_o  <= {{16'h0000,reg_rb_r[7:0]},8'h00};
                         dmem_data_out_o  <= {{16'h0000,reg_rb_r[7:0]},8'h00};
                         dmem_wr_o        <= 4'b0010;
                         dmem_sel_o       <= 4'b0010;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     2'b11 :
                     2'b11 :
                     begin
                     begin
                         dmem_data_out_o  <= {24'h000000,reg_rb_r[7:0]};
                         dmem_data_out_o  <= {24'h000000,reg_rb_r[7:0]};
                         dmem_wr_o        <= 4'b0001;
                         dmem_sel_o       <= 4'b0001;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     default :
                     default :
                     begin
                        ;
                         dmem_data_out_o  <= 32'h00000000;
 
                         dmem_wr_o        <= 4'b0000;
 
                     end
 
                 endcase
                 endcase
             end
             end
 
 
            inst_sh_w: // l.sh
            inst_sh_w: // l.sh
            begin
            begin
Line 1450... Line 1399...
                 r_mem_access <= 1'b1;
                 r_mem_access <= 1'b1;
                 case (mem_addr_r[1:0])
                 case (mem_addr_r[1:0])
                     2'b00 :
                     2'b00 :
                     begin
                     begin
                         dmem_data_out_o  <= {reg_rb_r[15:0],16'h0000};
                         dmem_data_out_o  <= {reg_rb_r[15:0],16'h0000};
                         dmem_wr_o        <= 4'b1100;
                         dmem_sel_o       <= 4'b1100;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     2'b10 :
                     2'b10 :
                     begin
                     begin
                         dmem_data_out_o  <= {16'h0000,reg_rb_r[15:0]};
                         dmem_data_out_o  <= {16'h0000,reg_rb_r[15:0]};
                         dmem_wr_o        <= 4'b0011;
                         dmem_sel_o       <= 4'b0011;
 
                         dmem_we_o        <= 1'b1;
 
                         dmem_stb_o       <= 1'b1;
 
                         dmem_cyc_o       <= 1'b1;
                         r_mem_store      <= 1'b1;
                         r_mem_store      <= 1'b1;
                     end
                     end
                     default :
                     default :
                     begin
                        ;
                         dmem_data_out_o  <= 32'h00000000;
 
                         dmem_wr_o        <= 4'b0000;
 
                     end
 
                 endcase
                 endcase
            end
            end
 
 
            inst_sw_w: // l.sw
            inst_sw_w: // l.sw
            begin
            begin
                 dmem_addr_o      <= mem_addr_r;
                 dmem_addr_o      <= mem_addr_r;
                 dmem_data_out_o  <= reg_rb_r;
                 dmem_data_out_o  <= reg_rb_r;
                 dmem_wr_o        <= 4'b1111;
                 dmem_sel_o       <= 4'b1111;
 
                 dmem_we_o        <= 1'b1;
 
                 dmem_stb_o       <= 1'b1;
 
                 dmem_cyc_o       <= 1'b1;
                 r_mem_access     <= 1'b1;
                 r_mem_access     <= 1'b1;
                 r_mem_store      <= 1'b1;
                 r_mem_store      <= 1'b1;
 
 
  `ifdef CONF_CORE_DEBUG
  `ifdef CONF_CORE_DEBUG
                 $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {mem_addr_r[31:2],2'b00}, reg_rb_r);
                 $display(" Store R%d to 0x%08x = 0x%08x", reg_rb_i, {mem_addr_r[31:2],2'b00}, reg_rb_r);
Line 1617... Line 1572...
      get_putc = r_putc;
      get_putc = r_putc;
   `else
   `else
      get_putc = 8'b0;
      get_putc = 8'b0;
   `endif
   `endif
   endfunction
   endfunction
 
   function [0:0] get_reg_valid;
 
      // verilator public
 
      get_reg_valid = ~(resolve_failed | load_stall);
 
   endfunction
 
   function [4:0] get_reg_ra;
 
      // verilator public
 
      get_reg_ra = reg_ra_i;
 
   endfunction
 
   function [31:0] get_reg_ra_value;
 
      // verilator public
 
      get_reg_ra_value = ra_value_resolved;
 
   endfunction
 
   function [4:0] get_reg_rb;
 
      // verilator public
 
      get_reg_rb = reg_rb_i;
 
   endfunction
 
   function [31:0] get_reg_rb_value;
 
      // verilator public
 
      get_reg_rb_value = rb_value_resolved;
 
   endfunction
`endif
`endif
 
 
endmodule
endmodule
 
 
 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.