Line 60... |
Line 60... |
|
|
// External i/f to IC
|
// External i/f to IC
|
ic_insn, ic_addr, ic_stall, ic_fetchop, tp_insn, tp_wr_insn,
|
ic_insn, ic_addr, ic_stall, ic_fetchop, tp_insn, tp_wr_insn,
|
|
|
// Internal i/f
|
// Internal i/f
|
pipeline_freeze, if_insn, if_pc, branch_op, except_type,
|
if_freeze, if_insn, if_pc, branch_op, except_type,
|
branch_addrofs, lr_restor, flag, taken, binsn_addr, except_start,
|
branch_addrofs, lr_restor, flag, taken, binsn_addr, except_start,
|
epcr, force_dslot_fetch, if_stall, branch_stall
|
epcr, force_dslot_fetch, if_stall, branch_stall
|
);
|
);
|
|
|
//
|
//
|
Line 88... |
Line 88... |
input tp_wr_insn;
|
input tp_wr_insn;
|
|
|
//
|
//
|
// Internal i/f
|
// Internal i/f
|
//
|
//
|
input pipeline_freeze;
|
input if_freeze;
|
output [31:0] if_insn;
|
output [31:0] if_insn;
|
output [31:0] if_pc;
|
output [31:0] if_pc;
|
input [`BRANCHOP_WIDTH-1:0] branch_op;
|
input [`BRANCHOP_WIDTH-1:0] branch_op;
|
input [`EXCEPT_WIDTH-1:0] except_type;
|
input [`EXCEPT_WIDTH-1:0] except_type;
|
input [31:2] branch_addrofs;
|
input [31:2] branch_addrofs;
|
Line 250... |
Line 250... |
// PC register
|
// PC register
|
//
|
//
|
always @(posedge clk or posedge rst) begin
|
always @(posedge clk or posedge rst) begin
|
if (rst)
|
if (rst)
|
pcreg <= #1 30'd64;
|
pcreg <= #1 30'd64;
|
else if (!pipeline_freeze && !ic_stall) begin
|
else if (!if_freeze && !ic_stall) begin
|
pcreg <= #1 ic_addr[31:2];
|
pcreg <= #1 ic_addr[31:2];
|
`ifdef OR1200_VERBOSE
|
`ifdef OR1200_VERBOSE
|
// synopsys translate_off
|
// synopsys translate_off
|
$display("%t: pcreg incremented to %h", $time, {ic_addr[31:2], 2'b0});
|
$display("%t: pcreg incremented to %h", $time, {ic_addr[31:2], 2'b0});
|
// synopsys translate_on
|
// synopsys translate_on
|
Line 267... |
Line 267... |
//
|
//
|
always @(posedge clk or posedge rst)
|
always @(posedge clk or posedge rst)
|
if (rst) begin
|
if (rst) begin
|
if_saved <= #1 33'b0;
|
if_saved <= #1 33'b0;
|
end
|
end
|
else if (pipeline_freeze && !if_saved[32] && !ic_stall) begin // && !taken
|
else if (if_freeze && !if_saved[32] && !ic_stall) begin // && !taken
|
if_saved <= #1 {1'b1, ic_tp_insn};
|
if_saved <= #1 {1'b1, ic_tp_insn};
|
`ifdef OR1200_VERBOSE
|
`ifdef OR1200_VERBOSE
|
// synopsys translate_off
|
// synopsys translate_off
|
$display("%t: if_saved <= %h", $time, {1'b1, ic_tp_insn});
|
$display("%t: if_saved <= %h", $time, {1'b1, ic_tp_insn});
|
// synopsys translate_on
|
// synopsys translate_on
|
`endif
|
`endif
|
end
|
end
|
else if (!pipeline_freeze) begin
|
else if (!if_freeze) begin
|
if_saved[32] <= #1 1'b0;
|
if_saved[32] <= #1 1'b0;
|
if_saved[31:0] <= #1 32'h1500eeee;
|
if_saved[31:0] <= #1 32'h1500eeee;
|
`ifdef OR1200_VERBOSE
|
`ifdef OR1200_VERBOSE
|
// synopsys translate_off
|
// synopsys translate_off
|
$display("%t: if_saved[32] <= 0", $time);
|
$display("%t: if_saved[32] <= 0", $time);
|
Line 292... |
Line 292... |
//
|
//
|
always @(posedge clk or posedge rst)
|
always @(posedge clk or posedge rst)
|
if (rst) begin
|
if (rst) begin
|
pc_saved <= #1 32'b0;
|
pc_saved <= #1 32'b0;
|
end
|
end
|
else if (pipeline_freeze && !if_saved[32] && !ic_stall) begin // && !taken
|
else if (if_freeze && !if_saved[32] && !ic_stall) begin // && !taken
|
pc_saved <= #1 ic_addr;
|
pc_saved <= #1 ic_addr;
|
end
|
end
|
else if (!pipeline_freeze) begin
|
else if (!if_freeze) begin
|
pc_saved <= #1 32'h00000000;
|
pc_saved <= #1 32'h00000000;
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|