代码先锋网 代码片段及技术文章聚合

verilog语言中顺序执行和并行执行的理解

技术标签: verilog  IC  数字集成电路设计


顺序块:


关键字begin - end用于将多条语句组成顺序块。顺序块具有以下特点:

(1)顺序块中的语句是一条接一条按顺序执行的,只有前面的语句执行完成之后才能执行后面的语句(除了带有内嵌延迟控制的非阻塞赋值语句)。

(2)如果语句包括延迟或事件控制,那么延迟总是相对于前面那条语句执行完成的仿真时间的。

在[例5. 9]中进一步给出了两个顺序块语句的例子。顺序块之中语句按顺序执行,[例5.9]的说明1中,在仿真0时刻x、y、z、w的最终值分别为0、1、1、2(十进制)。执行这4个赋值语句有顺序,但不需要执行时间。在说明2中,这4个变量的最终值也是0、1、1、2,但块语句完成时的仿真时刻为35,因为除第一句外,以后每执行一条语句都需要等待。

【例5.9】顺序块

//说明1

reg x,y;
reg [1:0] z,w;

initial
begin
     x=1'b0;
     y=1'b1;
     z={x,y};
     w={y,x};
end

//说明2:带延迟的顺序块

reg x,y;
reg [1:0] z,w;

initial
begin
     x=1'b0;      //在仿真时刻0完成
     #5 y=1'b1;   //在仿真时刻5完成
     #10 z={x,y}; //在仿真时刻15完成
     #20 w={y,x}; //在仿真时刻35完成
end

并行块


并行块由关键字fork-join声明,它的仿真特点是很有趣的。并行块具有以下特性:

(1)并行块内的语句并发执行;

(2)语句执行的顺序是由各自语句内延迟或事件控制决定的;

(3)语句中的延迟或事件控制是相对于块语句开始执行的时刻而言的。

注意:顺序块和并行块之间的根本区别在于:当控制转移到块语句的时刻,并行块中所有的语句同时开始执行,语句之间的先后顺序是无关紧要的。请考虑[例5.9]中带有延迟的顺序块语句,并且将其转换为一个并行块。转换后的Verilog 代码见[例5.10]。 除了所有语句在仿真0时刻开始执行以外,仿真结果是完全相同的。这个并行块执行结束的时间第20个仿真时间单位,而不再是35个。

【例5.10】并行块

//举例1:带延迟的并行块

reg x, y;
reg[1:0] z,w;

initial
     fork
          x = 1'b0;     //在仿真时刻0完成
          #5 y=l'bl;    //在仿真时刻5完成
          #10 z={x,y};  //在仿真时刻10完成
          #20 w={y, x}; //在仿真时刻20完成
join

并行块为我们提供了并行执行语句的机制。不过在使用并行块时需要注意,如果两条语句在同一时刻对同-一个变量产生影响,那么将会引起隐含的竞争,这种情况是需要避免的。下面给出了[例5.9]中说明1的并行块描述。在这段代码中故意引人了竞争。所有的语句在仿真0时刻开始执行,但是实际的执行顺序是未知的。在这个例子中,如果x= 1’b0和y=1’b1两条语句首先执行,那么变量z和w的值为1和2;如果这两条最后执行,那么z和w的值都是2’bxx。因此执行这个块语句后z和w的值不确定,依赖于仿真器的具体实现方法。从仿真的角度来讲,并行块中的所有语句是一起执行的,但是实际上运行仿真程序的CPU在任一时刻只能执行一条语句,而且不同的仿真器按照不同的顺序执行。因此无法正确的处理竞争是目前所使用的仿真器的一个缺陷,这一缺陷并不是并行块所引起的。例如:

//故意引入竞争条件的并行块

reg x,y;
reg [1:0] z,w;

initial
fork
     x = 1'b;
     y = 1'b1;
     z={x,y};
     w={y,x};
join

