interface abc_if(input wire clk, 
                  input wire reset_n);
  timeunit 1ns; timeprecision 100ps;
  wire  a, b, c;
  logic d;
  assign c=!a;
  modport fslave_if_mp (output c, d,
                       input  a, b);
  parameter hold_time=3;  // 3ns  
  parameter setup_time = 5;
endinterface : abc_if

module m(input logic clk, input reset_n, 
           abc_if.fslave_if_mp slave_if1);
  always @ (posedge clk) begin 
    ap_proc: assert property(@ (posedge clk) 
      $rose(slave_if1.a) |=> slave_if1.b);
    slave_if1.d <= slave_if1.c; 
  end 

  ap_conc: assert property(@ (posedge clk) 
      $rose(slave_if1.b) |=> slave_if1.c);

  logic a=1, b=0, c;
  ap_abc: assert property(@ (posedge clk) a|-> b |-> c);
  ap_bc: assert property(@ (posedge clk) b |-> c);
  


endmodule

module top; 
  logic clk=1'b1, reset_n;
  logic a=0, b=0;
  abc_if #(.setup_time(3), 
           .hold_time (3)) top_if(clk, reset_n);
   m m1(.clk(clk), .reset_n(reset_n), .slave_if1(top_if));
  initial forever #10 clk=!clk;
  always @ (posedge clk) begin
   ap_1: assert(randomize(a, b));	
  end
  assign top_if.a =a;
  assign top_if.b=b; 

endmodule : top 