`define WIDTH 8 module alu_t ( input Reset_n_i, input Clk_i, input [1:0] Opc_i, input [`WIDTH-1:0] DinA_i, input [`WIDTH-1:0] DinB_i, output [`WIDTH-1:0] Dout_o, output OverFlow_o ); `define OPC_ADD 0 `define OPC_SUB 1 `define OPC_AND 2 `define OPC_OR 3 alu #(.Width(`WIDTH)) alu_i ( .Reset_n_i(Reset_n_i), .Clk_i(Clk_i), .Opc_i(Opc_i), .DinA_i(DinA_i[`WIDTH-1:0]), .DinB_i(DinB_i[`WIDTH-1:0]), .Dout_o(Dout_o[`WIDTH-1:0]), .OverFlow_o(OverFlow_o) ); reg init_state = 1; // Initial reset always @(*) begin if (init_state) assume (!Reset_n_i); if (!init_state) assume (Reset_n_i); end always @(posedge Clk_i) init_state = 0; bit unsigned [`WIDTH:0] dina, dinb; assign dina = DinA_i; assign dinb = DinB_i; assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_ADD |=> Dout_o == ($past(DinA_i) + $past(DinB_i))); assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_ADD && (dina + dinb) > 2**`WIDTH-1 |=> OverFlow_o); assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_SUB |=> Dout_o == ($past(DinA_i) - $past(DinB_i))); assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_SUB && (dina - dinb) > 2**`WIDTH-1 |=> OverFlow_o); assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_AND |=> Dout_o == ($past(DinA_i) & $past(DinB_i))); assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_OR |=> Dout_o == ($past(DinA_i) | $past(DinB_i))); property cover_opc (opc); @(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == opc; endproperty cover property (cover_opc(`OPC_ADD)); cover property (cover_opc(`OPC_SUB)); cover property (cover_opc(`OPC_AND)); cover property (cover_opc(`OPC_OR)); endmodule