在工作实践中,验证环境往往十分复杂,约束条件根据实际测试场景,也是层出不穷,到处都是。可能会遇到各种各样,奇奇怪怪的问题。 针对systemverilog 中的randomize() 随机约束问题,前面总结了一些规则,这些规则,语法书并不会讲的很透彻,全面覆盖到。只有我们在实际工作中,反复捶打,不断尝试,多想一些可能性,才能防止掉进更多的陷阱。
今天,分享一则苦恼数天的案例,脑细胞死伤无数。我们还是使用之前的程序源代码,我们稍加修改。
我们对原始的print() 稍加修改,使其接收输入参数,a,b,c。输入参数,会影响函数内部 约束条件。具体如下源代码:
`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;
class my_obj1 extends uvm_test;
`uvm_component_utils(my_obj1)
rand int src=4;
constraint src_c {
src inside {[1:9]};
}
function new(string name = "my_obj1" , uvm_component parent = null );
super.new(name, parent);
endfunction // new
extern virtual function print (int a, int b, int c);
virtual task run_phase(uvm_phase phase);
super.run_phase(phase);
endtask
endclass //
function my_obj1::print(int a, int b , int c);
randomize (src) with {(src) inside {[a+b-c:6]};} ; // 新增代码,意图重新约束src变量
`uvm_info(get_type_name(),$psprintf("%0h,%0h,%0h",src),UVM_LOW)
endfunction
module tb();
import uvm_pkg::*;
`include "uvm_macros.svh"
initial begin
run_test("my_obj1");
end
endmodule // tb
假如,我们对输入参数赋值: a = 3, b = 5, c=2。
按照理解:
randomize (src) with {(src) inside {[a+b-c:6]};} ;
等价于
randomize (src) with {(src) inside {[6:6]};} ;
那么实际随机化后的结果,将必定是数值6.
但是发现,实际结果可能是属于 [0+5-2:6] , 也就是{【3:6】}。
经过反复尝试,时钟得到如上结果。
通过添加 VCS 随机约束debug 选项:+ntb_enable_checker_trace=1 +ntb_enable_solver_trace=1 +ntb_enable_checker_trace_on_failure=3 +ntb_enable_solver_trace_on_failure=3
发现; a = 0, b = 5, c=2. 也就是说,a 没有取得相应的数值3. 这里可能求解器哪里出了问题。 我们怎么解决这个问题呢?
我们可以修改如下:
function my_obj1::print(int a, int b , int c);
int temp_a;
int temp_b;
int temp_c;
temp_a = a;
temp_b = b;
temp_c = c;
randomize (src) with {(src) inside {[tem_a+temp_b-temp_c:6]};} ; // 新增代码,意图重新约束src变量
`uvm_info(get_type_name(),$psprintf("%0h,%0h,%0h",src),UVM_LOW)
endfunction
遇到此问题,希望对大家有用。
标签:obj1,src,temp,烧脑,int,18,uvm,randomize From: https://blog.csdn.net/qq_16423857/article/details/143704748