我有两个事件@A和@B。我想检查出现@A时,@ B是同时发出还是稍后发出。
expect my_check is ((@A and @B) or (@A => {[0..N]; @B}))@clk exec {
message(NONE, "my_check");
};
但是,我可以看到(从消息中)TE从模拟开始的每个时钟周期都成功。这很令人费解,因为在这段时间内A和B都没有出现。有什么想法有什么不对吗?是否禁止混合布尔和时间收益运算符?
答案 0 :(得分:2)
你在这里看到的是一个空洞的传球。第一个子表达式为FALSE,评估前进到下一个子表达式。第二个子表达式的计算结果为TRUE,因为前提条件@A not 发生(在这种情况下,暗示不能关心RHS表达式)。因此,OR被满足并且exec块被激活。
答案 1 :(得分:1)
经过一些实验,我发现:
expect my_check is @A => ({[..N-1];@B} or detach({@B; ~[..1]}))@clk
请注意,这仍需要第二个expect语句来检查虚假B事件。