Stronger property for correct predecode
This commit is contained in:
parent
20cf408632
commit
35651f52a7
|
@ -82,7 +82,6 @@ assign dbg_running = DEBUG_SUPPORT && !debug_mode;
|
|||
// ----------------------------------------------------------------------------
|
||||
// Pipe Stage F
|
||||
|
||||
|
||||
wire f_jump_req;
|
||||
wire [W_ADDR-1:0] f_jump_target;
|
||||
wire f_jump_rdy;
|
||||
|
@ -366,13 +365,17 @@ always @ (posedge clk or negedge rst_n) begin
|
|||
end
|
||||
|
||||
`ifdef FORMAL
|
||||
always @ (posedge clk) begin
|
||||
if (rst_n && !x_stall) begin
|
||||
if (~|d_rs1_predecoded)
|
||||
assert(~|d_rs1);
|
||||
if (~|d_rs2_predecoded)
|
||||
assert(~|d_rs2);
|
||||
end
|
||||
always @ (posedge clk) if (rst_n && !x_stall) begin
|
||||
// If stage 2 sees a reg operand, it must have been correctly predecoded too.
|
||||
if (|d_rs1)
|
||||
assert(d_rs1_predecoded == d_rs1);
|
||||
if (|d_rs2)
|
||||
assert(d_rs2_predecoded == d_rs2);
|
||||
// If no reg was predecoded, stage 2 decode must agree there is no reg operand.
|
||||
if (~|d_rs1_predecoded)
|
||||
assert(~|d_rs1);
|
||||
if (~|d_rs2_predecoded)
|
||||
assert(~|d_rs2);
|
||||
end
|
||||
`endif
|
||||
|
||||
|
@ -850,10 +853,10 @@ end else begin: fast_branchcmp
|
|||
hazard3_branchcmp #(
|
||||
`include "hazard3_config_inst.vh"
|
||||
) branchcmp_u (
|
||||
.aluop (d_aluop),
|
||||
.op_a (x_rs1_bypass),
|
||||
.op_b (x_rs2_bypass),
|
||||
.cmp (x_branch_cmp)
|
||||
.aluop (d_aluop),
|
||||
.op_a (x_rs1_bypass),
|
||||
.op_b (x_rs2_bypass),
|
||||
.cmp (x_branch_cmp)
|
||||
);
|
||||
|
||||
end
|
||||
|
@ -865,6 +868,7 @@ assign x_jump_req = !x_stall_on_raw && (
|
|||
d_branchcond == BCOND_ZERO && !x_branch_cmp ||
|
||||
d_branchcond == BCOND_NZERO && x_branch_cmp
|
||||
);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Pipe Stage M
|
||||
|
||||
|
|
|
@ -53,11 +53,11 @@ module hazard3_frontend #(
|
|||
|
||||
// Provide the rs1/rs2 register numbers which will be in CIR next cycle.
|
||||
// Coarse: valid if this instruction has a nonzero register operand.
|
||||
// (suitable for regfile read)
|
||||
// (Suitable for regfile read)
|
||||
output reg [4:0] predecode_rs1_coarse,
|
||||
output reg [4:0] predecode_rs2_coarse,
|
||||
// Fine: same as coarse, but more accurate zeroing when e.g. the operand is implicit.
|
||||
// (suitable for bypass)
|
||||
// Fine: like coarse, but accurate zeroing when the operand is implicit.
|
||||
// (Suitable for bypass. Still not precise enough for stall logic.)
|
||||
output reg [4:0] predecode_rs1_fine,
|
||||
output reg [4:0] predecode_rs2_fine,
|
||||
|
||||
|
|
Loading…
Reference in New Issue