• 电力电子转战数字IC20220823day67——uvm实战2


     实验目标

    来依次看每个断言的时序要求。

    实验任务 

     所有的property assertion都写在接口pkg中,也可以在module,但不能在class中

    1. property p_paddr_no_x;
    2. @(posedge clk) psel |-> !$isunknown(paddr);//指定了clk
    3. //系统函数相当于$countbits(expression, ‘x, ‘z)!=0
    4. //即psel为高时paddr不为x和z
    5. endproperty: p_paddr_no_x
    6. assert property(p_paddr_no_x) else `uvm_error("ASSERT", "PADDR is unknown when PSEL is high")

    采样的信号和clk都来自interface 

    1. property p_psel_rose_next_cycle_penable_rise;
    2. @(posedge clk) $rose(psel) |=> $rose(penable);
    3. //psel拉高后的下一个clk,penable也拉高
    4. endproperty: p_psel_rose_next_cycle_penable_rise
    5. assert property(p_psel_rose_next_cycle_penable_rise) else `uvm_error("ASSERT", "PENABLE not rose after 1 cycle PSEL rose")

     

    1. property p_penable_rose_next_cycle_fall;
    2. @(posedge clk) $rose(penable) |=> $fell(penable);
    3. endproperty: p_penable_rose_next_cycle_fall
    4. assert property(p_penable_rose_next_cycle_fall) else `uvm_error("ASSERT", "PENABLE not fall after 1 cycle PENABLE rose")
    1. property p_pwdata_stable_during_trans_phase;
    2. @(posedge clk) ((psel && !penable) ##1 (psel && penable)) |-> $stable(pwdata);
    3. endproperty: p_pwdata_stable_during_trans_phase
    4. assert property(p_pwdata_stable_during_trans_phase) else `uvm_error("ASSERT", "PWDATA not stable during transaction phase")

     

    1. property p_paddr_stable_until_next_trans;
    2. logic[31:0] addr1, addr2;
    3. @(posedge clk) first_match(($rose(penable),addr1=paddr) ##1 ((psel && !penable)[=1],addr2=$past(paddr))) |-> addr1 == addr2;
    4. endproperty: p_paddr_stable_until_next_trans
    5. assert property(p_paddr_stable_until_next_trans) else `uvm_error("ASSERT", "PADDR not stable until next transaction start")
    6. property p_pwrite_stable_until_next_trans;
    7. logic pwrite1, pwrite2;
    8. @(posedge clk) first_match(($rose(penable),pwrite1=pwrite) ##1 ((psel && !penable)[=1],pwrite2=$past(pwrite))) |-> pwrite1 == pwrite2;
    9. endproperty: p_pwrite_stable_until_next_trans
    10. assert property(p_pwrite_stable_until_next_trans) else `uvm_error("ASSERT", "PWRITE not stable until next transaction start")

     

    1. property p_prdata_available_once_penable_rose;
    2. @(posedge clk) $rose(penable) && !pwrite |-> !$stable(prdata);
    3. endproperty: p_prdata_available_once_penable_rose
    4. assert property(p_prdata_available_once_penable_rose) else `uvm_error("ASSERT", "PRDATA not available once PENABLE rose")

    然后是断言覆盖率。

     连续写和非连续写。

    连续写,enable拉高后,写第一个是sel ##1 enable,然后马上sel ##1 enable

    非连续写时,enable拉高后,write贯穿整个写的过程,enable连续2个clk为低(和连续写区分),1个clk后enable为高。

    1. property p_write_during_nonburst_trans;
    2. @(posedge clk) $rose(penable) |-> pwrite throughout (##1 (!penable)[*2] ##1 penable[=1]);
    3. endproperty: p_write_during_nonburst_trans
    4. cover property(p_write_during_nonburst_trans);
    5. property p_write_during_burst_trans;
    6. @(posedge clk) $rose(penable) |-> pwrite throughout (##2 penable);
    7. endproperty: p_write_during_burst_trans
    8. cover property(p_write_during_burst_trans);

    对同一地址先写后读,也就是连续的。

    enable拉高后,write为高,地址给到变量存起来,然后准备读,2个clk后enable拉高,write拉低,把地址给到变量,要求两次的地址相同

    1. property p_write_read_burst_trans;
    2. logic[31:0] addr;
    3. @(posedge clk) ($rose(penable) && pwrite, addr=paddr) |-> (##2 ($rose(penable) && !pwrite && addr==paddr));
    4. endproperty: p_write_read_burst_trans
    5. cover property(p_write_read_burst_trans);

    同一地址连续写两次后读。

    这是验证需要激励发生的测试

    1. property p_write_twice_read_burst_trans;
    2. logic[31:0] addr;
    3. @(posedge clk) ($rose(penable) && pwrite, addr=paddr) |-> (##2 ($rose(penable) && pwrite && addr==paddr) ##2 ($rose(penable) && !pwrite && addr==paddr) );
    4. endproperty: p_write_twice_read_burst_trans
    5. cover property(p_write_twice_read_burst_trans);

     连续读和非连续读:write一直为低

    1. property p_read_during_nonburst_trans;
    2. @(posedge clk) $rose(penable) |-> !pwrite throughout (##1 (!penable)[*2] ##1 penable[=1]);
    3. endproperty: p_read_during_nonburst_trans
    4. cover property(p_read_during_nonburst_trans);
    5. property p_read_during_burst_trans;
    6. @(posedge clk) $rose(penable) |-> !pwrite throughout (##2 penable);
    7. endproperty: p_read_during_burst_trans
    8. cover property(p_read_during_burst_trans);

    对同一地址连续的读写读

    1. property p_read_write_read_burst_trans;
    2. logic[31:0] addr;
    3. @(posedge clk) ($rose(penable) && !pwrite, addr=paddr) |-> (##2 ($rose(penable) && pwrite && addr==paddr) ##2 ($rose(penable) && !pwrite && addr==paddr) );
    4. endproperty: p_read_write_read_burst_trans
    5. cover property(p_read_write_read_burst_trans);

    要求property短一点,名字显示出操作。不行就得加注释,注明检查的协议、覆盖的激励时序。

    外部设计控制assertion

    1. initial begin: assertion_control
    2. fork
    3. forever begin
    4. wait(rstn == 0);
    5. $assertoff();
    6. wait(rstn == 1);
    7. $asserton();
    8. end
    9. join_none
    10. end

    仿真

    尽管这里没有error,但是assertion并不一定没有问题,得看trigger了没有 

     view-coverage-assertion

    两个uvm内置的立即断言忽略。其他自定义的,failure count为0(前置seq满足,后置seq不满足),说明真的成功了,pass count为触发的次数(前置seq满足,后置seq也满足)

    右键assertion可以add wave,看具体波形

     activecount一共有三种颜色,对应蓝色start、active、inactive、pass

    0-4表示交叠的个数

     断言覆盖率。

  • 相关阅读:
    02_udp编程
    Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
    快捷键记录
    基于单片机PM2.5监测系统仿真设计
    Unity 加载读取PPT
    Git指令
    【C++】超详细入门——详解函数返回类型
    PDFgear——一款接入AI智能化模型的免费PDF聊天软件
    Java面向对象(高级)-- 类中属性赋值的位置及过程
    git 基础
  • 原文地址:https://blog.csdn.net/weixin_39668316/article/details/126483853