System Verilog中的线程fork...join_none的#0时延

文章讨论了SystemVerilog中fork…join_none语句的行为,特别是如何通过使用自动变量来避免#0时延导致的线程阻塞问题。原始程序中,由于#0导致线程同步,而修改后的程序通过自动变量复制索引值,实现了线程独立执行和预期输出。

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

System Verilog 首先对fork…join_none里的线程进行调度,但是由于#0时延阻塞了当前线程,并且将它重新调度到当前时间片之后启动时延使得当前线程必须等到所有在fork…join_none语句中产生的线程执行完之后才得以运行。

program no_auto;
    initial begin
        for (int j=0; j<3; j++)
            fork
                $write(j);  // 漏洞——得到的是最终的索引值
            join_none
        # 0 $display("\n");
    end
endprogram
"""
输出 3 3 3
"""

在这里插入图片描述

应该在fork…join_none语句中使用自动变量来保存变量的拷贝。带初始化的自动变量声明在for循环的线程里运行。在每次循环中,k的一个拷贝被创建并被赋予当前的j值。**在循环完成后,#0阻塞了当前线程,因此三个线程一起运行,打印出各自拷贝的k值。**当线程运行完毕后,在当前时间片已经没有其他时间残留,SV进入下一个语句$display的执行。

program auto;
    initial begin
        for (int j=0; j<3; j++)
            fork
                automatic int k=j;  // 创建索引的拷贝
                $write(j);  // 打印拷贝值
            join_none
        # 0 $display("\n");
    end
endprogram
"""
输出 0 1 2
"""

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值