Verilog语法之七:顺序块与并行快(begin...end与fork...join)

文章转自微信公众号,花蚂蚁

原文链接:Verilog语法之七:顺序块与并行快(begin...end与fork...join)


块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一条语句。

块语句有两种:

  • 一种是begin_end语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块。

  • 一种是fork_join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。

块语句均用于结构说明语句initial语句和always语句中,如下图所示:

下面进行详细的介绍。

顺序块

顺序块有以下特点:

  • 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。

  • 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。

  • 直到最后一条语句执行完,程序流程控制才跳出该语句块。

顺序块的格式如下:

其中:

  • 块名即该块的名字,一个标识名。其作用后面再详细介绍。

  • 块内声明语句可以是参数声明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句。

下面举例说明。

[例1]

从该例可以看出,第一条赋值语句先执行,areg的值更新为breg的值,然后程序流程控制转到第二条赋值语句,creg的值更新为areg的值。

因为这两条赋值语句之间没有任何延迟时间,creg的值实为breg的值。

当然也可以在顺序块里延迟控制时间来分开两个赋值语句的执行时间,见[例2]。

[例2]

[例3]

这个例子中用顺序块和延迟控制组合来产生一个时序波形。

并行块

并行块有以下四个特点:

  • 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。

  • 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。

  • 延迟时间是用来给赋值语句提供执行时序的。

  • 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。

fork和join语句常用于test bench描述。这是因为可以一起给出矢量及其绝对时间,而不必描述所有先前事件的时间。

并行块的格式如下:

其中:

  • 块名即标识该块的一个名字,相当于一个标识符。

  • 块内说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句、事件(event)说明语句。

下面举例说明:

[例4]

在这个例子中用并行块来替代了前面例子中的顺序块来产生波形,用这两种方法生成的波形是一样的。

块名

在VerilgHDL语言中,可以给每个块取一个名字,只需将名字加在关键词begin或fork后面即可。这样做的原因有以下几点。

  • 这样可以在块内定义局部变量,即只在块内使用的变量。

  • 这样可以允许块被其它语句调用,如被disable语句。

  • 在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量内的值。

基于以上原因,块名就提供了一个在任何仿真时刻确认变量值的方法。

起始时间和结束时间

在并行块和顺序块中都有一个起始时间结束时间的概念。

对于顺序块,起始时间就是第一条语句开始被执行的时间,结束时间就是最后一条语句执行完的时间。

对于并行块,起始时间对于块内所有的语句是相同的,即程序流程控制进入该块的时间,其结束时间是按时间排序在最后的语句执行完的时间。

当一个块嵌入另一个块时,块的起始时间和结束时间是很重要的。至于跟在块后面的语句只有在该块的结束时间到了才能开始执行。也就是说

只有该块完全执行完后,后面的语句才可以执行。

在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。见下例:

[例5]

在这个例子中,各条语句并不是按被执行的先后顺序给出的,但同样可以生成前面例子中的波形。

总结

  • 在顺序块中,语句一条接一条地计算执行。

  • 在并行块中,所有语句在各自的延迟之后立即计算执行。

上面的两个例子在功能上是等价的。fork-join例子里的赋值故意打乱顺序是为了强调顺序是没有关系的。

注意fork-join块是典型的不可综合语句,并且在一些仿真器时效率较差。


对语法知识有了初步的了解之后,下一步就应该“模仿”了。

我给小白们准备了一份礼物,下面是我精心整理的n多verilog代码。帮助小白们由浅至深的“模仿”。在模仿的过程中能够进一步的巩固之前了解的语法知识。

这些Verilog例程基本涵盖了以后可能遇到的所有用法,参考这些代码,可以做出你想要的任何设计。
当你想要用Verilog编写一段代码实现某个功能时,如果你能够想到参考哪段代码能够实现你的设计,那么恭喜你,你已经入门了!!!

所有示例代码,点击链接获取。

01-锁存器、触发器、寄存器、移位寄存器等

【免费】VerilogHDL示例代码之01-锁存器、触发器、寄存器、移位寄存器等资源-优快云文库

02-逻辑门、三态门、mux等

【免费】VerilogHDL示例代码之02-逻辑门、三态门、mux等资源-优快云文库

03-各种计数器

【免费】VerilogHDL示例代码之03-各种计数器资源-优快云文库

04-各类加法器

【免费】VerilogHDL示例代码之04-各类加法器资源-优快云文库

05-乘法器

【免费】VerilogHDL示例代码之05-乘法器资源-优快云文库

06-异步复位同步释放

【免费】VerilogHDL示例代码之06-异步复位同步释放资源-优快云文库

07-分频

【免费】VerilogHDL示例代码之07-分频资源-优快云文库

08-语法语句

【免费】VerilogHDL示例代码之08-语法语句资源-优快云文库

09-串并转换

【免费】VerilogHDL示例代码之09-串并转换资源-优快云文库

10-状态机设计

【免费】VerilogHDL示例代码之10-状态机设计资源-优快云文库

11-编解码应用

【免费】VerilogHDL示例代码之11-编解码应用资源-优快云文库

12-仿真语法举例

【免费】VerilogHDL示例代码之12-仿真语法举例资源-优快云文库

13-进阶设计

【免费】VerilogHDL示例代码之13-进阶设计资源-优快云文库


我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。详情点击                     

小白如何快速入门Verilog?-优快云博客

Verilog语法之〇:Verilog HDL简介/Verilog语法介绍-优快云博客

Verilog语法之一:简单的Verilog HDL模块-优快云博客

Verilog语法之二:常量-优快云博客

Verilog语法之三:变量-优快云博客

Verilog语法之四:运算符_verilog异或运算符-优快云博客

Verilog语法之五:标识符与关键字-优快云博客

Verilog语法之六:阻塞赋值与非阻塞赋值-优快云博客

。。。。。。

更多课程,敬请期待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值