在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3089|回复: 9

[讨论] 一个sv assertion的写法

[复制链接]
发表于 2016-9-20 14:48:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
要求对以下场景做assertion:
   如果a 脉冲后要来c脉冲,则中间必须有个b脉冲。
2016_0920_ 1449.png

自己写了一个,但是感觉不是很好。同时只能在vcs下编译通过,irun会有语法错误。想看看有没有更好的写法。谢谢大家。






  1. module a (                  );  reg a , b ,c;  reg clk;  initial begin    init_var;
  2.     delay(1);
  3.     //success    a=1;    delay(2);    a = 0;    delay(10);
  4.     a=1;    delay(2);    a = 0;    delay(10);
  5.     b=1;    delay(2);    b = 0;    delay(10);
  6.     c=1;    delay(2);    c = 0;    delay(10);
  7.     //failed    a=1;    delay(2);    a = 0;    delay(10);
  8.     a=1;    delay(2);    a = 0;    delay(10);
  9.     c=1;    delay(2);    c = 0;    delay(10);
  10.     $finish();  end
  11.   sequence seq_rd_to_wr(a,b);    !a[*1:$] ##1 $rose(b);  endsequence
  12.   sequence rose_wr(a,b,c);    //@(posedge clk) $fell(a) ##1 !a[*1:$] ##1 $rose(b) ##[1:$] $rose(c);    s_rd(a) intersect s_cs(b,c);  endsequence
  13.   sequence s_rd(a);    @(posedge clk) $fell(a) ##1 !a[*1:$];  endsequence
  14.   sequence s_cs(b,c);    @(posedge clk) !b[*1:$]##1 b[*2] ##1 !b[*1:$] ##1 $rose(c);  endsequence
  15.   property prop_check_rd_to_wr;    @(posedge clk) $rose(c) |->  rose_wr(a,b,c).triggered;   endproperty
  16.   A_check_rd_to_wr:assert property(prop_check_rd_to_wr);
  17.   parameter PERIOD = 20;  always begin    #(PERIOD/2) clk =  ~clk;  end
  18.   task init_var();  begin    a <= 0 ;    b <= 0 ;    c <= 0 ;    clk <= 0;  end  endtask
  19.    task delay(int clk_num=1);     #(clk_num*PERIOD);   endtask   task automatic pulse(int clk_num=1,ref i);    i = 1;    repeat(clk_num) @(posedge clk);    i = 0;  endtask
  20.   initial begin:fsdb_block    $fsdbAutoSwitchDumpfile(100,"a.fsdb",100);    $fsdbDumpvars(0,"a","+all");  endendmodule


复制代码
发表于 2016-9-20 19:13:01 | 显示全部楼层




  1. module test;
  2.         reg a , b ,c;  
  3.         reg clk;  
  4.        
  5.         initial begin   
  6.                 a = 0;
  7.                 b = 0;
  8.                 c = 0;
  9.                 delay(1);
  10.                 //success   
  11.                 a=1;   
  12.                 delay(2);   
  13.                 a = 0;   
  14.                 delay(10);
  15.                 a=1;   
  16.                 delay(2);   
  17.                 a = 0;   
  18.                 delay(10);
  19.                 b=1;   
  20.                 delay(2);   
  21.                 b = 0;   
  22.                 delay(10);
  23.                 c=1;   
  24.                 delay(2);   
  25.                 c = 0;   
  26.                 delay(10);
  27.                 //failed   
  28.                 a=1;   
  29.                 delay(2);   
  30.                 a = 0;   
  31.                 delay(10);
  32.                 a=1;
  33.                 delay(2);   
  34.                 a = 0;   
  35.                 delay(10);
  36.                 c=1;   
  37.                 delay(2);   
  38.                 c = 0;   
  39.                 delay(10);
  40.                 $finish();
  41.         end

  42.         initial begin
  43.                 clk = 0;
  44.                 forever begin
  45.                         #5 clk = ~clk;
  46.                 end
  47.         end
  48.        
  49.    task delay(int clk_num=1);   
  50.         repeat(clk_num) begin
  51.                 @(posedge clk);
  52.         end
  53.    endtask
  54.    
  55.         sequence boundary;
  56.                 @(posedge clk) $rose(a) ##[2:$] $rose(c);
  57.         endsequence

  58.         sequence detect_b;
  59.                 @(posedge clk) $rose(a) ##[1:$] $rose(b) ##[1:$] $rose(c);
  60.         endsequence
  61.        
  62.         sequence detect_bn;
  63.                 @(posedge clk) $rose(a) ##0 !b[*1:$] ##0 $rose(c);
  64.         endsequence

  65.         property rules_check_correct;
  66.                 @(posedge clk) $rose(a) |->
  67.                         boundary intersect detect_b;
  68.         endproperty
  69.        
  70.         property rules_check_error;
  71.                 @(posedge clk) $rose(a) |->
  72.                         boundary intersect detect_bn;
  73.         endproperty
  74.        
  75.         rules_check_ast:assert property(rules_check_error) $display("property fail detected!");
  76.         rules_check_cov:cover property(rules_check_correct) $display("property success detected!");
  77.        
  78. endmodule


