我的问题在下面的论文"Asynchronous Behaviors Meet Their Match with SystemVerilog Assertions"中得到了很好的描述:
请考虑图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都抱怨相交内使用多个时钟:
指令15.20:在多时钟环境中无效的运算符和/或操作数。
Synopsys VCS 2014.10:'intersect'运算符的右操作数中应有单时钟序列,找到了多时钟序列。
https://www.edaplayground.com/x/wGE
但是,当我使用Aldec Riviera Pro 2017.02进行编译时,它确实可以工作,所以我猜测这只是一个工具限制。
还有其他替代方法可以实现这一目标吗?
答案 0 :(得分:0)
我发现使用胶合逻辑来避免复杂的属性很有帮助。
在这种情况下,我将计算dst_clk个时钟并执行以下操作:
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
说明:
第一行捕获当前计数器值,第二行确保频闪不下降,最后一行检查我们已经通过了3个dst时钟