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

Subversion Repositories ao486

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

Compare with Previous | Blame | View Log


<defines>
`define CMD_WBINVD      #AUTOGEN_NEXT_CMD

// check CPL
`define CMDEX_WBINVD_STEP_0     4'd0
// do invalidate
`define CMDEX_WBINVD_STEP_1     4'd1
// idle
`define CMDEX_WBINVD_STEP_2     4'd2
</defines>

<decode>
dec_ready_2byte_one && decoder[7:0] == 8'h09
`CMD_WBINVD
SET(dec_cmdex, `CMDEX_WBINVD_STEP_0);
SET(consume_one);
SET(dec_is_complex);
</decode>

<microcode>
`CMDEX_WBINVD_STEP_0
`CMDEX_WBINVD_STEP_1
LOOP(`CMDEX_WBINVD_STEP_2);
</microcode>


<execute>
IF(exe_cmd == `CMD_WBINVD && exe_cmdex == `CMDEX_WBINVD_STEP_0);
    IF(cpl > 2'd0);
        SET(exe_waiting);
        SET(exe_trigger_gp_fault); //exception GP(0)
    ENDIF(); 
ENDIF();
</execute>

<execute_local>
reg e_wbinvd_code_done;
reg e_wbinvd_data_done;

always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)       e_wbinvd_code_done <= `FALSE;
    else if(exe_reset)      e_wbinvd_code_done <= `FALSE;
    else if(exe_ready)      e_wbinvd_code_done <= `FALSE;
    else if(invdcode_done)  e_wbinvd_code_done <= `TRUE;
end

always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)         e_wbinvd_data_done <= `FALSE;
    else if(exe_reset)        e_wbinvd_data_done <= `FALSE;
    else if(exe_ready)        e_wbinvd_data_done <= `FALSE;
    else if(wbinvddata_done)  e_wbinvd_data_done <= `TRUE;
end
</execute_local>

<execute>
IF(exe_cmd == `CMD_WBINVD && exe_cmdex == `CMDEX_WBINVD_STEP_1);
        
    SET(invdcode_do,   ~(e_wbinvd_code_done));
    SET(wbinvddata_do, ~(e_wbinvd_data_done));

    IF(~(e_wbinvd_code_done && e_wbinvd_data_done));
        SET(exe_waiting);
    ENDIF(); 
ENDIF();
</execute>

<write>
IF(wr_cmd == `CMD_WBINVD && wr_cmdex == `CMDEX_WBINVD_STEP_0);
    SET(wr_not_finished);
ENDIF();
</write>

<write>
IF(wr_cmd == `CMD_WBINVD && wr_cmdex == `CMDEX_WBINVD_STEP_1);
    
    // reset part of pipeline
    SET(wr_req_reset_micro);
    SET(wr_req_reset_rd);
    SET(wr_req_reset_exe);
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.