Added cache flush after write, potentially fixing support for self modifying code
This commit is contained in:
parent
8d3b54b812
commit
ced03c48d6
37
system/biu.v
37
system/biu.v
@ -95,8 +95,8 @@ always @(posedge reset) begin
|
|||||||
biu_state <= `BIU_RESET;
|
biu_state <= `BIU_RESET;
|
||||||
/* verilator lint_off BLKSEQ */
|
/* verilator lint_off BLKSEQ */
|
||||||
FIFO_start = `L1_CACHE_SIZE'b0;
|
FIFO_start = `L1_CACHE_SIZE'b0;
|
||||||
|
FIFO_end = `L1_CACHE_SIZE'b0;
|
||||||
/* verilator lint_on BLKSEQ */
|
/* verilator lint_on BLKSEQ */
|
||||||
FIFO_end <= `L1_CACHE_SIZE'b0;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
reg jump_req_latch;
|
reg jump_req_latch;
|
||||||
@ -111,8 +111,8 @@ always @(posedge clock) begin
|
|||||||
if ( jump_req_latch ) begin
|
if ( jump_req_latch ) begin
|
||||||
/* verilator lint_off BLKSEQ */
|
/* verilator lint_off BLKSEQ */
|
||||||
FIFO_start = 0;
|
FIFO_start = 0;
|
||||||
|
FIFO_end = 0;
|
||||||
/* verilator lint_on BLKSEQ */
|
/* verilator lint_on BLKSEQ */
|
||||||
FIFO_end <= 0;
|
|
||||||
INSTRUCTION_ADDRESS <= { 4'b0 , ADDRESS_INPUT };
|
INSTRUCTION_ADDRESS <= { 4'b0 , ADDRESS_INPUT };
|
||||||
INSTRUCTION_LOCATION <= ADDRESS_INPUT;
|
INSTRUCTION_LOCATION <= ADDRESS_INPUT;
|
||||||
func <= 1;
|
func <= 1;
|
||||||
@ -130,6 +130,10 @@ always @(posedge clock) begin
|
|||||||
DATA_DIR <= 1 ;
|
DATA_DIR <= 1 ;
|
||||||
IOMEM <= MEM_OR_IO;
|
IOMEM <= MEM_OR_IO;
|
||||||
biu_state <= (Wbit==0) ? `BIU_PUT_BYTE : (ADDRESS_INPUT[0:0]?`BIU_PUT_UNALIGNED_16BIT_DATA:`BIU_PUT_ALIGNED_16BIT_DATA) ;
|
biu_state <= (Wbit==0) ? `BIU_PUT_BYTE : (ADDRESS_INPUT[0:0]?`BIU_PUT_UNALIGNED_16BIT_DATA:`BIU_PUT_ALIGNED_16BIT_DATA) ;
|
||||||
|
INSTRUCTION_ADDRESS <= {4'b0,INSTRUCTION_LOCATION} ;
|
||||||
|
/* verilator lint_off BLKSEQ */
|
||||||
|
FIFO_end=FIFO_start;
|
||||||
|
/* verilator lint_on BLKSEQ */
|
||||||
end else if ( read_request ) begin
|
end else if ( read_request ) begin
|
||||||
func<=0;
|
func<=0;
|
||||||
DATA_ADDRESS <= { 4'b0 , ADDRESS_INPUT };
|
DATA_ADDRESS <= { 4'b0 , ADDRESS_INPUT };
|
||||||
@ -152,7 +156,15 @@ always @(posedge clock) begin
|
|||||||
end
|
end
|
||||||
|
|
||||||
`ifdef EARLY_VALID_INSTRUCTION
|
`ifdef EARLY_VALID_INSTRUCTION
|
||||||
if((Isit1==1) && (FIFO_SIZE!=0) && `EARLY_VALID_INSTRUCTION_)begin
|
|
||||||
|
if(FIFO_start==FIFO_end) begin
|
||||||
|
/*TODO: I would use FIFO_SIZE==0 here or better yet add an else at the
|
||||||
|
end but since FIFO_start and FIFO_end are updated in a blocking
|
||||||
|
manner it seems that the assign statement updating FIFO_SIZE
|
||||||
|
doesn't work. PLEASE CLEAN UP THIS MESS */
|
||||||
|
VALID_INSTRUCTION <= 0;
|
||||||
|
/*TODO: do we need the last of the three parts ?*/
|
||||||
|
end else if((Isit1==1) && (FIFO_SIZE!=0) && `EARLY_VALID_INSTRUCTION_)begin
|
||||||
VALID_INSTRUCTION <= 1;
|
VALID_INSTRUCTION <= 1;
|
||||||
INSTRUCTION[31:24] <= INPUT_FIFO[FIFO_start];
|
INSTRUCTION[31:24] <= INPUT_FIFO[FIFO_start];
|
||||||
end else if((fifoIsize==2) && (FIFO_SIZE > `L1_CACHE_SIZE'd1) && `EARLY_VALID_INSTRUCTION_)begin
|
end else if((fifoIsize==2) && (FIFO_SIZE > `L1_CACHE_SIZE'd1) && `EARLY_VALID_INSTRUCTION_)begin
|
||||||
@ -172,7 +184,10 @@ always @(posedge clock) begin
|
|||||||
INSTRUCTION[ 7: 0] <= INPUT_FIFO[FIFO_start+`L1_CACHE_SIZE'd3];
|
INSTRUCTION[ 7: 0] <= INPUT_FIFO[FIFO_start+`L1_CACHE_SIZE'd3];
|
||||||
end
|
end
|
||||||
`else
|
`else
|
||||||
if(FIFO_SIZE>`L1_CACHE_SIZE'd3)begin
|
if(FIFO_start==FIFO_end) begin
|
||||||
|
/*TODO: Same as on the first statment on the other side of the `ifdef */
|
||||||
|
VALID_INSTRUCTION <= 0;
|
||||||
|
end else if(FIFO_SIZE>`L1_CACHE_SIZE'd3)begin
|
||||||
VALID_INSTRUCTION <= 1;
|
VALID_INSTRUCTION <= 1;
|
||||||
INSTRUCTION[31:24] <= INPUT_FIFO[FIFO_start];
|
INSTRUCTION[31:24] <= INPUT_FIFO[FIFO_start];
|
||||||
INSTRUCTION[23:16] <= INPUT_FIFO[FIFO_start+`L1_CACHE_SIZE'd1];
|
INSTRUCTION[23:16] <= INPUT_FIFO[FIFO_start+`L1_CACHE_SIZE'd1];
|
||||||
@ -189,15 +204,21 @@ always @(posedge clock) begin
|
|||||||
if(INSTRUCTION_ADDRESS[0:0]==0 && FIFO_SIZE<{{(`L1_CACHE_SIZE-1){1'b1}},1'b0})begin
|
if(INSTRUCTION_ADDRESS[0:0]==0 && FIFO_SIZE<{{(`L1_CACHE_SIZE-1){1'b1}},1'b0})begin
|
||||||
INPUT_FIFO[FIFO_end] <= external_data_bus[7:0];
|
INPUT_FIFO[FIFO_end] <= external_data_bus[7:0];
|
||||||
INPUT_FIFO[FIFO_end+`L1_CACHE_SIZE'd1] <= external_data_bus[15:8];
|
INPUT_FIFO[FIFO_end+`L1_CACHE_SIZE'd1] <= external_data_bus[15:8];
|
||||||
FIFO_end <= FIFO_end+`L1_CACHE_SIZE'd2;
|
/* verilator lint_off BLKSEQ */
|
||||||
|
FIFO_end = FIFO_end+`L1_CACHE_SIZE'd2;
|
||||||
|
/* verilator lint_on BLKSEQ */
|
||||||
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd2;
|
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd2;
|
||||||
end else if(INSTRUCTION_ADDRESS[0:0]==0)begin
|
end else if(INSTRUCTION_ADDRESS[0:0]==0)begin
|
||||||
INPUT_FIFO[FIFO_end] <= external_data_bus[7:0];
|
INPUT_FIFO[FIFO_end] <= external_data_bus[7:0];
|
||||||
FIFO_end <= FIFO_end+`L1_CACHE_SIZE'd1;
|
/* verilator lint_off BLKSEQ */
|
||||||
|
FIFO_end = FIFO_end+`L1_CACHE_SIZE'd1;
|
||||||
|
/* verilator lint_on BLKSEQ */
|
||||||
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd1;
|
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd1;
|
||||||
end else begin
|
end else begin
|
||||||
INPUT_FIFO[FIFO_end] <= external_data_bus[15:8];
|
INPUT_FIFO[FIFO_end] <= external_data_bus[15:8];
|
||||||
FIFO_end <= FIFO_end+`L1_CACHE_SIZE'd1;
|
/* verilator lint_off BLKSEQ */
|
||||||
|
FIFO_end = FIFO_end+`L1_CACHE_SIZE'd1;
|
||||||
|
/* verilator lint_on BLKSEQ */
|
||||||
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd1;
|
INSTRUCTION_ADDRESS <= INSTRUCTION_ADDRESS+20'd1;
|
||||||
end
|
end
|
||||||
biu_state <= `BIU_NEXT_ACTION;
|
biu_state <= `BIU_NEXT_ACTION;
|
||||||
@ -303,8 +324,8 @@ always @(posedge clock) begin
|
|||||||
`BIU_RESET: begin
|
`BIU_RESET: begin
|
||||||
/* verilator lint_off BLKSEQ */
|
/* verilator lint_off BLKSEQ */
|
||||||
FIFO_start = `L1_CACHE_SIZE'b0;
|
FIFO_start = `L1_CACHE_SIZE'b0;
|
||||||
|
FIFO_end = `L1_CACHE_SIZE'b0;
|
||||||
/* verilator lint_on BLKSEQ */
|
/* verilator lint_on BLKSEQ */
|
||||||
FIFO_end <= `L1_CACHE_SIZE'b0;
|
|
||||||
biu_state <= `BIU_NEXT_ACTION;
|
biu_state <= `BIU_NEXT_ACTION;
|
||||||
INSTRUCTION_ADDRESS <= 20'h0FFF0;
|
INSTRUCTION_ADDRESS <= 20'h0FFF0;
|
||||||
INSTRUCTION_LOCATION <= 16'hFFF0;
|
INSTRUCTION_LOCATION <= 16'hFFF0;
|
||||||
|
Loading…
Reference in New Issue
Block a user