【路科V0】systemVerilog基础15——线程控制

news/2024/5/19 17:56:50 标签: 数字验证, systemVerilog

什么是线程

       在SV中,可以认为 线程即独立运行的程序。 线程需要被触发可以结束或者不结束

举例: 

        在硬件module中的initial和always,都可以看做独立的线程,它们会在仿真0时刻开始,而选择结束或者不结束。

硬件模型的线程的特点

        硬件模型中由于都是always语句块,所以可以看成是多个独立运行的线程,而这些线程会一直占用仿真资源因为它们并不会结束

验证环境中线程的特点

         initial语句中例化的各个验证环境、验证对象,以及整个验证平台,可以在仿真过程中动态的创建或者销毁,因此验证环境的资源是动态的利用过程

验证环境中的initial块有两种执行方式:

  • begin. ..end语句(以顺序方式执行)
  • fork. . .join语句(以并发方式执行)

并行方式语句有:

  • fork. . . join(可以开辟多个子线程,即触发多个程序的执行,这些被触发的程序可以被看做fork join语句的子线程)
  • fork.. . join_any
  • ork. . . join_none

线程的概念

        线程的执行轨迹是呈树状结构的,即任何的线程都应该有父线程。

子线程和父线程的关系:

  1.         父线程可以开辟若干个子线程,父线程可以暂停或者终止子线程。
  2.         当子线程终止时,父线程可以继续执行。
  3.         当父线程终止时,其所开辟的所有子线程都应当会终止。

并行线程

Verilog中的创建线程

  • 顺序线程begin. . .end
  • 并行线程fork.. . join(所有并行的线程都结束以后才会继续执行接下来的程序)

SV引入了两种新的创建线程的方法:(并行线程)

  • fork...join_any(等到任何一个线程结束以后就继续执行接下来的程序)
  • fork. .. join_none(不会等待其子线程而继续执行接下来的程序)

fork join语句 

        在进入fork 以后可以触发多个子线程运行, fork join需要等待所有并行的子线程都结束以后才会继续执行。

fork...join_any

        在进入fork 以后可以触发多个子线程运行,fork...join_any等到其中一个最短的子线程结束以后就继续执行接下来的程序

 fork. .. join_none

        在进入fork 以后可以触发多个子线程运行,不会等待其子线程而继续执行接下来的程序。

注意:

          fork.. .join_any和fork.. .join_none语句不需要等待全部子线程执行结束,但是在执行  fork.. .join_any和fork.. .join_none语句的同时,之前已经被触发的子线程,依然会在后台执行,直到它们执行结束。

fork join语句的示例: 