可以将并行块的关键字fork看成是将-一个执行流分成多个独立的执行流;而关键字join,则是将多个独立的执行流合并为一个执行流。每个独立的执行流之间是并发执行的。

版权声明:本文为weixin_44511423原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44511423/article/details/100049939

智能推荐

Verilog 中的顺序块和并行快

Verilog中的块语句有两种,一种是顺序块,以begin end引导,另一种是并行快,以fork join引导。 1. 顺序块 顺序块已经用的很多了,通常在initial引导的结构中使用,块内的语句顺序执行,每条语句的延迟时间是相对于前一天语句的仿真时间而言的。 例1: 首先a_reg 的值更新为b_reg 的值,然后c_reg的值更新为a_reg的值,因为这两条赋值语句之间没有任何延时,所以c...

c语言中顺序结构的理解

所谓的顺序结构,就是从上至下,从前至后的执行,也就是说,如果执行到下面的代码了,那么上面的代码肯定就已经执行结束了。 例如: 例如: 总结: 程序中定义了一个变量,当变量值不再使用的时候,可以对变量进行重新初始化,这样只用一个变量就可以,既减少了内存空间的使用,程序代码显得也很简洁(比如上述的ret两次都是用来表示函数返回值,且第一次用完后,变量功能已经结束了,此时就可以重新初始化使用)。...

C语言中switch和case之间的语句是否执行?(答案:不执行)

前几天有一个同事询问,switch和case语句中间的代码是否会执行? 本能的认为,不会被执行!! 又想了一下原理,从汇编的角度,无论是switch还是if,最后的汇编代码都是一条条判断语句。 只是在C语言语法上有不同的写法而已,所以我要证明一下我的想法。 一、首先,写一段测试代码: 当然,最后执行结果,没有那行Log的输出,如下: 二、让我们看看汇编代码: 因为switch语句只有4个case,...

verilog testbench中initial块和实例化模块的执行顺序问题

   在编写testbench做简单的模块功能验证时,initial初始化的过程块和模块的实例化是常见的两个块,这两者的执行顺序一般来说认为是并行执行的,但是笔者在实际仿真过程中发现并不是这样的,现举例记录和说明如下。 实例 功能仿真环境 Modelsim SE-64 2020.4 仿真代码    如下所示,待验证模块的功能为一个输入尺寸为384,单个输入数...

猜你喜欢

js语言的执行顺序

加载规则:       先定义:var function (从上往下)      后执行:(从上往下)       ...

JS语言的执行顺序

上面的代码中代码块一中运行报错,但不影响代码块二的执行,这就是代码块间的独立性,而代码块二中能调用到代码一中的变量,则是块间共享性。 >>> JS的执行步骤: step 1. 读入第一个代码块。 step 2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5。 step 3. 对var变量和function定义做“预编译处理”(永远不...

JS语言的执行顺序

上面的代码中代码块一中运行报错,但不影响代码块二的执行,这就是代码块间的独立性,而代码块二中能调用到代码一中的变量,则是块间共享性。...

Go 语言中的延迟执行语句

Go语言中存在一种延迟执行的语句,由defer关键字标识,格式如下: defer后的语句不会被马上执行,在defer所属的函数即将返回时,函数体中的所有defer语句将会按出现的顺序被逆序执行,即函数体中的最后一个defer语句最先被执行。 执行结果如下: 由于defer语句是在当前函数即将返回时被调用,所以defer常常被用来释放资源。...

20-Jenkins-Pipeline-顺序执行和并行

目录 前言 顺序执行 脚本示例 并行执行 脚本示例 前言 本篇学习下stage并行执行 顺序执行 所有的stage,都会内嵌在最外层的stages{…} 一个stage{…}下可以内嵌有且只有一个stages{…} 多层嵌套只支持在最后一个stage{…}里面 脚本示例 并行执行 声明式流水线的阶段可以在他们内部声明多隔嵌套阶段, 它们将并行...