欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
fork
for (int i=0; i < 10; i++ ) begin
ABC();
end
join
for循环在fork join内,所以只有一个线程。
class packet;
rand bit [15:0] a, b, c;
constraint pkt_c { 0 < a < b < c; }
endclass
约束表达式中,至多只有一个关系运算符(<,<=,==,>=或>)。如果要实现变量的顺序约束,需要多个表达式。
constraint pkt_c { 0 < a; a < b ; b < c; }
在类中将方法定义为虚方法,则在派生类中可以重写这个方法。基类可以定义具有实现或不实现的虚函数,在派生类中也可以选择覆盖或不覆盖。而纯虚函数只具备函数声明,没有具体实现,在派生类中必须有具体实现。纯虚函数常用在抽象类中使用,下面是一个示例。
virtual class BasePacket; // No implementation
pure virtual function integer send(bit[31:0] data);
endclass
class EtherPacket extends BasePacket;
virtual function integer send(bit[31:0] data);
// body of the function
// that implements the send
….…
endfunction
endclass
Semaphores是用于控制对公用资源的机制。Semaphores可以视为在创建时具有多个钥匙的存储池,使用Semaphores访问资源时,首先要取得要是,然后才能够继续执行。通过这种机制,可以确保没有要是的进程一直等待到获取钥匙。Semaphores通常用于相互排斥,对公用资源进行访问控制以及简单同步。下面是简单的Semaphores的创建方法。
semaphore smTx;
smTx = new(1); //create the semaphore with 1 keys.
get()和try_get()分别是阻塞和非阻塞的获取钥匙的方法,put()用于返还钥匙。
1)
class ABSolveBefore;
rand bit A;
rand bit [1:0] B;
constraint c_ab { (A==0) -> B==0; solve A before B; }
endclass
2)
class ABSolveBefore;
rand bit A;
rand bit [1:0] B;
constraint c_ab { (A==0) -> B==0; solve B before A; }
endclass
两种情况下,A都能取到0和1,B能取到0123,并且A为0时B都为0。但是求解顺序会导致两者的分布会不一致。
如果先求解A再求解B,那么概率分布表为
A | B | 概率 |
---|---|---|
0 | 0 | 0.5 |
0 | 1 | 0 |
0 | 2 | 0 |
0 | 3 | 0 |
1 | 0 | 0.5*0.25 |
1 | 1 | 0.5*0.25 |
1 | 2 | 0.5*0.25 |
1 | 3 | 0.5*0.25 |
如果先求解B再求解A,那么概率分布表为
A | B | 概率 |
---|---|---|
0 | 0 | 0.5*0.25 |
0 | 1 | 0 |
0 | 2 | 0 |
0 | 3 | 0 |
1 | 0 | 0.5*0.25 |
1 | 1 | 0.25 |
1 | 2 | 0.25 |
1 | 3 | 0.25 |
正确答案将在下一期公布,或者到下面的文章获取答案