欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
上期答案
[216] 下面的代码会产生多少个并行的线程?
代码语言:javascript复制fork
for (int i=0; i < 10; i ) begin
ABC();
end
join
for循环在fork join内,所以只有一个线程。
[217] 下面的约束有什么错误?
代码语言:javascript复制class packet;
rand bit [15:0] a, b, c;
constraint pkt_c { 0 < a < b < c; }
endclass
约束表达式中,至多只有一个关系运算符(<,<=,==,>=或>)。如果要实现变量的顺序约束,需要多个表达式。
代码语言:javascript复制constraint pkt_c { 0 < a; a < b ; b < c; }
[218] systemverilog中的虚方法和纯虚方法的区别是?
在类中将方法定义为虚方法,则在派生类中可以重写这个方法。基类可以定义具有实现或不实现的虚函数,在派生类中也可以选择覆盖或不覆盖。而纯虚函数只具备函数声明,没有具体实现,在派生类中必须有具体实现。纯虚函数常用在抽象类中使用,下面是一个示例。
代码语言:javascript复制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
[219] 什么是Semaphores?何时使用?
Semaphores是用于控制对公用资源的机制。Semaphores可以视为在创建时具有多个钥匙的存储池,使用Semaphores访问资源时,首先要取得要是,然后才能够继续执行。通过这种机制,可以确保没有要是的进程一直等待到获取钥匙。Semaphores通常用于相互排斥,对公用资源进行访问控制以及简单同步。下面是简单的Semaphores的创建方法。
代码语言:javascript复制semaphore smTx;
smTx = new(1); //create the semaphore with 1 keys.
get()和try_get()分别是阻塞和非阻塞的获取钥匙的方法,put()用于返还钥匙。
[220] 下面两个约束有什么不同?
代码语言:javascript复制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 |
本期题目
[221] 什么是mailbox?如何使用mailbox?
[222] 有限容量和无限容量的mailbox有什么区别?如何创建?
[223] 什么是systemverilog中的event?如何触发event?
[224] 如何合并两个event?
[225] 什么是systemverilog中的std::randomize()方法?何时使用它?
正确答案将在下一期公布,或者到下面的文章获取答案