稳定 n*8 个周期 属性
Stable for n*8 cycles property
我正在学习 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
我觉得有一种优雅的方式使用类似的方法;或使用递归属性。但是,我没找到。
我建议使用局部变量来验证
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
我正在学习 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
我觉得有一种优雅的方式使用类似的方法;或使用递归属性。但是,我没找到。
我建议使用局部变量来验证
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