与 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