SV 线程内部通信

内容

  • 时钟上升沿就是一个事件,event是一个关键字,可以触发事件
  • mailbox - 用于传递信息,将信息给到mailbox进行传递

内部线程通信

  • 事件传递,对于线程进行控制
  • 对于数据和资源进行传递

内部线程通信机制:Verilog event

  • event - 是一个数据类型
  • -> - 触发事件
begin
  $display();
  #10
  ->  // 不会阻塞线程的执行
  $display(); 
end



  • 仿真开始的时候两个initial会同时执行
  • 先执行两个initial语句中的$display(在仿真的0时刻进行执行)

事件中的循环

event可以作为参数

阻塞事件触发和非阻塞事件触发

event e1,e2
initial begin
  @(e1) $display(e1);
end

initial begin
  @(e2) $display(e2);
end

a = 1,b=2,c=3;

initial begin
  #1;
  b <= a;
  c <= b;
  a <= c;
  ->> e1;  // 非阻塞触发e1
  -> e2; // 阻塞赋值触发e2
end
  • 阻塞语句先执行,非阻塞语句后执行








旗语Semaphore





  • 执行的时候,两个agent同时调用task agent,两个线程会对共享资源进行竞争,线程0和线程1会产生交替执行
  • 使用semaphore进制可以实现资源的独占性,可以理解资源放在一个箱子里,线程使用的时候需要拥有自己的要是,一个线程用完之后,另外一个线程才能使用

  • 共享资源在不同的进程中是互斥的
  • 使用new(num)的时候,传入钥匙的数量


  • 如果在执行get函数取钥匙的时候,取不到钥匙或者是钥匙数量不够,都会阻塞进程的执行,直到取到钥匙

mailbox

  • 通过mailbox实现数据在两个进程之间传递
  • mailbox中没有数据的时候,线程也会等待
  • mailbox类似于一个fifo,可以设置一定的深度,mailbox满的时候,不能存储
  • mailbox是一个SV内建的类,提供了一些方法
  • 创建mailbox对象的时候,new()不传入mailbox的深度,默认为没有深度,不会满
  • 通过mailbox可以传递mailbox



  • 通过一个事件传递进行同步

验证平台中的线程和内部通信






posted @ 2024-01-27 23:04  Icer_Newer  阅读(47)  评论(0编辑  收藏  举报