Fix up new asserts in hazard3_power_ctrl. Add power signals to formal TBs.
This commit is contained in:
parent
1c2249dbef
commit
624d39669d
|
@ -116,24 +116,38 @@ always @ (posedge clk_always_on or negedge rst_n) begin
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
`ifdef HAZARD3_ASSERTIONS
|
|
||||||
// These must always be mutually exclusive.
|
|
||||||
assert(!(sleeping_on_wfi && sleeping_on_block));
|
|
||||||
if (stall_release) begin
|
|
||||||
// Presumably there was a stall which we just released
|
|
||||||
assert($past(sleeping_on_wfi) || $past(sleeping_on_block));
|
|
||||||
// Presumably we are still in that stall
|
|
||||||
assert(sleeping_on_wfi|| sleeping_on_block);
|
|
||||||
// It takes one cycle to do a release and enter a new sleep state, so a
|
|
||||||
// double release should be impossible.
|
|
||||||
assert(!$past(stall_release));
|
|
||||||
end
|
|
||||||
if (state == S_ASLEEP) begin
|
|
||||||
assert(allow_power_down || allow_sleep);
|
|
||||||
end
|
|
||||||
`endif
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
`ifdef HAZARD3_ASSERTIONS
|
||||||
|
// Regs are a workaround for the non-constant reset value issue with
|
||||||
|
// $past() in yosys-smtbmc.
|
||||||
|
reg past_sleeping;
|
||||||
|
reg past_stall_release;
|
||||||
|
always @ (posedge clk_always_on or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
past_sleeping <= 1'b0;
|
||||||
|
past_stall_release <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
past_sleeping <= sleeping_on_wfi || sleeping_on_block;
|
||||||
|
past_stall_release <= stall_release;
|
||||||
|
// These must always be mutually exclusive.
|
||||||
|
assert(!(sleeping_on_wfi && sleeping_on_block));
|
||||||
|
if (stall_release) begin
|
||||||
|
// Presumably there was a stall which we just released
|
||||||
|
assert(past_sleeping);
|
||||||
|
// Presumably we are still in that stall
|
||||||
|
assert(sleeping_on_wfi|| sleeping_on_block);
|
||||||
|
// It takes one cycle to do a release and enter a new sleep state, so a
|
||||||
|
// double release should be impossible.
|
||||||
|
assert(!past_stall_release);
|
||||||
|
end
|
||||||
|
if (state == S_ASLEEP) begin
|
||||||
|
assert(allow_power_down || allow_sleep);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Pulse->level for block wakeup
|
// Pulse->level for block wakeup
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,25 @@ always @ (posedge clk)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// DUT
|
// DUT
|
||||||
|
|
||||||
(* keep *) wire [31:0] ahblm_haddr;
|
(* keep *) wire pwrup_req;
|
||||||
(* keep *) wire ahblm_hwrite;
|
(* keep *) wire pwrup_ack;
|
||||||
(* keep *) wire ahblm_hexcl;
|
(* keep *) wire clk_en;
|
||||||
(* keep *) wire [1:0] ahblm_htrans;
|
(* keep *) wire unblock_out;
|
||||||
(* keep *) wire [2:0] ahblm_hsize;
|
(* keep *) wire unblock_in;
|
||||||
(* keep *) wire [2:0] ahblm_hburst;
|
|
||||||
(* keep *) wire [3:0] ahblm_hprot;
|
(* keep *) wire [31:0] haddr;
|
||||||
(* keep *) wire ahblm_hmastlock;
|
(* keep *) wire hwrite;
|
||||||
(* keep *) wire ahblm_hready;
|
(* keep *) wire hexcl;
|
||||||
(* keep *) wire ahblm_hexokay;
|
(* keep *) wire [1:0] htrans;
|
||||||
(* keep *) wire ahblm_hresp;
|
(* keep *) wire [2:0] hsize;
|
||||||
(* keep *) wire [31:0] ahblm_hwdata;
|
(* keep *) wire [2:0] hburst;
|
||||||
(* keep *) wire [31:0] ahblm_hrdata;
|
(* keep *) wire [3:0] hprot;
|
||||||
|
(* keep *) wire hmastlock;
|
||||||
|
(* keep *) wire hready;
|
||||||
|
(* keep *) wire hexokay;
|
||||||
|
(* keep *) wire hresp;
|
||||||
|
(* keep *) wire [31:0] hwdata;
|
||||||
|
(* keep *) wire [31:0] hrdata;
|
||||||
|
|
||||||
localparam W_DATA = 32;
|
localparam W_DATA = 32;
|
||||||
|
|
||||||
|
@ -56,21 +62,28 @@ localparam W_DATA = 32;
|
||||||
|
|
||||||
hazard3_cpu_1port dut (
|
hazard3_cpu_1port dut (
|
||||||
.clk (clk),
|
.clk (clk),
|
||||||
|
.clk_always_on (clk),
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
|
|
||||||
.ahblm_haddr (ahblm_haddr),
|
.pwrup_req (pwrup_req),
|
||||||
.ahblm_hwrite (ahblm_hwrite),
|
.pwrup_ack (pwrup_ack),
|
||||||
.ahblm_hexcl (ahblm_hexcl),
|
.clk_en (clk_en),
|
||||||
.ahblm_htrans (ahblm_htrans),
|
.unblock_out (unblock_out),
|
||||||
.ahblm_hsize (ahblm_hsize),
|
.unblock_in (unblock_in),
|
||||||
.ahblm_hburst (ahblm_hburst),
|
|
||||||
.ahblm_hprot (ahblm_hprot),
|
.haddr (haddr),
|
||||||
.ahblm_hmastlock (ahblm_hmastlock),
|
.hwrite (hwrite),
|
||||||
.ahblm_hready (ahblm_hready),
|
.hexcl (hexcl),
|
||||||
.ahblm_hexokay (ahblm_hexokay),
|
.htrans (htrans),
|
||||||
.ahblm_hresp (ahblm_hresp),
|
.hsize (hsize),
|
||||||
.ahblm_hwdata (ahblm_hwdata),
|
.hburst (hburst),
|
||||||
.ahblm_hrdata (ahblm_hrdata),
|
.hprot (hprot),
|
||||||
|
.hmastlock (hmastlock),
|
||||||
|
.hready (hready),
|
||||||
|
.hexokay (hexokay),
|
||||||
|
.hresp (hresp),
|
||||||
|
.hwdata (hwdata),
|
||||||
|
.hrdata (hrdata),
|
||||||
|
|
||||||
.dbg_req_halt (dbg_req_halt),
|
.dbg_req_halt (dbg_req_halt),
|
||||||
.dbg_req_halt_on_reset (dbg_req_halt_on_reset),
|
.dbg_req_halt_on_reset (dbg_req_halt_on_reset),
|
||||||
|
@ -100,6 +113,43 @@ hazard3_cpu_1port dut (
|
||||||
.timer_irq (timer_irq)
|
.timer_irq (timer_irq)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Power signal properties
|
||||||
|
|
||||||
|
(* keep *) wire pwrup_ack_nxt;
|
||||||
|
always @ (posedge clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
pwrup_ack <= 1'b1;
|
||||||
|
end else begin
|
||||||
|
pwrup_ack <= 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (posedge clk) if (rst_n) begin
|
||||||
|
|
||||||
|
// Assume the testbench gives fair acks to the processor's reqs
|
||||||
|
if (pwrup_req && pwrup_ack) begin
|
||||||
|
assume(pwrup_ack_nxt);
|
||||||
|
end
|
||||||
|
if (!pwrup_req && !pwrup_ack) begin
|
||||||
|
assume(!pwrup_ack_nxt);
|
||||||
|
end
|
||||||
|
|
||||||
|
// Assume there is no sbus access when powered down
|
||||||
|
if (!(pwrup_req && pwrup_ack && clk_en)) begin
|
||||||
|
assume(!dbg_sbus_vld);
|
||||||
|
end
|
||||||
|
|
||||||
|
// Assert only one of pwrup_req and pwrup_ack changes on one cycle
|
||||||
|
// (processor upholds its side of the 4-phase handshake)
|
||||||
|
assert((pwrup_ack != $past(pwrup_ack)) + {1'b0, (pwrup_req != $past(pwrup_req))} < 2'd2);
|
||||||
|
|
||||||
|
// Assert rocessor doesn't access the bus whilst asleep
|
||||||
|
if (!(pwrup_req && pwrup_ack && clk_en)) begin
|
||||||
|
assert(htrans == 2'h0);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Bus properties
|
// Bus properties
|
||||||
|
|
||||||
|
@ -112,39 +162,39 @@ ahbl_slave_assumptions #(
|
||||||
.clk (clk),
|
.clk (clk),
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
|
|
||||||
.dst_hready_resp (ahblm_hready),
|
.dst_hready_resp (hready),
|
||||||
.dst_hready (ahblm_hready),
|
.dst_hready (hready),
|
||||||
.dst_hresp (ahblm_hresp),
|
.dst_hresp (hresp),
|
||||||
.dst_hexokay (ahblm_hexokay),
|
.dst_hexokay (hexokay),
|
||||||
.dst_haddr (ahblm_haddr),
|
.dst_haddr (haddr),
|
||||||
.dst_hwrite (ahblm_hwrite),
|
.dst_hwrite (hwrite),
|
||||||
.dst_htrans (ahblm_htrans),
|
.dst_htrans (htrans),
|
||||||
.dst_hsize (ahblm_hsize),
|
.dst_hsize (hsize),
|
||||||
.dst_hburst (ahblm_hburst),
|
.dst_hburst (hburst),
|
||||||
.dst_hprot (ahblm_hprot),
|
.dst_hprot (hprot),
|
||||||
.dst_hmastlock (ahblm_hmastlock),
|
.dst_hmastlock (hmastlock),
|
||||||
.dst_hexcl (ahblm_hexcl),
|
.dst_hexcl (hexcl),
|
||||||
.dst_hwdata (ahblm_hwdata),
|
.dst_hwdata (hwdata),
|
||||||
.dst_hrdata (ahblm_hrdata)
|
.dst_hrdata (hrdata)
|
||||||
);
|
);
|
||||||
|
|
||||||
ahbl_master_assertions d_assertions (
|
ahbl_master_assertions d_assertions (
|
||||||
.clk (clk),
|
.clk (clk),
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
|
|
||||||
.src_hready (ahblm_hready),
|
.src_hready (hready),
|
||||||
.src_hresp (ahblm_hresp),
|
.src_hresp (hresp),
|
||||||
.src_hexokay (ahblm_hexokay),
|
.src_hexokay (hexokay),
|
||||||
.src_haddr (ahblm_haddr),
|
.src_haddr (haddr),
|
||||||
.src_hwrite (ahblm_hwrite),
|
.src_hwrite (hwrite),
|
||||||
.src_htrans (ahblm_htrans),
|
.src_htrans (htrans),
|
||||||
.src_hsize (ahblm_hsize),
|
.src_hsize (hsize),
|
||||||
.src_hburst (ahblm_hburst),
|
.src_hburst (hburst),
|
||||||
.src_hprot (ahblm_hprot),
|
.src_hprot (hprot),
|
||||||
.src_hmastlock (ahblm_hmastlock),
|
.src_hmastlock (hmastlock),
|
||||||
.src_hexcl (ahblm_hexcl),
|
.src_hexcl (hexcl),
|
||||||
.src_hwdata (ahblm_hwdata),
|
.src_hwdata (hwdata),
|
||||||
.src_hrdata (ahblm_hrdata)
|
.src_hrdata (hrdata)
|
||||||
);
|
);
|
||||||
|
|
||||||
sbus_assumptions sbus_assumptions (
|
sbus_assumptions sbus_assumptions (
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
// Assume bus responses to both ports are well-formed, assert that bus
|
// Assume bus responses to both ports are well-formed, assert that bus
|
||||||
// requests are well-formed.
|
// requests are well-formed.
|
||||||
|
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
module tb;
|
module tb;
|
||||||
|
|
||||||
reg clk;
|
reg clk;
|
||||||
|
@ -11,6 +13,12 @@ always @ (posedge clk)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// DUT
|
// DUT
|
||||||
|
|
||||||
|
(* keep *) wire pwrup_req;
|
||||||
|
(* keep *) wire pwrup_ack;
|
||||||
|
(* keep *) wire clk_en;
|
||||||
|
(* keep *) wire unblock_out;
|
||||||
|
(* keep *) wire unblock_in;
|
||||||
|
|
||||||
(* keep *) wire [31:0] i_haddr;
|
(* keep *) wire [31:0] i_haddr;
|
||||||
(* keep *) wire i_hwrite;
|
(* keep *) wire i_hwrite;
|
||||||
(* keep *) wire [1:0] i_htrans;
|
(* keep *) wire [1:0] i_htrans;
|
||||||
|
@ -53,14 +61,14 @@ localparam W_DATA = 32;
|
||||||
(* keep *) wire dbg_instr_caught_exception;
|
(* keep *) wire dbg_instr_caught_exception;
|
||||||
(* keep *) wire dbg_instr_caught_ebreak;
|
(* keep *) wire dbg_instr_caught_ebreak;
|
||||||
|
|
||||||
(*keep*) wire [31:0] dbg_sbus_addr;
|
(* keep *) wire [31:0] dbg_sbus_addr;
|
||||||
(*keep*) wire dbg_sbus_write;
|
(* keep *) wire dbg_sbus_write;
|
||||||
(*keep*) wire [1:0] dbg_sbus_size;
|
(* keep *) wire [1:0] dbg_sbus_size;
|
||||||
(*keep*) wire dbg_sbus_vld;
|
(* keep *) wire dbg_sbus_vld;
|
||||||
(*keep*) wire dbg_sbus_rdy;
|
(* keep *) wire dbg_sbus_rdy;
|
||||||
(*keep*) wire dbg_sbus_err;
|
(* keep *) wire dbg_sbus_err;
|
||||||
(*keep*) wire [31:0] dbg_sbus_wdata;
|
(* keep *) wire [31:0] dbg_sbus_wdata;
|
||||||
(*keep*) wire [31:0] dbg_sbus_rdata;
|
(* keep *) wire [31:0] dbg_sbus_rdata;
|
||||||
|
|
||||||
(* keep *) wire [31:0] irq;
|
(* keep *) wire [31:0] irq;
|
||||||
(* keep *) wire soft_irq;
|
(* keep *) wire soft_irq;
|
||||||
|
@ -68,8 +76,15 @@ localparam W_DATA = 32;
|
||||||
|
|
||||||
hazard3_cpu_2port dut (
|
hazard3_cpu_2port dut (
|
||||||
.clk (clk),
|
.clk (clk),
|
||||||
|
.clk_always_on (clk),
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
|
|
||||||
|
.pwrup_req (pwrup_req),
|
||||||
|
.pwrup_ack (pwrup_ack),
|
||||||
|
.clk_en (clk_en),
|
||||||
|
.unblock_out (unblock_out),
|
||||||
|
.unblock_in (unblock_in),
|
||||||
|
|
||||||
.i_haddr (i_haddr),
|
.i_haddr (i_haddr),
|
||||||
.i_hwrite (i_hwrite),
|
.i_hwrite (i_hwrite),
|
||||||
.i_htrans (i_htrans),
|
.i_htrans (i_htrans),
|
||||||
|
@ -124,6 +139,44 @@ hazard3_cpu_2port dut (
|
||||||
.timer_irq (timer_irq)
|
.timer_irq (timer_irq)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Power signal properties
|
||||||
|
|
||||||
|
(* keep *) wire pwrup_ack_nxt;
|
||||||
|
always @ (posedge clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
pwrup_ack <= 1'b1;
|
||||||
|
end else begin
|
||||||
|
pwrup_ack <= 1'b1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @ (posedge clk) if (rst_n) begin
|
||||||
|
|
||||||
|
// Assume the testbench gives fair acks to the processor's reqs
|
||||||
|
if (pwrup_req && pwrup_ack) begin
|
||||||
|
assume(pwrup_ack_nxt);
|
||||||
|
end
|
||||||
|
if (!pwrup_req && !pwrup_ack) begin
|
||||||
|
assume(!pwrup_ack_nxt);
|
||||||
|
end
|
||||||
|
|
||||||
|
// Assume there is no sbus access when powered down
|
||||||
|
if (!(pwrup_req && pwrup_ack && clk_en)) begin
|
||||||
|
assume(!dbg_sbus_vld);
|
||||||
|
end
|
||||||
|
|
||||||
|
// Assert only one of pwrup_req and pwrup_ack changes on one cycle
|
||||||
|
// (processor upholds its side of the 4-phase handshake)
|
||||||
|
assert((pwrup_ack != $past(pwrup_ack)) + {1'b0, (pwrup_req != $past(pwrup_req))} < 2'd2);
|
||||||
|
|
||||||
|
// Assert rocessor doesn't access the bus whilst asleep
|
||||||
|
if (!(pwrup_req && pwrup_ack && clk_en)) begin
|
||||||
|
assert(i_htrans == 2'h0);
|
||||||
|
assert(d_htrans == 2'h0);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Bus properties
|
// Bus properties
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,12 @@ always @ (posedge clk)
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// DUT
|
// DUT
|
||||||
|
|
||||||
|
(* keep *) wire pwrup_req;
|
||||||
|
(* keep *) wire pwrup_ack;
|
||||||
|
(* keep *) wire clk_en;
|
||||||
|
(* keep *) wire unblock_out;
|
||||||
|
(* keep *) wire unblock_in;
|
||||||
|
|
||||||
(* keep *) wire [31:0] i_haddr;
|
(* keep *) wire [31:0] i_haddr;
|
||||||
(* keep *) wire i_hwrite;
|
(* keep *) wire i_hwrite;
|
||||||
(* keep *) wire [1:0] i_htrans;
|
(* keep *) wire [1:0] i_htrans;
|
||||||
|
@ -61,8 +67,15 @@ localparam W_DATA = 32;
|
||||||
|
|
||||||
hazard3_cpu_2port dut (
|
hazard3_cpu_2port dut (
|
||||||
.clk (clk),
|
.clk (clk),
|
||||||
|
.clk_always_on (clk),
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
|
|
||||||
|
.pwrup_req (pwrup_req),
|
||||||
|
.pwrup_ack (pwrup_ack),
|
||||||
|
.clk_en (clk_en),
|
||||||
|
.unblock_out (unblock_out),
|
||||||
|
.unblock_in (unblock_in),
|
||||||
|
|
||||||
.i_haddr (i_haddr),
|
.i_haddr (i_haddr),
|
||||||
.i_hwrite (i_hwrite),
|
.i_hwrite (i_hwrite),
|
||||||
.i_htrans (i_htrans),
|
.i_htrans (i_htrans),
|
||||||
|
|
Loading…
Reference in New Issue