Systemverilog(绿皮书)第七章——线程及其通信(三)线程通信

本文详细介绍了Systemverilog中的线程通信,包括事件(event)的使用,强调了triggered()方法的安全性。通过示例展示了如何使用事件进行线程同步,避免delta cycle时间差带来的问题。此外,还探讨了使用mailbox进行线程间通信,以满足数据同步需求,并对比了与FIFO的相似性和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

event e1,e2;
    initial begin
        $display("@%0t: 1:before trigger", $time);
        -> e1;
        @e2;
        $display("@%0t: 1:after trigger", $time);
    end
    initial begin
        $display("@%0t: 2:before trigger", $time);
        ->e2;
        @e1;
        $display("@%0t: 2:after trigger", $time);
    end

event创建了两个对象,不需要new。触发e1时等待e2,触发e2时等待e1。打印结果为:

@0:1:before trigger
@0:2:before trigger
@0:1:after trigger

 e1和e2在同一时刻被触发,但是由于delta  cycle的时间 差是的两个 初始化块可能无法等到e1或者e2。

更加安全的方式使用event的方法triggered()。

event e1,e2;
    initial begin
        $display("@%0t: 1:before trigger", $time);
        -> e1;
        wait (e2.tregger);
        $display("@%0t: 1:after trigger", $time);
    end
    initial begin
        $display("@%0t: 2:before trigger", $time);
        ->e2;
        wait (e1.tregger);
        $display("@%0t: 2:after trigger", $time);
    end

此时的打印结果为:

@0:1:before trigger
@0:2:before trigger
@0:1:after trigger
@0:2:after trigger

使用wait(e1.trigger())电平敏感来代替 边沿敏感的 阻塞语句@e1。留言功能

module road;
initial begin
    sutomatic begin
    byd.drive();
end
endmodule

class car;
    bit   static = 0;
    task  launch();
        start = 1;
        $display("car is launched");
    endtask
    task move();
        wait(start == 1);
        $display("car is moving");
    endtask
task drive();
    fork
        this.launch();
        this.move();
    join
endtask
endclass

输出的结果car is  launched

car is moving,并行 线程变为顺序触发信号。

尽管在ar::drive中同时启动了两个线程,通过共享信号car::start来判断什么时候可以行使。

如果将上述公共变量修改为event,那么通过事件的触发和判断也可以实现一样的需求。

class car;
    event  e_start;
    task  launch();
        -> e_start;
        $display("car is launched");
    endtask
    task move();
        wait(e_start.triggered())
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值