//--------------------------------------------------------------------------- // // ASSERT_DELTA // //--------------------------------------------------------------------------- // NAME // ASSERT_DELTA - An invariant concurrent assertion to ensure // that an expression (or variable) will only // change values by at least MIN and at most MAX. // //--------------------------------------------------------------------------- module assert_delta (clk, reset_n, test_expr); // synopsys template parameter severity_level = 0; parameter width=1; parameter min=1; parameter max=1; `ifdef ASSERT_V1_0_1 // Previous version of the library `else // New version to allow for future options parameter options = 0; `endif parameter msg="VIOLATION"; input clk, reset_n; input [width-1:0] test_expr; //synopsys translate_off `ifdef ASSERT_ON reg [width-1:0] last_test_expr; reg [width:0] temp_expr1; reg [width:0] temp_expr2; reg r_reset_n, r_r_reset_n; initial r_reset_n = 0; initial r_r_reset_n = 0; parameter assert_name = "ASSERT_DELTA"; integer error_count; initial error_count = 0; `include "ovl_task.h" `ifdef ASSERT_INIT_MSG initial ovl_init_msg; // Call the User Defined Init Message Routine `endif always @(posedge clk) begin `ifdef ASSERT_GLOBAL_RESET if (`ASSERT_GLOBAL_RESET != 1'b0) begin r_reset_n <= `ASSERT_GLOBAL_RESET; `else if (reset_n != 1'b0) begin r_reset_n <= reset_n; `endif r_r_reset_n <= r_reset_n; last_test_expr <= test_expr; // check second clock afer reset if (r_reset_n && r_r_reset_n && (last_test_expr != test_expr)) begin temp_expr1 = {1'b0,last_test_expr} - {1'b0,test_expr}; temp_expr2 = {1'b0,test_expr} - {1'b0,last_test_expr}; // 2's complement result if (!((temp_expr1[width-1:0]>=min && temp_expr1[width-1:0]<=max) || (temp_expr2[width-1:0]>=min && temp_expr2[width-1:0]<=max))) begin ovl_error(""); end end end else begin r_reset_n <= 0; r_r_reset_n <= 0; end end // always `endif //synopsys translate_on endmodule