0

我正在学习 SVA 并试图解决这个问题:数据只能每 8 个周期更改一次。

我知道我可以通过添加一个计算时钟周期的计数器并以这种方式对其进行检查来进行检查:

bit[2:0] count;

always @(posedge clk)
begin
    count++;
end

change_n8cycles: assert property (@(posedge clk) $changed(data) |-> count == 0);

但是,我对仅使用 SVA 的方法很感兴趣。到目前为止,我正在考虑类似的事情(无法编译)

property change_n8cycles(valid, ready, data);
    @(posedge clk)
    $changed(data) |=> $stable(data)[*7] ##1 ($stable(data)[*8])[0:$] ##0 $changed(data);
endproperty : change_n8cycles

我觉得有一种优雅的方式使用类似的方法;或使用递归属性。但是,我找不到它。

4

1 回答 1

1

我建议使用局部变量来验证

property change_n8cycles(valid, ready, data);
int lv_cnt;
@(posedge clk)
($changed(data), lv_cnt=0) ##1 ($stable(data), lv_cnt=lv_cnt+1)[*1:$] ##1 $changed(data) |-> lv_cnt == 8;
endproperty

或者使用一些建模层

always @(posedge clk) begin
  if($changed(data))
    count=0;
  else
    count++;
end

property change_n8cycles(data);
  @(posedge clk)
  $changed(data) |-> $past(count) == 8;
endproperty
于 2018-02-01T18:32:20.290 回答