System verilog SV断言:对于特定状态,检查信号为高,并且在该状态期间不会改变

System verilog SV断言:对于特定状态,检查信号为高,并且在该状态期间不会改变,system-verilog,assert,assertion,System Verilog,Assert,Assertion,只要我处于FSM‘FSM_WAIT’状态,我想检查我的信号A是否高。如果A在这种状态下的任何地方变低,我应该标记一个错误。断言应该检查A在状态期间是否变高,并在整个过程中保持高 我尝试了类似这样的示例代码 @(posedge clk ) disable iff (!reset) (fsm_state== FSM_WAIT ) && A |-> ##Duration A; endproperty : p_try

只要我处于FSM‘FSM_WAIT’状态,我想检查我的信号A是否高。如果A在这种状态下的任何地方变低,我应该标记一个错误。断言应该检查A在状态期间是否变高,并在整个过程中保持高

我尝试了类似这样的示例代码

        @(posedge clk )
        disable iff (!reset)
        (fsm_state==  FSM_WAIT ) && A |-> ##Duration A;
    endproperty : p_try  

Doesn't see correct to me though, please help. Thanks


谢谢Dave的回复,我试过了,效果很好。另外,如果我还有4个信号B、C、D,它们分别应该是0、0和1,那么在同一个断言中有方法检查它们。我相信我可以通过使用&&来实现这一点?还有别的办法吗?
A&&!B&&!或者你可以写
{A,B,C,D}==4'b1001
。这对你来说更容易阅读谢谢你的建议Dave。其目的是使其更容易,因为这些信号将在等待状态下检查。但是,如果这两个条件中的任何一个都不正确,我的断言将不会被激活,我将无法检查A/B/C/D。因此,我应该编写单独的断言来检查所有。这个想法是在最后基本上检查所有内容,但我不想因为&&&而失去检查。非常感谢您的建议。嗨,Dave,在您最初的回复中,如果在FSM_等待状态中A为零,则断言将不会激活。它正在检查它是否没有在这两者之间切换,但如果在开始时A较低,则此断言将不会激活,因为fsm_状态是与A一起启用的。那么,当它进入时,如何检查我的A是否也很高呢?
(fsm_state==FSM_WAIT ) && A |-> A until (fsm_state!=FSM_WAIT )