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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [pipeline/] [write_string.v] - Rev 2

Compare with Previous | Blame | View Log

/*
 * Copyright (c) 2014, Aleksander Osman
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 * 
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
`include "defines.v"
 
module write_string(
 
    input               wr_is_8bit,
    input               wr_operand_16bit,
    input               wr_address_16bit,
    input               wr_address_32bit,
    input       [1:0]   wr_prefix_group_1_rep,
 
    input               wr_string_gp_fault_check,
 
    input               dflag,
 
    input               wr_zflag_result,
 
    input       [31:0]  ecx,
    input       [31:0]  esi,
    input       [31:0]  edi,
 
    input       [63:0]  es_cache,
    input               es_cache_valid,
    input       [31:0]  es_base,
    input       [31:0]  es_limit,
 
    //output
    output      [31:0]  wr_esi_final,
    output      [31:0]  wr_edi_final,
    output      [31:0]  wr_ecx_final,
 
    output              wr_string_ignore,
    output              wr_string_finish,
    output              wr_string_zf_finish,
 
    output      [31:0]  wr_string_es_linear,
 
    output              wr_string_es_fault
);
 
//------------------------------------------------------------------------------ string
wire [31:0] w_string_size;
wire [31:0] w_esi;
wire [31:0] w_edi;
wire [31:0] w_ecx;
 
 
assign w_string_size = (wr_is_8bit)? 32'd1 : (wr_operand_16bit)? 32'd2 : 32'd4;
 
assign w_esi = (dflag)? esi - w_string_size : esi + w_string_size;
assign w_edi = (dflag)? edi - w_string_size : edi + w_string_size;
assign w_ecx = ecx - 32'd1;
 
assign wr_esi_final = (wr_address_16bit)? { esi[31:16], w_esi[15:0] } : w_esi;
assign wr_edi_final = (wr_address_16bit)? { edi[31:16], w_edi[15:0] } : w_edi;
assign wr_ecx_final = (wr_address_16bit)? { ecx[31:16], w_ecx[15:0] } : w_ecx;
 
assign wr_string_ignore = wr_prefix_group_1_rep != 2'd0 &&
    ((wr_address_16bit && ecx[15:0] == 16'd0) || (wr_address_32bit && ecx == 32'd0));
 
assign wr_string_finish =
    (wr_prefix_group_1_rep != 2'd0 && ((wr_address_16bit && ecx[15:0] == 16'd1) || (wr_address_32bit && ecx == 32'd1)));
 
assign wr_string_zf_finish =
     wr_string_finish ||
    (wr_prefix_group_1_rep == 2'd1 && wr_zflag_result) ||
    (wr_prefix_group_1_rep == 2'd2 && ~(wr_zflag_result));
 
//------------------------------------------------------------------------------ string ES
wire [31:0] w_edi_offset;
wire [2:0]  wr_string_es_length;
wire [2:0]  wr_string_es_length_minus_1;
wire [31:0] w_string_es_upper_limit;
 
wire        w_string_es_not_fit;
wire        w_string_es_limit_overflow;
 
wire        w_string_es_no_write;
 
assign w_edi_offset = (wr_address_16bit)? { 16'd0, edi[15:0] } : edi;
 
assign wr_string_es_linear = es_base + w_edi_offset;
 
assign wr_string_es_length         = (wr_is_8bit)? 3'd1 : (wr_operand_16bit)? 3'd2 : 3'd4;
assign wr_string_es_length_minus_1 = wr_string_es_length - 3'd1;
 
assign w_string_es_upper_limit = (es_cache[`DESC_BIT_D_B])? 32'hFFFFFFFF : 32'h0000FFFF; //d-b
 
// (CODE or not EXPAND-DOWN)
assign w_string_es_not_fit = (es_cache[43] || !es_cache[42])?
    es_limit                - w_edi_offset < { 29'd0, wr_string_es_length_minus_1 } :
    w_string_es_upper_limit - w_edi_offset < { 29'd0, wr_string_es_length_minus_1 };
 
assign w_string_es_limit_overflow =
    ((es_cache[43] || !es_cache[42]) && w_edi_offset > es_limit) ||
    (!es_cache[43] && es_cache[42] && (w_edi_offset <= es_limit || w_edi_offset > w_string_es_upper_limit));
 
// (CODE or not writable)
assign w_string_es_no_write = es_cache[43] || !es_cache[41];
 
assign wr_string_es_fault = ~(wr_string_ignore) && wr_string_gp_fault_check &&
    (w_string_es_not_fit || w_string_es_limit_overflow || ~(es_cache_valid) || w_string_es_no_write);
 
//------------------------------------------------------------------------------
 
// synthesis translate_off
wire _unused_ok = &{ 1'b0, es_cache[63:55], es_cache[53:44], es_cache[40:0], 1'b0 };
// synthesis translate_on
 
//------------------------------------------------------------------------------
 
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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