`default_nettype none
module MStatus_formal();
wire [11:0] i_adr;
wire [1:0] i_priv;
wire i_ree;
wire i_we;
wire [63:0] i_dat;
wire [63:0] o_dat;
wire o_valid;
wire rst, clk;
reg z_past_valid = 0;
always @(posedge clk)
z_past_valid <= 1;
MStatus dut(.i_adr(i_adr),
.i_priv(i_priv),
.i_ree(i_ree),
.i_we(i_we),
.i_dat(i_dat),
.o_dat(o_dat),
.o_valid(o_valid),
.rst(rst),
.clk(clk));
always @(*)
if(i_adr !== 12'h300) assert(!o_valid);
always @(*)
if(i_priv !== 2'h3) assert(!o_valid);
always @(posedge clk)
if($past(i_we) && $past(o_valid) && !$past(rst) && z_past_valid) begin
assert(o_dat[1:0] == 2'b00);
assert(o_dat[3:2] == $past(i_dat[3:2]));
assert(o_dat[5:4] == 2'b00);
assert(o_dat[7:6] == $past(i_dat[7:6]));
assert(o_dat[8] == 1'b0);
assert(o_dat[12:9] == $past(i_dat[12:9]));
assert(o_dat[16:13] == 4'b0000);
assert(o_dat[17] == $past(i_dat[17]));
assert(o_dat[22:18] == 5'b00000);
assert(o_dat[31:23] == $past(i_dat[31:23]));
assert(o_dat[35:32] == 4'b0000);
assert(o_dat[62:36] == $past(i_dat[62:36]));
assert(o_dat[63] == 1'b0);
end
endmodule