一、local
在声明类成员变量时:
(1)local
就是本地变量,代码local int DONE
,比如在父类中定义DONE
,那么在子类中就不能调用DONE
;
(2)protected
就是保护变量,在父类中定义protected nt DONE
,这样定义,子类中就可以调用DONE
,但是外部代码
仍然不能操作该变量
除了在声明成员变量时,在使用内嵌约束进行随机化时也会需要使用local关键字:
class trans_rand;
int [31:0] data;
trans t,h;
virtual task write_reg(bit[7:0] addr, bit[31:0] data);
t = new();
void'(t.randomize() with {data == local::data;});
//local::data索引到的是形参data,
//而不带前缀的data按就近原则索引到t中的data
endtask
virtual task send_trans();
h = new();
assert(h.randomize with {local::data >= 0 -> data == local::data;})
//local::data索引到的是trans_rand类中的data,
//而不带前缀的data按就近原则索引到h中的data
endtask
endclass
个人认为local::这个域的声明就是说明这个变量不是被随机化中对象中的成员变量,然后一级一级往上找同名的变量,最先找到谁就是谁。对象t是有data传进来,所以先找到。
二、soft
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;
constraint cstr{
soft data.size inside {[4:32]};
foreach(data[i]) data[i] == 'hC000_0000 + (this.ch_id<<24) + (this.pkt_id<<8) + i;
soft ch_id == 0;
soft pkt_id == 0;
soft data_nidles inside {[0:2]};
soft pkt_nidles inside {[1:10]};
};
endclass
一般与randomize with搭配使用,soft设定起始值,在外部用硬约束。检测是否被硬约束只要看是不是初始值了