Verilog 下面的代码是否有其他方法可以减少编译和模拟所需的时间

Verilog 下面的代码是否有其他方法可以减少编译和模拟所需的时间,verilog,system-verilog,system-verilog-assertions,Verilog,System Verilog,System Verilog Assertions,定义: `define AIF_MSB(AIF_i) (AIF_i == 0)?0 :\ (AIF_i == 1)?1 :\ (AIF_i == 2)?2 :\ (AIF_i == 3)?3 :\ (AIF_i == 4)?4 :\ (AIF_i == 5

定义:

       `define AIF_MSB(AIF_i) (AIF_i == 0)?0 :\
                       (AIF_i == 1)?1 :\
                       (AIF_i == 2)?2 :\
                       (AIF_i == 3)?3 :\
                       (AIF_i == 4)?4 :\
                       (AIF_i == 5)?5 :\
                       (AIF_i == 6)?6 :\
                       (AIF_i == 7)?7 :\
                       (AIF_i == 8)?8 :\
                       (AIF_i == 9)?9 :\
                       (AIF_i == 10)?10 :\
                       (AIF_i == 11)?11 :\
                       (AIF_i == 12)?12 :\
                       (AIF_i == 13)?13 :\
                       (AIF_i == 14)?14 :\
                       (AIF_i == 15)?15 :\
                       (AIF_i == 16)?16 :\
                       (AIF_i == 17)?17 :\
                       (AIF_i == 18)?18 :\
                       (AIF_i == 19)?19 :0

    genvar AIF_i;
    generate
    for(AIF_i = 0; AIF_i < 16; AIF_i++)
    begin

