• Assertion检查


    1 什么是断言?

      通过在代码中插入对RTL的特征描述,检查RTL代码的关键行为是否和期望的一致(一般检查设计中的控制信号的完整性和数据的完整性),当异常出现时,断言语句会报警。通过这种方法可以快速的定位问题,为测试平台提供自检机制,提高验证效率。。

    2 什么是ovl库?

      Open Verification Library硬件验证库。在源代码设计的同时加入的更为细化的验证方案采用的库,通过在代码中插入ovl语句,可以在仿真验证中快速的定位出问题所在。

    3 使用案例

      在design start的APB4的example设计中,就有assert的使用例子。

    代码:在cmsdk_apb4_eg_slave.v中使用断言

    `ifdef ARM_APB_ASSERT_ON
    
     `include "std_ovl_defines.h"
      // ------------------------------------------------------------
      // Assertions
      // ------------------------------------------------------------
    
       // Check the reg_write_en signal generated
        assert_implication
        #(`OVL_ERROR,
          `OVL_ASSERT,
          "Error! register write signal was not generated! "
          )
         u_ovl_apb4_eg_slave_reg_write
         (.clk             (PCLK),
          .reset_n         (PRESETn),
          .antecedent_expr ( (PSEL & (~PENABLE) & PWRITE) ),
          .consequent_expr ( reg_write_en == 1'b1)
          );
    
    
    
      // Check the reg_read_en signal generated
        assert_implication
        #(`OVL_ERROR,
          `OVL_ASSERT,
          "Error! register read signal was not generated! "
          )
         u_ovl_apb4_eg_slave_reg_read
         (.clk             (PCLK),
          .reset_n         (PRESETn),
          .antecedent_expr ( (PSEL & (~PENABLE) & (~PWRITE)) ),
          .consequent_expr ( reg_read_en == 1'b1)
          );
    
    
      // Check register read and write operation won't assert at the same cycle
        assert_never
         #(`OVL_ERROR,
           `OVL_ASSERT,
           "Error! register read and write active at the same cycle!")
         u_ovl_apb4_eg_slave_rd_wr_illegal
         (.clk         (PCLK),
          .reset_n     (PRESETn),
          .test_expr   ((reg_write_en & reg_read_en))
          );
    
    
    `endif

    代码:在cmskd_apb4_eg_slave_interface.v中使用断言

    `ifdef ARM_APB_ASSERT_ON
    
     `include "std_ovl_defines.h"
      // ------------------------------------------------------------
      // Assertions
      // ------------------------------------------------------------
    
      // Check error response should not be generated if not selected
        assert_never
         #(`OVL_ERROR,
           `OVL_ASSERT,
           "Error! Should not generate error response if not selected")
         u_ovl_apb4_eg_slave_response_illegal
         (.clk        (pclk),
          .reset_n    (presetn),
          .test_expr  (pslverr & pready & (~psel))
          );
    
    `endif

    4 比较常用的断言

      比较常用的断言有两个,一个是assert_implication,一个是assert_never。

    4.1 assert_implication

    assert_implication [#(severity_level, property_type,
    msg, category, coverage_level_1,
    coverage_level_2, coverage_level_3)]
    inst_name (
        clk, 
        reset_n, 
        antecedent_expr, 
        consequent_expr);

    这个检查器会连续监测 antecedent_expr。如果值为真,检查器将验证consequent_expr 是否为真,如果为真,那么不会报错。antecedent_expr 为假的时候, consequent_expr 表达式将不会被检查,并且 断言表明通过。 

    4.2 assert_never

    assert_never [#(severity_level, property_type, msg,
    category)]
    inst_name (
        clk, 
        reset_n,
        test_expr);

    这个检查器会在每个时钟 clk 的上升沿连续的监测 test_expr。 它的检查目的 是: test_expr 的值永远不能为真。 test_expr 可以是任意有效的 verilog 表达式。 test_expr 为真的时候,检查器将会报错。

  • 相关阅读:
    自动关联
    如何提高测试效率
    检查点
    windows server 2008 安装vs2008 的问题
    【转】xampp mysql 忘记密码的解决方案
    zencart 目录产品显示控制
    静态html文件执行php语句的方法
    UNIX主机访问PHP程序提示“Internal Server Error”的处理办法
    【转】javascript 点击 <a> 链接
    u880刷机
  • 原文地址:https://www.cnblogs.com/yiwenbo/p/11118438.html
Copyright © 2020-2023  润新知