欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
mailbox是一种通信机制,用于线程之间的数据交换。数据在一个线程存入mailbox中,在另一个线程中检索。下面是mailbox的声明与创建的示例:
mailbox mbxRcv;
mbxRcv = new();
将数据存入mailbox中可以使用put(阻塞)和peek(非阻塞)实现,从mailbox中取出数据可以使用get(阻塞)和try_get(非阻塞)方法,查询mailbox中的数据数量可以使用num()方法。
有限容量的mailbox是指邮箱在创建时就指定容量。
mailbox mbxRcv;
mbxRcv = new(10); //size bounded to 10
无限容量的mailbox是指邮箱再创建时不指定容量。
mailbox mbxRcv;
mbxRcv = new(); //size is unbounded or infinite
有限容量的mailbox如果存满,线程将无法继续存入数据,只到mailbox有空间。
event类型的变量不用于存储数据,用于线程同步。可以使用"->"显式触发事件,而线程可以通过"@"来等待事件的触发,阻断线程只到事件被触发。event为两个或者多个同时运行的进程的同步提供强大而有效的手段。
下面的示例中,两个线程通过event进行同步。一旦发送请求,send_req()将会触发一个事件,而receive_response()检测到事件被触发以后就会继续执行任务。
module test;
event req_send;
initial begin
fork
send_req();
receive_response);
join
end
task send_req(); //create and send a req
-> req_send; //trigger event
endtask
task receive_response();
@req_send; //wait until a send event is triggered
//collect response
endtask
endmodule
可以指将将一个event变量赋值给另一个event变量,此时两个event变量都指向同一个同步对象,可以认为两者合并。
std::randomize()是作用域随机化函数,无需定义类或者实例化类对象仅能对当前作用域中的数据进行随机化。如果某些需要随机化的变量不是类的成员,则需要使用std::randomize()。下面是一个示例。
module stim;
bit [15:0] addr;
bit [31:0] data;
function bit gen_stim();
bit success, rd_wr;
success = std::randomize(addr, data, rd_wr);
return rd_wr ;
endfunction
…
endmodule
std::randomize()和类的randomize()具有相似的功能,也可以使用约束,下面是一个通过with添加约束的示例。
success = std::randomize( addr, data, rd_wr ) with {rd_wr -> addr > 'hFF00;};
function int count_ones ( ref bit [9:0] vec );
for( count_ones = 0; vec != 0; vec = vec >> 1 )
begin
count_ones += vec & 1'b1;
end
endfunction
constraint C1 { length == count_ones( myvec ) ; }
class Base;
virtual function printA();
endfunction
endclass
1)
class Derived extends Base;
function printA();
//new print implementation
endfunction
endclass
2)
class Derived extends Base;
virtual function printA();
//new print implementation
endfunction
endclass
class Packet;
bit [31:0] addr;
endclass
class ErrPacket extends Packet;
bit err;
endclass
module Test;
initial begin
Packet p;
ErrPacket ep;
ep = new();
p = ep;
$display("packet addr=%h err=%b", p.addr, p.err);
end
endmodule
class Packet; //Base Class
rand bit [31:0] src, dst, data[8]; // Variables
bit [31:0] crc;
virtual function void compute_crc;
crc = src ^ dst ^ data.xor;
endfunction
endclass : Packet
class BadPacket extends Packet; //Derived class
rand bit bad_crc;
virtual function void compute_crc; //overriding definition
super.compute_crc(); // Compute good CRC
if (bad_crc) crc = ~crc; // Corrupt the CRC bits
endfunction
endclass : BadPacket
正确答案将在下一期公布,或者到下面的文章获取答案