首页 > 其他分享 >constraint_mode( ):控制约束

constraint_mode( ):控制约束

时间:2022-08-28 16:45:52浏览次数:57  
标签:addr constraint 约束 mode data sf

与 rand_mode( ) 类似,还有一个 constraint_mode( ) 可以打开/关闭约束。 constraint_mode( ) 方法可用于控制约束是活动的还是非活动的。当约束处于非活动状态时,randomize() 方法不会考虑它。所有约束最初都是活动的。

当 <constraint_identifier>.constraint_mode(0) 被调用时,它会将指定的约束设置为非活动状态,以便后续的 randomize( ) 调用不会对其进行计算。

当 <constraint_identifier>.constraint_mode(1) 被调用时,它会将指定的约束设置为活动状态,以便随后的 randomize( ) 调用对其进行计算。

当作为函数调用时,constraint_mode( ) 返回指定约束块的当前活动状态。如果约束处于活动状态(打开),则返回 1,如果约束处于非活动状态(关闭),则返回 0。

看个例子:

class sft;
  rand bit [3:0] data, addr;
  constraint data_range1 { data <= 'h4; }
  constraint addr_range1 { addr > 'ha; }
endclass
module soft_constr;
  initial begin
    sft sf;
    sf = new();
    sf.data_range1.constraint_mode(0);
    sf.addr_range1.constraint_mode(0);
    repeat (4) begin
      sf.randomize( );
      $display("addr = %h data = %h",sf.addr, sf.data);
    end
    sf.constraint_mode (1);//Turn ON all constraints
    repeat (4) begin
      sf.randomize( );
      $display("addr = %h data = %h",sf.addr, sf.data);
    end
  end
endmodule

 

仿真结果

Compiler version S-2021.09; Runtime version S-2021.09;  Aug 28 04:32 2022
addr = f data = 5
addr = 3 data = e
addr = 8 data = 6
addr = a data = c
addr = d data = 3
addr = d data = 4
addr = e data = 2
addr = b data = 4
           V C S   S i m u l a t i o n   R e p o r t 

在此示例中,我们在类“sft”中有两个约束,即 data_range1 和 addr_range1。 data_range1 约束将“data”限制为 <= 'h4,而 addr_range1 将“addr”限制为 > 'ha。

在模块 TOP 中,我们关闭了这两个约束。正如仿真日志中看到的那样,“addr”不再符合其约束条件(“addr”不再一定是“>'ha”)。类似地,“data”不再符合其约束条件(“data”不再一定是“<= 'h4”)。然后我们打开所有的约束(sf.constraint_mode (1))。正如在日志的第二部分中看到的那样,“addr”和“data”现在符合它们的约束条件。

 

标签:addr,constraint,约束,mode,data,sf
From: https://www.cnblogs.com/fuqiangblog/p/16633036.html

相关文章