一、没有automatic的fork-join_none

通常小白会这么写:

代码如下:

 foreach(a[i]) begin
fork
repeat(a[i]) #1ns;
$display("a[%0d] = %0d, @%0t",i,a[i],$time);
join_none
end

结果如图:

由图可知,有两个问题:

  • 打印时间全部为0时刻:因为使用的fork-join_none语句,所以延迟语句不会阻塞$display语句的进行,因此在0时刻foreach遍历后直接进行了打印,时间显示为0时刻。
  • 打印结果全部为a[5] = 0:因为在0时刻通过foreach的遍历,同时开辟了五个延迟线程和五个/$display线程,接下来需要确定i的值进行打印;而此时i在在最后一次遍历(i =4 )后由于加1变成了i = 5;因此五个打印线程“寻找”到的i为5,但a[5]并没有赋值,因此默认为0,进行了打印。

二、 有automatic的fork-join_none

先解决打印结果的问题,通过使用automatic语句:

代码如下:

foreach(a[i]) begin
automatic int j=i;
fork
repeat(a[j]) #1ns;
$display("a[%0d] = %0d, @%0t",j,a[j],$time);
join_none
end

结果如图:

由图可知:

  • 打印时间全部为0时刻:原因与1一致,不再赘述
  • 打印结果为正常遍历输出:通过automatic语句,将每次的i赋值为j,这样相当于把i“暂存”起来,因此可以正确的输出。

三、加上begin-end

再来解决打印时间的问题,通过使用begin-end语句:

代码如下:

 foreach(a[i]) begin
automatic int j=i;
fork
begin
repeat(a[j]) #1ns;
$display("a[%0d] = %0d, @%0t",j,a[j],$time);
end
join_none
end

结果如图:

由图可知,打印结果和打印时间全部正常,这是因为用begin-end语句将延时语句和打印语句从并行执行改成串行执行,因此将会在等待延时后再打印。

四、没有automatic的fork-join

代码如下:

 foreach(a[i]) begin
fork
repeat(a[i]) #1ns;
$display("a[%0d] = %0d, @%0t",i,a[i],$time);
join
end

结果如下:

由图可知,虽然没有automatic语句但是打印结果和打印时间全部正常,这是因为fork-join会一直阻塞直到延时语句和打印全部执行。

fork语句遇见for循环语句的更多相关文章

  1. java基础3 循环语句:While 循环语句、do while 循环语句、 for 循环语句 和 break、continue关键字

    一.While循环语句 1.格式 while(条件表达式){ 执行语句: } 2.要点 1,先判断后执行 2,循环次数不定 3,避免死循环 3.举例 题目1:输出0-100之间的所有数 class D ...

  2. 【2017-2-23】C#switch case分支语句,for循环语句

    switch case分支语句 switch(一个变量值) { case 值:要执行的代码段;break; case 值:要执行的代码段;break; … default:代码段;break;(def ...

  3. Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】

    写在前面的: 作为一个控制专业的女研究生,不知道每天在研究什么,但总归逃脱不了码代码的命运.之前也学习过一些C语言.C++,基础嘛,稍稍微有一些.本不想走上码农的道路,天真烂漫的过此生(白日梦过程中. ...

  4. Python基础 之 变量、用户交互、if条件语句、while循环语句、编码、逻辑运算

    一.Python介绍 Python 崇尚优美.清晰.简单 Python是一门动态解释型的强制性定义的语言. 二.编译型和解释型的区别 编译型:一次性将所有与程序编译成二进制文件. 缺点:开发效率低,不 ...

  5. shell脚本、if语句、for循环语句

    shell在shell脚本中,如果用户不输入东西,系统不自动退出,this is a bug!文件测试语句:-d -f -r -w -x -e逻辑测试语句:“&&”与(同时满足) “| ...

  6. Oracle:控制语句 IF..ELSIF语句、CASE语句、FOR循环语句

    --多重if语句(注意点:BEGIN END ,IF 条件 THEN,ELSIF 条件 THEN,ELSE... END IF)BEGIN IF FALSE THEN DBMS_OUTPUT.put_ ...

  7. Bash语句中的循环语句注意事项

    case #!/bin/bash case $1 in 9) echo "nine" ;; 8) echo "eight" ;; 7) echo "s ...

  8. 条件语句,while循环语句:完整的温度转换程序

    while True: a = int(input('摄氏温度换为华氏温度请按 1\n华氏温度转为摄氏温度请按 2\n退出请按 3\n')) if a==1: c = float(input('请输入 ...

  9. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  10. Python学习(6)循环语句

    目录 Python循环语句 - while循环语句 -- 无线循环 -- 循环使用else语句 -- 简单语句组 - for循环语句 -- 通过序列索引迭代 -- 循环使用else语句 - 循环嵌套 ...

随机推荐

  1. Python基础数据类型-Tuple(元组)

    a = () b = (1) # 不是元组类型,是int型 c = (1,) # 只有一个元素的时候,要加逗号才能表示是元组 d = (1, 2, 3, 4, 5, 6, 1) print(type( ...

  2. app内打开外部第三方瞎下载链接

    Q:我用cordova开发项目,想在app内跳转外部链接,安装了cordova-plugin-inappbrowser后确实可以跳转,但是跳转的页面有个按钮,原本点击会下载app,现在点击后毫无反应, ...

  3. 笔记:vue.nextTick()方法的使用详解

    vue.nextTick定义: 在下次DOM更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 简单理解:数据更新了,在dom渲染后立即执行该函数 举例 注意:Vue实 ...

  4. Python 时间日期获取(今天,昨天或者某一段时间)

    日常使用的时间函数: 昨天,或者N天的日期 import time def time_stamp(days): hours = int(days) t = time.strftime("%Y ...

  5. kali 下安装tplmap

    kali 下安装tplmap 1. 安装kali下的python2的pip工具 kali2020版及以上, 输入python2命令会执行python2, python3也存在. 但pip默认是pip3 ...

  6. centos7.6镜像

    centos7.6镜像 https://archive.kernel.org/centos-vault/7.6.1810/isos/x86_64/

  7. CentOS 8.x 编译安装LNMP(Linux + Nginx + MySQL + PHP)架构部署动态网站环境

    LNMP动态网站部署架构是一套由Linux + Nginx + MySQL + PHP组成的动态网站系统解决方案,具有免费.高效.扩展性强且资源消耗低等优良特性,目前正在被广泛使用. 前传: 1.Ce ...

  8. 关于pandas的一些用法

    pandas用法之前我总是把他想的无比复杂.其实也是比较简单的,这个东西在做数据统计的时候还是挺好用的. 然后这里列举几个比较好用的几段代码.偏向数据透视类型pivot的,导出方式是直接在IDE 生成 ...

  9. 【SQL】数据库日志文件过大 4条命令删除日志

    USE DATATABLE GO ALTER DATABASE DATATABLE SET RECOVERY SIMPLE DBCC SHRINKFILE (DATATABLE_Log, 1) ALT ...

  10. 【Unity】Lua热重载

    写在前面 本文讨论的"Lua热重载"是基于他人现成工具和相关博文上展开的,所以这里并不会重复实现一遍工具,主要记录我的理解过程. Lua热重载 探索 偶然在知乎上翻到一篇文章&qu ...