为什么是;如果..否则“;systemverilog断言属性中不鼓励使用语句?

为什么是;如果..否则“;systemverilog断言属性中不鼓励使用语句?,verilog,system-verilog,hdl,system-verilog-assertions,Verilog,System Verilog,Hdl,System Verilog Assertions,我正在为以下结构编写断言检查 基本上,我想检查选择信号为0时输出是否等于d1,选择信号为1时输出是否等于d2 我是这样做的: property check_mux_out (clk, rst, en, d1, output, d2, select); @(posedge clk) if (select) (rst==0) && (en==1) |-> (output === d2); else (rst==0) &&

我正在为以下结构编写断言检查

基本上,我想检查选择信号为0时输出是否等于d1,选择信号为1时输出是否等于d2

我是这样做的:

property check_mux_out (clk, rst, en, d1, output, d2, select);
   @(posedge clk)
   if (select)
      (rst==0) && (en==1) |-> (output === d2);
   else
      (rst==0) && (en==1) |-> (output === d1);
endproperty

a1: assert property (check_mux_out(inst1_clk, inst1_rst, latch_en, signal1, inst_out, signal2, inst_select)) else $error("ERROR: output not equal input");
然而,我在网上看到了一些帖子 和
这似乎表明在systemverilog属性中不应使用if..else语句。为什么会这样?我做错了什么?为什么?

我想,唯一的建议是避免写大的属性。很容易把代码弄乱。if/else只会增加尺寸,并有可能进一步混淆它

您的代码有语法错误。不能将关键字
output
用作变量名。还有一个额外的
在代码中的if子句之后

甚至没有if/else

property check_mux_out (clk, rst, en, d1, out, d2, select);
   @(posedge clk)
  (rst==0) && (en==1) |-> (select) ? (out === d2) : (out === d1);
endproperty
property check_mux_out (clk, rst, en, d1, out, d2, select);
   @(posedge clk)
     (rst==0) && (en==1) |-> if (select) (out === d2) else (out === d1);
endproperty
property check_mux_out (clk, rst, en, d1, out, d2, select);
   @(posedge clk)
  (rst==0) && (en==1) |-> (select) ? (out === d2) : (out === d1);
endproperty