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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [commands/] [CMD_io_allow.txt] - Rev 2

Compare with Previous | Blame | View Log


<defines>
`define CMD_io_allow    #AUTOGEN_NEXT_CMD
// glob_param_1[15:0] - IO address

//NOTE: CMDEX_IO_ALLOW_1 does not use port number in exe_buffer

`define CMDEX_io_allow_1        4'd0
`define CMDEX_io_allow_2        4'd1
</defines>

<microcode>
`CMDEX_io_allow_1
`CMDEX_io_allow_2
RETURN();
</microcode>

<read_local>
wire rd_io_allow_1_fault;
wire rd_io_allow_2_fault;

assign rd_io_allow_1_fault =
    rd_cmd == `CMD_io_allow && rd_cmdex == `CMDEX_io_allow_1 &&
    (   ~(tr_cache_valid) ||
        (tr_cache[`DESC_BITS_TYPE] != `DESC_TSS_AVAIL_386 && tr_cache[`DESC_BITS_TYPE] != `DESC_TSS_BUSY_386) ||
        tr_limit < 32'd103
    );

assign rd_io_allow_2_fault =
    rd_cmd == `CMD_io_allow && rd_cmdex == `CMDEX_io_allow_2 &&
    ({ 16'd0, rd_memory_last[15:0] } + { 16'd0, 3'd0, glob_param_1[15:3] }) >= tr_limit;

assign rd_io_allow_fault = rd_io_allow_1_fault || rd_io_allow_2_fault;
</read_local>

<read>
IF(rd_cmd == `CMD_io_allow && rd_cmdex == `CMDEX_io_allow_1);
    
    SET(rd_system_linear, tr_base + 32'd102);

    IF(rd_io_allow_1_fault || rd_mutex_busy_active); SET(rd_waiting); // read only when last operation finished
    ELSE();
        // memory read saved to rd_memory_last
    
        SET(read_system_word);

        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
    ENDIF();
ENDIF();
</read>

<read>
IF(rd_cmd == `CMD_io_allow && rd_cmdex == `CMDEX_io_allow_2);
    
    SET(rd_system_linear, tr_base + { 16'd0, rd_memory_last[15:0] } + { 16'd0, 3'd0, glob_param_1[15:3] });

    IF(rd_io_allow_2_fault); SET(rd_waiting);
    ELSE();
        SET(rd_src_is_memory);
    
        SET(read_system_word);

        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
    ENDIF();
ENDIF();
</read>

<execute_local>
wire [3:0] e_io_allow_bits;

assign e_io_allow_bits =
    (glob_param_1[2:0] == 3'd0)?  src[3:0] :
    (glob_param_1[2:0] == 3'd1)?  src[4:1] :
    (glob_param_1[2:0] == 3'd2)?  src[5:2] :
    (glob_param_1[2:0] == 3'd3)?  src[6:3] :
    (glob_param_1[2:0] == 3'd4)?  src[7:4] :
    (glob_param_1[2:0] == 3'd5)?  src[8:5] :
    (glob_param_1[2:0] == 3'd6)?  src[9:6] :
                                src[10:7]; 
</execute_local>

<execute>
IF(exe_cmd == `CMD_io_allow && exe_cmdex == `CMDEX_io_allow_2);

    IF((  exe_is_8bit                       && e_io_allow_bits[0]   != 1'd0) ||
       (~(exe_is_8bit) && exe_operand_16bit && e_io_allow_bits[1:0] != 2'd0) ||
       (~(exe_is_8bit) && exe_operand_32bit && e_io_allow_bits[3:0] != 4'd0));
    
        SET(exe_waiting);
        SET(exe_trigger_gp_fault); //exception GP(0)
    ENDIF();
ENDIF();
</execute>

<write>
IF(wr_cmd == `CMD_io_allow && (wr_cmdex == `CMDEX_io_allow_1 || wr_cmdex == `CMDEX_io_allow_2));
    SET(wr_not_finished);
ENDIF();
</write>

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.