System verilog SVA:验证不同时钟域中的稳定信号

System verilog SVA:验证不同时钟域中的稳定信号,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我的问题在下面的文章中得到了完美的描述: 考虑图8中的场景,其中选通信号在src_clk域中生成,并且在dst_clk域中必须至少稳定3个周期。断言必须检查选通信号是否保持稳定,以及是否有足够的设置和保持时间在dst_clk域中进行采样 然后,作者提出以下主张来克服这个问题: assert property ( @(posedge src_clk) $rose(strobe) |-> ( strobe[*1:$] ##1 1 ) ) intersect (

我的问题在下面的文章中得到了完美的描述:

考虑图8中的场景,其中选通信号在src_clk域中生成,并且在dst_clk域中必须至少稳定3个周期。断言必须检查选通信号是否保持稳定,以及是否有足够的设置和保持时间在dst_clk域中进行采样

然后,作者提出以下主张来克服这个问题:

assert property (
    @(posedge src_clk) $rose(strobe) |-> (
        strobe[*1:$] ##1 1 )
    ) intersect (
        ##1 @(posedge dst_clk) strobe[*3]
        ##1 @(posedge src_clk) 1
    )
 );
我的问题是Cadence incisive 15.20和Synopsys VCS 2014.10都抱怨在交叉点内使用多个时钟:

Incisive 15.20:多时钟上下文中的运算符和/或操作数无效

Synopsys VCS 2014.10:“intersect”运算符的右操作数中应为单时钟序列,找到多时钟序列

但是,当我使用Aldec Riviera Pro 2017.02编译时,它确实可以工作,所以我猜这只是一个工具限制


有没有其他方法可以实现这一点?

我发现使用粘合逻辑可以避免复杂的属性

在这种情况下,我会计算dst_时钟并执行以下操作:

unsigned reg [7:0] dst_clk_conter_width;
parameter counter_width = 256;

always @(posedge dst_clk) 
  dst_clk_counter <= dst_clk_counter +1;

property prop;
  @(posedge src_clk or posedge dst_clk)
  $rose(strobe) |-> 
    (1,strobe_rise_dst_clk_num = dst_clk_counter) 
    ##[1:$] strobe
    ##1 strobe && (dst_clk_counter  = (strobe_rise_dst_clk_num + 3) % counter_width)
endproperty
unsigned reg[7:0]dst_clk_conter_width;
参数计数器_宽度=256;
始终@(posedge dst_clk)
时钟计数器
(1,选通上升时钟数值=时钟计数器)
##[1:$]选通
##1选通和(dst时钟计数器=(选通上升dst时钟数字+3)%计数器宽度)
端属性
说明:


第一行捕获当前计数器值,第二行确保选通不会下降,最后一行检查我们是否已经通过了3个dst时钟

我发现使用粘合逻辑有助于避免复杂的属性

在这种情况下,我会计算dst_时钟并执行以下操作:

unsigned reg [7:0] dst_clk_conter_width;
parameter counter_width = 256;

always @(posedge dst_clk) 
  dst_clk_counter <= dst_clk_counter +1;

property prop;
  @(posedge src_clk or posedge dst_clk)
  $rose(strobe) |-> 
    (1,strobe_rise_dst_clk_num = dst_clk_counter) 
    ##[1:$] strobe
    ##1 strobe && (dst_clk_counter  = (strobe_rise_dst_clk_num + 3) % counter_width)
endproperty
unsigned reg[7:0]dst_clk_conter_width;
参数计数器_宽度=256;
始终@(posedge dst_clk)
时钟计数器
(1,选通上升时钟数值=时钟计数器)
##[1:$]选通
##1选通和(dst时钟计数器=(选通上升dst时钟数字+3)%计数器宽度)
端属性
说明:


第一行捕获当前计数器值,第二行确保选通不会下降,最后一行检查我们是否已经通过了3个dst时钟

您能简要说明问题吗?您能简要说明问题吗?