fork
    begin
        $display( "First Block\n”);
        # 20ns;
    end

    begin
        $display ("Second Block\n”);
        @eventA;
    end
join
#fork join开辟了两个begin end子线程,这两个线程分别需要等待20ns和事件A被触发以后,才能分别结束
#从而,fork join语句块才能退出,执行下面的程序
initial begin
    $display ("@%0t: start fork.. .join example",$time);
    #10 $display("@%0t: sequential after #10",$time);
//fork join触发了四个子线程,需要不同的时间点完成打印操作
//最慢的时间为50ns。在fork join语句退出时,已经经历了10ns+50ns=60ns的仿真时间
//程序结束时。经历了60ns+80ns=140ns的仿真时间
    fork
        $display("@%0t: parallel start", $time) ;
        #50 $display("@%0t: parallel after #50",$time);
        #10 $display("@%Ot: parallel after #10", $time) ;
        begin
            #30 $display("@%0t: sequential after #30",$time);
            #10 $display("@%0t: sequential after #10",$time) ;
        end
    join

    $display("@%0t: after join", $time) ;
    #80 $display("@%0t: finish after #80",$time);
end

wait fork或者disable fork

        fork.. .join_any和fork.. .join_none语句结束后继续执行下面的程序,其一些未完成的子线程怎么处理。可以使用

  • wait fork:等待这些子程序全部完成
  • disable fork:停止这些子线程

示例:  

task do_test;
    fork
        exec1) ;
        exec2() ;
    join_any

    fork
        exec3() ;
        exec4();
    join_none

    wait fork; //等待所有子线程结束
   // 在任务退出前,保证四个子线程都完成后,才退出任务。
endtask
task get_first( output int adr ) ;
//fork  join_any分别触发了三个同名的子线程。
//每个子线程完成时间不一样,都会给adr参数赋值。
//任务是只要其中一个线程完成,就可以退出任务
    fork
        wait_device( 1. adr ) ;
        wait_device( 7. adr ) ;
        wait_device( 13, adr ) ;
    join_any
//如果没有 disable fork,任务也可以退出,并且可以获得 wait_device( 1. adr )返回的变量
//后台的两个子线程有可能还在执行,甚至处于阻塞状态。
//这种还在等待的却已经不需要的子线程属于资源浪费
//在退出任务之前,通过 disable fork停止还在后台运行的不需要的子线程,
//保证退出任务时,资源被清理干净。
    disable fork;
endtask

时序控制

SV可以用来实现阻塞的时序控制的方式:

  1. 延迟控制(#)
  2. 事件(event)等待或者完成边沿触发(@)
  3. 电平触发式赋值(wait)

1、延迟控制即通过#来完成。

#10 rega = regb;

2、事件(event)控制,完成边沿触发方式即通过@来完成。

@r rega = regb;
@(posedge clock) rega = regb;

3、wait语句也可以与事件或者表达式结合来完成。

real AOR[];
initial wait(AOR.size() > 0) ....;

http://www.niftyadmin.cn/n/586885.html

相关文章

Hadoop 压缩文件命令

Hadoop 压缩文件命令 hadoop jar /usr/bin/hadoop/software/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.2.4.jar \-Dmapred.reduce.tasks5 \-Dmapred.output.compresstrue \-Dmapred.compress.map.outputtrue \-Dmapred.output.compression.codecorg.apache.hadoop.i…

IIS7.0下URLRewriter的配置

在Vista系统、IIS7.0环境下&#xff0c;原来IIS6.0下正常运行的URL重写组件无效&#xff0c;提示404&#xff0c;文件不存在的错误。 解决方案如下&#xff1a; 把原来放在 <httpModules><addtype"URLRewriter.ModuleRewriter,URLRewriter"name"Modu…

Linux进程1

ps 显示当前终端正在进行的进程 ps x 显示所有进程,不管由什么终端控制 TTY 一栏出现的? 表示没有控制终端 STAT是state的缩写,揭示进场后进程当前状态 状态意义R运行。这意味着,进程正在运行或准备运行。S正在睡眠。 进程没有运行,而是,正在等待一个事件, 比如说,一个按键…

【路科V0】systemVerilog基础16——线程的同步

概述 测试平台中的所有线程都需要同步并交换数据。&#xff08;在测试平台中&#xff0c;不但设计层次的各个硬件模块实例在依靠信号做同步和数据交换&#xff0c;验证环境中的各个组件也需要做同步和数据交换。&#xff09; 一个线程等待另外一个线程结束。验证环境中的同步和…

Java 面试真题

本题适合一到三年 Java 开发 &#xff0c;以下问题都是按照原面试官提问记录 文章目录我要进大厂系列面试题二面我要进大厂系列面试题 全部真题&#xff0c;欢迎投稿你的面试经验。 本篇涉及基础较多&#xff0c;但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法red…

sp_MSforeachtable使用方法[转]

1)说明系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从ms sql 6.5开始。存放在SQL Server的MASTER数据库中。 2)参数说明:command1 nvarchar(2000), --第一条运行的SQL指令replacechar nchar(1) N?, --指定的占位符号command2 nvarchar…

【路科V0】systemVerilog基础17——线程的通信

信箱mailbox 线程通信的三个类型&#xff1a; eventsemaphoremailboxmailbox信箱&#xff0c;顾名思义&#xff0c;可以用来收发信息。 在SV中&#xff0c;mailbox可以用来存放任何数据类型&#xff0c;也可以从信箱中读取这些数据 信箱可以设置尺寸大小&#xff0c;防止存储数…

python 安装 cv2 - 已解决

我的网站已上线 http://javapub.net.cn/ 建议收藏 提供多种操作&#xff0c;一定有一种适合你的 文章目录1. 传统方式12. 第一阶段 终极办法013. 第二阶段 终极办法024. 终极办法3附加情况就这么个情况&#xff0c;就是装不上。本文没一句废话&#xff0c;仔细阅读。 1. 传统…