//--------------------------------------------------------------------------- // // ASSERT_DECREMENT // //--------------------------------------------------------------------------- // NAME // ASSERT_DECREMENT - An invariant concurrent assertion to ensure // that an expression (or variable) decreases by // exactly a defined value (default 1). // //--------------------------------------------------------------------------- module assert_decrement (clk, reset_n, test_expr); // synopsys template parameter severity_level = 0; parameter width=1; parameter value=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_expr; reg r_reset_n, r_r_reset_n; initial r_reset_n = 0; initial r_r_reset_n = 0; parameter assert_name = "ASSERT_DECREMENT"; 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_expr = {1'b0,last_test_expr} - {1'b0,test_expr}; // 2's complement result if (temp_expr[width-1:0] != value) 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