验证结构
随机约束
实验3相比实验2引入了随机约束,主要体现在chnl_trans类中。实验2中的数据内容由generator的get_trans函数产生,而实验3在chnl_trans类产生。
class chnl_trans; rand bit[31:0] data[]; rand int ch_id; rand int pkt_id; rand int data_nidles; rand int pkt_nidles; bit rsp; local static int obj_id = 0; // USER TODO 1.1. // Specify constraint to match the chnl_basic_test request constraint cstr{ data.size inside {[4:8]}; foreach(data[i]) data[i] == 'hC000_0000 + (this.ch_id<<24) + (this.pkt_id<<8) + i; soft ch_id == 0; soft pkt_id == 0; data_nidles inside {[0:2]}; pkt_nidles inside {[1:10]}; };
...
...
更加灵活的控制
2.6
initial begin basic_test = new(); burst_test = new(); fifo_full_test = new(); tests["chnl_basic_test"] = basic_test; tests["chnl_burst_test"] = burst_test; tests["chnl_fifo_full_test"] = fifo_full_test; if($value$plusargs("TESTNAME=%s", name)) begin if(tests.exists(name)) begin tests[name].set_interface(chnl0_if, chnl1_if, chnl2_if); tests[name].run(); end else begin $fatal($sformatf("[ERRTEST], test name %s is invalid, please specify a valid name!", name)); end end else begin $display("NO runtime optiont TEST=[testname] is configured, and run default test chnl_basic_test"); tests["chnl_basic_test"].set_interface(chnl0_if, chnl1_if, chnl2_if); tests["chnl_basic_test"].run(); end end
通过仿真窗口的命令灵活运行test,避免了重复编译。