CHECKER_71 :   assert 
    property(p_GGIS_invalid_chk(GGIS_ADDR,`AIF_MSB(AIF_i),`AIF_LSB(AIF_i),dut_if.lo_GGIS_AIF[AIF_i],
             event_if.fab_rd_res_txed, INTR_WR_REQ, AIF_i))else
              begin
               `uvm_error(log,$psprintf("CHECKER_71 :GGIS.AIF[%0d] is failed for 68 | 69 | 70",AIF_i));
             end

end
endgenerate

property p_GGIS_invalid_chk(addr,msb,lsb,field, req_type, pkt_type,AIF_i);
@(posedge clk_apb)
  $changed(field)
  |-> ((seq_reset_chk_RC(field,0,10).triggered)                                                                             
or
       (seq_GGIS_wr_set_trig_RC(addr,msb,lsb,field).triggered)                                               
or
       (seq_GGIS_set_chk_RC(addr,msb,lsb,req_type, pkt_type, 
field,AIF_i).triggered));
endproperty

sequence seq_reset_chk_RC(field,lower,upper);
 @(posedge clk_apb)
   (seq_reset_trig_FC.triggered
    ##[lower:upper] (seq_clr_chk_FC(field)));
endsequence

sequence seq_GGIS_wr_set_trig_RC(addr,msb,lsb,field);
  @(posedge clk_apb)
  (seq_GGIS_wr_set_trig_FC(addr,msb,lsb,field).triggered)
  ##[0:10] (field == 0);
endsequence

sequence seq_GGIS_AIF17_set_RC(addr,msb,lsb,field);
@(posedge clk_apb)
    (seq_GGIS_AIF17_trig_FC.triggered)
    ##[0:10] ((seq_wr_set_chk_FC(field))                                                                           
or
              (seq_reset_trig_FC.triggered)                                         
or
              (seq_GGIS_wr_set_trig_FC(addr,msb,lsb,field).triggered));
Endsequence

sequence seq_wr_set_chk_FC(field);
 @(posedge clk_apb)
   (field == 1'b1);
endsequence

sequence seq_reset_trig_FC;
 @(posedge clk_apb)
   ($changed(dut_if.lo_GSWR_GR)         &&
   (dut_if.lo_GSWR_GR == 1'b1));
endsequence


sequence seq_GGIS_wr_set_trig_FC(addr,msb,lsb,field);
 @(posedge clk_apb)
  (seq_is_field_write(addr, msb, lsb)     and
  (apb_master_if.pwdata[msb:lsb] == 1)    and
  (seq_wr_set_chk_FC(field)));
endsequence
`define AIF_MSB(AIF_i)(AIF_i==0)?0:\
(AIF_i==1)?1:\
(AIF_i==2)?2:\
(AIF_i==3)?3:\
(AIF_i==4)?4:\
(AIF_i==5)?5:\
(AIF_i==6)?6:\
(AIF_i==7)?7:\
(AIF_i==8)?8:\
(AIF_i==9)?9:\
(AIF_i==10)?10:\
(AIF_i==11)?11:\
(AIF_i==12)?12:\
(AIF_i==13)?13:\
(AIF_i==14)?14:\
(AIF_i==15)?15:\
(AIF_i==16)?16:\
(AIF_i==17)?17:\
(AIF_i==18)?18:\
(AIF_i==19)?19:0
genvar AIFèi;
生成
对于(AIF_i=0;AIF_i<16;AIF_i++)
开始
检查程序71:断言
属性(p_GGIS_invalid_chk(GGIS_ADDR,`AIF_MSB(AIF_i),`AIF_LSB(AIF_i),dut_if.lo_GGIS_AIF[AIF_i],
事件\u if.fab\u rd\u res\x,INTR\u WR\u REQ,AIF\u i)其他
开始
`uvm|U错误(日志,$psprintf(“检查程序|71:GGIS.AIF[%0d]对于68 | 69 | 70”,AIF|i)失败);
结束
结束
最终生成
属性p_ggu无效(addr、msb、lsb、field、req_类型、pkt_类型、AIF_i);
@(posedge clk_apb)
$changed(字段)
|->((序列重置chk)RC(字段,0,10)。已触发)
或
(顺序GGIS\U wr\U set\U trig\U RC(地址、msb、lsb、字段)。已触发)
或
(以下为地址、msb、lsb、请求类型、pkt类型、,
字段,AIF_i);
端属性
顺序顺序复位(字段、下部、上部);
@(posedge clk_apb)
(顺序复位触发)
##[下:上](序列clr_chk_FC(字段));
端序列
序列顺序:GGIS、wr、set、trig、RC(地址、msb、lsb、字段);
@(posedge clk_apb)
(顺序GGIS\U wr\U set\U trig\U FC(地址、msb、lsb、字段)。已触发)
##[0:10](字段==0);
端序列
序列顺序:GGIS\u AIF17\u set\u RC(地址、msb、lsb、字段);
@(posedge clk_apb)
(以下为触发触发的触发)
##[0:10]((序列wr集合chk FC(字段))
或
(顺序复位触发)
或
(顺序GGIS\U wr\U set\U trig\U FC(地址、msb、lsb、字段)。已触发);
端序列
顺序顺序(字段);
@(posedge clk_apb)
(字段==1'b1);
端序列
顺序顺序复位触发功能;
@(posedge clk_apb)
($已更改(dut_if.lo_GSWR_GR)&&
(dut_if.lo_GSWR_GR==1'b1));
端序列
序列顺序:GGIS、wr、set、trig、FC(地址、msb、lsb、字段);
@(posedge clk_apb)
(顺序为字段写入(地址、msb、lsb)和
(apb_master_if.pwdata[msb:lsb]==1)和
(顺序:设置(字段));
端序列
  • 代码以上述格式编写。(使用的属性和序列定义如下)
  • define语句用于AIF的不同值(可能是0到50)
  • 无论何时调用它,都会对AIF值进行求值并获取我想要的值 减少在生成块中使用此操作所需的时间
  • 目前我面临性能问题
  • 我想知道另一种编写上述代码的方法,它将 减少编译和模拟的时间

  • 您当然可以使用更简单的表达式
    (AIF_i Hello Dave,谢谢你宝贵的时间。我编辑了我的查询并添加了属性/序列。因此,你想有效地减少属性计数吗?是的……任何使代码简单和编译所需时间的东西都不要使用断言。模拟器产生了太多重叠线程。编写一个小状态机使用基于e的监视器来检查协议冲突。并不是每个正式断言在模拟中都“可用”。您当然可以使用更简单的表达式
    (AIF_i Hello Dave,谢谢你宝贵的时间。我编辑了我的查询并添加了属性/序列。因此,你想有效地减少属性计数吗?是的……任何使代码简单和编译所需时间的东西都不要使用断言。模拟器产生了太多重叠线程。编写一个小状态机使用基于e的监视器来检查协议冲突。并不是每个正式断言在模拟中都是“可用”的。