System verilog 带变量的系统verilog绑定断言序列

System verilog 带变量的系统verilog绑定断言序列,system-verilog,system-verilog-assertions,System Verilog,System Verilog Assertions,我必须用绑定编写系统verilog断言 断言应该类似于: assert property (@(posedge (mod_clk & clk_gen_enable)) ##delay (clk_sync == 1)); mod_clk、clk_gen_en和clk_sync是我绑定到的模块的信号,延迟是一个变量,它是计算的结果,应该以st_clk的“单位”为单位,st_clk也是我绑定到t的模块的信号 我怎样才能正确地编写它呢?对于bind to work,您所需要的只是将这个断言封装

我必须用绑定编写系统verilog断言

断言应该类似于:

assert property (@(posedge (mod_clk & clk_gen_enable)) ##delay (clk_sync == 1));
mod_clk、clk_gen_en和clk_sync是我绑定到的模块的信号,延迟是一个变量,它是计算的结果,应该以st_clk的“单位”为单位,st_clk也是我绑定到t的模块的信号
我怎样才能正确地编写它呢?

对于bind to work,您所需要的只是将这个断言封装在一个模块中

module my_module;
assert property (@(posedge (mod_clk & clk_gen_enable)) ##delay (clk_sync == 1));
endmodule
使用
bind
构造将
myu模块
插入目标模块。Verilog搜索规则将向上搜索以查找您的信号名称

bind my_target_module my_module my_instance_name();
##delay
在您之前指定的时钟边缘上工作,您将其作为
mod#clk&clk#U gen_enable
。我猜你真的想把
clk\u gen\u enable
作为暗示

property sync;
  int counter;
  @(posedge mod_clk) (clk_gen_enable, counter=delay)
        |-> @(posedge st_clk) (1,counter--)[*0:$] ##1 counter<0 ##0 (clk_sync == 1));
endproperty
属性同步;
整数计数器;
@(posedge mod_clk)(clk_gen_启用,计数器=延迟)

|->@(posedge st#u clk)(1,计数器--)[*0:$]##1计数器这里有许多不清楚的东西。例如,您如何绑定到什么中。是什么让您认为您提供的代码不正确?你是否犯了错误,行为不当?请提供一个可以复制的例子,并将你的问题细化到一个特定的问题。@dave_59-这就是我的意思。但是我可以在循环数中使用一个变量吗?它可能会偶尔改变……对不起,我的回答中没有提到这个要求。请参见编辑后的回答能否解释第二部分
(1,计数器--)[*0:$]##1 counterSystemVerilog断言的工作原理与文本正则表达式类似
[*0:$]
表示前面的表达式
1
必须在0到无限个连续循环之间为真。下一个循环,
计数器
必须为负数。当匹配时,同样,
clk\u sync
必须为true。它工作不正常。我可以在波形中看到,断言是活动的,因为
mod_clk
的负边缘,并且在
clk_sync
的负边缘之后完成了
st_clk
的一个时钟,以防
clk_sync==0
(并且它通过了“尽管它应该失败”)。如果
clk\u sync==0
则自
mod\u clk
的posedge开始,断言处于活动状态,并在
clk\u sync
的负边缘结束。