//+++++++++++++++++++++++++++++++++++++++++++++++++
// DUT With assertions
//+++++++++++++++++++++++++++++++++++++++++++++++++
module hash_sequence();
logic clk = 0;
always #1 clk ++;
logic [2:0] req,gnt;
logic reset;
//=================================================
// Shows basic usage of ## delay operator
//=================================================
sequence req_gnt_1clock_seq;
req[0] ##1 gnt[0];
endsequence
//=================================================
// Shows range usage of ## delay operator
//=================================================
sequence req_gnt_3to5clock_seq;
req[1] ##[3:5] gnt[1];
endsequence
//=================================================
// Shows zero delay usage of ## delay operator
//=================================================
sequence req_gnt_0clock_seq;
req[2] ##0 gnt[2];
endsequence
//=================================================
// Shows sequence called within sequence
//=================================================
sequence master_seq;
req_gnt_1clock_seq ##1 req_gnt_3to5clock_seq ##1 req_gnt_0clock_seq;
endsequence
//=================================================
// Declare property for each of sequence
// We may use more then one seuqnce in a property
//=================================================
property req_gnt_1clock_prop;
@ (posedge clk)
disable iff (reset)
req[0] |-> req_gnt_1clock_seq;
endproperty
property req_gnt_3to5clock_prop;
@ (posedge clk)
disable iff (reset)
req[1] |-> req_gnt_3to5clock_seq;
endproperty
property req_gnt_0clock_prop;
@ (posedge clk)
disable iff (reset)
req[2] |-> req_gnt_0clock_seq;
endproperty
property master_prop;
@ (posedge clk)
disable iff (reset)
req[0] |-> master_seq;
endproperty
//=================================================
// Assertion Directive Layer
//=================================================
req_gnt_1clock_assert : assert property (req_gnt_1clock_prop);
req_gnt_3to5clock_assert : assert property (req_gnt_3to5clock_prop);
req_gnt_0clock_assert : assert property (req_gnt_0clock_prop);
master_assert : assert property (master_prop);
//=================================================
// Drive the input vectors to test assetion
//=================================================
initial begin
// Init all the values
reset <= 0;
for (int i = 0; i < 3; i++) begin
req[i] <= 0;
gnt[i] <= 0;
end
@ (posedge clk);
req[0] <= 1;
@ (posedge clk);
gnt[0] <= 1;
req[0] <= 0;
@ (posedge clk);
gnt[0] <= 0;
req[1] <= 1;
@ (posedge clk);
req[1] <= 0;
repeat(3) @ (posedge clk);
gnt[1] <= 1;
@ (posedge clk);
gnt[1] <= 0;
req[2] <= 1;
gnt[2] <= 1;
@ (posedge clk);
req[2] <= 0;
gnt[2] <= 0;
// Cause assertion to fail
@ (posedge clk);
req[0] <= 1;
repeat(2) @ (posedge clk);
gnt[0] <= 1;
req[0] <= 0;
#30 $finish;
end
endmodule