//--------------------------------------------------------------------------- // // ASSERT_WIDTH // //--------------------------------------------------------------------------- // NAME // ASSERT_WIDTH - An invariant concurrent assertion to ensure // //--------------------------------------------------------------------------- module assert_width (clk, reset_n, test_expr); // synopsys template parameter severity_level=0; parameter min_cks=1; parameter max_cks=1; parameter options=0; parameter msg="VIOLATION"; input clk; input reset_n; input test_expr; //synopsys translate_off `ifdef ASSERT_ON `ifdef ASSERT_REPORT `else `define ASSERT_REPORT $display `endif parameter WIDTH_START = 2'b00; parameter WIDTH_CKMIN = 2'b01; parameter WIDTH_CKMAX = 2'b10; parameter WIDTH_IDLE = 2'b11; reg r_test_expr; reg [1:0] r_state; integer num_cks; initial begin r_state=WIDTH_START; r_test_expr = 1'b0; num_cks = 0; end parameter assert_name = "ASSERT_WIDTH"; 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 initial begin if ((min_cks > 0) && (max_cks > 0)) if (min_cks > max_cks) ovl_error("min_cks > max_cks"); end always @(posedge clk) begin r_test_expr <= test_expr; `ifdef ASSERT_GLOBAL_RESET if (`ASSERT_GLOBAL_RESET != 1'b0) begin `else if (reset_n != 0) begin // active low reset `endif case (r_state) WIDTH_START: if ((r_test_expr == 1'b0) && (test_expr == 1'b1)) begin num_cks <= 1; if (min_cks > 0) r_state <= WIDTH_CKMIN; else if (max_cks > 0) r_state <= WIDTH_CKMAX; end WIDTH_CKMIN: if (test_expr == 1'b1) begin num_cks <= num_cks + 1; if (num_cks >= min_cks) begin if (max_cks > 0) r_state <= WIDTH_CKMAX; else r_state <= WIDTH_IDLE; end end else begin if (num_cks < min_cks) begin ovl_error("MIN_CHECK"); end r_state <= WIDTH_START; end WIDTH_CKMAX: if (test_expr == 1'b1) begin num_cks <= num_cks + 1; if (num_cks > max_cks) begin ovl_error("MAX_CHECK"); r_state <= WIDTH_IDLE; end end else begin if (num_cks > max_cks) begin ovl_error("MAX_CHECK"); end r_state <= WIDTH_START; end WIDTH_IDLE: if (test_expr == 1'b0) begin r_state <= WIDTH_START; end endcase end else begin r_state <= WIDTH_START; r_test_expr <= 1'b0; end end // always `endif //synopsys translate_on endmodule