复制代码
提供一个参考,没有剔除多重 $rose(a)的情况,可自己演进,另外不包含B,C同周期判定的情况,也可自行修改
 楼主| 发表于 2016-9-21 11:55:28 | 显示全部楼层
谢谢回复。
拓展下思路。
 楼主| 发表于 2016-9-21 14:28:42 | 显示全部楼层
这个assert我觉得难就难在多重$rose(a)的情况,因此由$rose触发不好写。所以后面我用了.triggered.
不知道还有哪位能给个好法子不需要用到.triggered的
发表于 2016-9-21 16:34:48 | 显示全部楼层




  1.   
  2.         sequence boundary;
  3.                 @(posedge clk) $fell(a) ##0 !a[*2:$] ##0 $rose(c);
  4.         endsequence

  5.         sequence detect_b;
  6.                 @(posedge clk) $fell(a) ##[1:$] $rose(b) ##[1:$] $rose(c);
  7.         endsequence
  8.        
  9.         sequence detect_bn;
  10.                 @(posedge clk) $fell(a) ##0 !b[*1:$] ##0 $rose(c);
  11.         endsequence

  12.         property rules_check_correct;
  13.                 @(posedge clk) $fell(a) |->
  14.                         detect_b within boundary;
  15.         endproperty
  16.        
  17.         property rules_check_error;
  18.                 @(posedge clk) $fell(a) |->
  19.                         detect_bn within boundary;
  20.         endproperty


复制代码
发表于 2016-9-21 16:36:15 | 显示全部楼层





  1.         sequence boundary;
  2.                 @(posedge clk) $fell(a) ##[2:$] $rose(c);
  3.         endsequence

  4.         sequence detect_b;
  5.                 @(posedge clk) $fell(a) ##[1:$] $rose(b) ##[1:$] $rose(c);
  6.         endsequence
  7.        
  8.         sequence detect_bn;
  9.                 @(posedge clk) $fell(a) ##0 !b[*1:$] ##0 $rose(c);
  10.         endsequence

  11.         property rules_check_correct;
  12.                 @(posedge clk) $fell(a) |->
  13.                         !a throughout
  14.                         (boundary intersect detect_b);
  15.         endproperty
  16.        
  17.         property rules_check_error;
  18.                 @(posedge clk) $fell(a) |->
  19.                         !a throughout
  20.                         (boundary intersect detect_bn);
  21.         endproperty
  22.        


复制代码
 楼主| 发表于 2016-9-22 10:01:59 | 显示全部楼层
@AnswerLJ  强。 !a throughout写起来简洁多了。
不过还是没有解决之前说的: 多个a pulse之间没有 bpulse或者c pulse应该是允许的。不应该failed。
所以我感觉用c pulse的triggered来触发会比较容易点。
不用triggered的法子还不知道怎么写。
发表于 2016-9-22 10:50:02 | 显示全部楼层




  1.         sequence boundary;
  2.                 @(posedge clk) !a throughout ($fell(a) ##[0:$] $rose(c));
  3.         endsequence

  4.         sequence detect_b;
  5.                 @(posedge clk) !a throughout ($fell(a) ##[0:$] $rose(b) ##[0:$] $rose(c));
  6.         endsequence
  7.        
  8.         sequence detect_bn;
  9.                 @(posedge clk) !a throughout ($fell(a) ##0 !b[*1:$] ##0 $rose(c));
  10.         endsequence

  11.         property rules_check_correct;
  12.                 @(posedge clk) detect_b.ended |->
  13.                         boundary.ended;
  14.         endproperty
  15.        
  16.         property rules_check_error;
  17.                 @(posedge clk) detect_bn.ended |->
  18.                         boundary.ended;
  19.         endproperty


复制代码
 楼主| 发表于 2016-9-22 16:46:49 | 显示全部楼层
本帖最后由 zzczx 于 2016-9-22 17:33 编辑





  1.       sequence detect_bn;
  2.                 @(posedge clk) (!a throughout ($fell(a) ##0 !b[*1:$] ##0 $rose(c)));
  3.         endsequence
  4.         property rules_detect_error;
  5.           @(posedge clk)  $rose(c) |->  !detect_bn.ended;
  6.         endproperty
  7.         rules_check_detect_error: assert property(rules_detect_error)$display("property successed detected! %t",$time);else
  8.                                                                         $display("property failed detected! %t",$time) ;      


复制代码


这个是目前想到最简单的写法了。
还是需要.ended/.triggered.
发表于 2016-9-22 19:21:31 | 显示全部楼层
very good
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 17:58 , Processed in 0.023954 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表