0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是程序块

汽车电子技术 来源:OpenFPGA 作者:碎碎思 2023-02-09 16:04 次阅读

数字硬件建模SystemVerilog-程序块 (procedural blocks)

pYYBAGPkp3GAdrOZAATgIrhwgI4856.png

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL编程语句。

pYYBAGPkp4CAd-xmAACqN7roJZ8298.png

程序块是编程语句的容器。程序块的主要目的是控制何时应执行编程语句,例如每当时钟上升沿出现时,或每当信号或总线改变值时。SystemVerilog有两种主要类型的程序块: initial 程序块和always 程序块。

initial 程序是一种验证结构;综合编译器不支持。但是有一个例外是,综合编译器支持使用或readmemh系统任务加载内存块或分配给特定内存地址的 initial 程序。FPGA综合器可能还允许使用 initial 程序对设备通电状态进行建模,本文不讨论或使用 initial 程序,因为它们不用于对RTL功能进行建模。

过程是无限循环。它们执行编程语句,完成后自动重新开始。一般的概念是,当电源打开时,硬件在做一些连续的事情。这种连续行为是使用always 程序建模的。

SystemVerilog有四种类型的always 程序:使用关键字always的通用过程和使用关键字always_ff, always_comb 和 always_latch的专用always 过程。

always 程序块可用于多种类型建模,包括可综合RTL模型、抽象行为模型(如不会综合的RAM)以及验证代码(如时钟振荡器或连续响应检查器)。虽然通用always程序的灵活性使其在各种建模和验证项目中都很有用,但同样的灵活性意味着软件工具不知道always的预期用途是什么,什么时候用于可综合的RTL模型。为了将RTL模型准确地转换为ASIC或FPGA设备,综合器对通用always程序设置了许多编码限制。

专用的RTL程序。Always_ff、always_comb和always_latch专用always程序块的行为与通用always程序块相同,但会施加综合所需的特殊编码限制。这些额外的限制有助于确保RTL仿真的行为与实际ASIC或FPGA的门级行为相匹配。正如这些专用程序的名称所表明的,Always_ff对仿真触发器等时序逻辑器件施加了某些综合限制。Always_comb为建模组合逻辑(如解码器)施加了某些综合限制,always_latch为建模锁存行为施加了某些综合限制。后面会详细说明每个过程块功能及验证。

敏感列表

always 程序告诉仿真,应该“always”评估被建模的功能(一个无限循环),但仿真和综合都需要了解更多信息,以便准确地建模硬件行为。这些工具还需要知道何时执行程序块中的语句。对于RTL建模,时间要么在表示时序逻辑的时钟边沿上,要么在表示组合逻辑或锁存逻辑的过程更改值所使用的任何信号上。

为了控制在可综合RTL模型中何时执行编程语句,程序是以敏感列表开始,敏感列表是一个信号列表,值的变化将触发程序的执行。通用always和RTL特定always_ff程序要求RTL设计工程师明确规定灵敏度列表。RTL特定的always_comb和always_latch程序将推断出一个隐式灵敏度列表。

显式指定的敏感度列表与@标记一起引入,口头上称为“at”。在可综合RTL建模中,灵敏度列表包含一个或多个网络或变量名的列表。名称可以用逗号(,)或关键字”or”分隔。

以下两个明确的敏感度列表功能相同:

pYYBAGPkp4yAZfy1AAAxeJOv0Wc393.png

在敏感度列表的上下文中,or关键字只是一个分隔符:它不是or操作。逗号与关键字or的使用取决于用户的偏好。一种风格在功能上并不优于另一种风格。

灵敏度列表还可以指定标量(l位)信号的特定边沿,该边沿将触发always 程序。边沿由关键词posedge和negedge指定,边沿灵敏度对于基于时钟的功能非常重要:

always@(posedgeelkornegedgerstN)…

posedge关键字是“正边沿”的缩写,negedge是“负边沿”的缩写。正边沿是任何可能被硅晶体管感知为正向过渡的过渡。因此,posedge将在0-to-1、0-to-z、0-to-x、z-to-1、x-to-l、z-to-x和x-to-z转换时触发,相反,negedge将在1-to-0、1-to-z、1-to-x、z-to-0、x-to-0、z-to-x和x-to-z转换时触发.

时序逻辑灵敏度。时序逻辑元件,如触发器,在时钟边沿触发,通常是该时钟的上升沿。(一些ASIC和FPGA设备具有在时钟下降沿触发的组件,很少有在时钟两侧触发的组件。)为了指示always 程序代表时钟触发的时序逻辑行为,always或always_ff关键字后跟:

@(posedge或者@(negedge)name>

例如:

always_ff@(posedgeclk)

q<= d; //时序逻辑触发器

一些时序元件具有异步输入,例如set或reset控制。这些异步信号也会影响仿真或综合时评估always程序的运行时间,因此也应该包括在灵敏度列表中。

后面章节更详细地讨论了时序逻辑的建模,包括同步和异步set、enable控制,以及正确使用通用always和专用always_ff程序块的指南。

组合逻辑灵敏度。组合逻辑(如加法器或解码器)的输出反映了该逻辑块当前输入值的组合。因此,每当组合逻辑的任何输入值改变时(即敏感度列表),就需要重新评估组合逻辑中的编程语句。为了仿真这种行为,always关键字后面是一个明确的敏感度列表,其中包括该逻辑块读取的所有信号,其形式为:

@(,,…)name>

例如:

always@(a,b)

sum=a+b;

always_comb专用always程序的一个特点是,它自动推断出一个合适的组合逻辑灵敏度列表。上述加法器代码使用always_comb建模为:

always_comb@(a,b)

sum=a+b;

后面章节将更详细地讨论组合逻辑建模,以及always和always_comb程序块的正确使用指南。

latch逻辑灵敏度。锁存是组合逻辑块的一种形式,可以存储其当前状态,建模锁存行为遵循与建模组合逻辑行为相同的敏感度列表规则。Always_latch关键字后面是一个灵敏度列表,其中包括该逻辑块读取的所有信号,格式为:

@(,,…)name>

如下所示:

poYBAGPkp5qAfp_yAAAsXOMHP1k520.png

Always_latch专用always程序自动推断出正确的组合逻辑灵敏度列表。

poYBAGPkp6WAY0EqAAAk070jTb4620.png

后续章节将更详细地讨论了锁存逻辑的建模,包括使用always和always_latch程序块的最佳实践编码指南。

不可综合的敏感度列表。从语法上讲,灵敏度列表可以包含操作,例如@(a+b)或iff保护条件,posedge和negedge限定符也可以用于大于1位宽的向量,但只使用向量的最低有效位(最右边的位),向量中其他位的更改不会触发敏感度列表,RTL综合编译器通常不支持操作:iff和向量边沿(posedge和negedge)。

begin-end语句组

所有形式的程序块都可以包含一条语句或一组语句。语句组包含在关键字begin和end之间,可以包含任意数量的语句,包括none语句。下面的代码片段显示了一个包含单个语句的always 程序和一个包含begin end组的always 程序。

pYYBAGPkp7aAJEfAAAC-PqgJIfg107.png

一条语句可以嵌套在另一条语句中,如:

poYBAGPkp8GADtpiAACIjxC3aNc451.png

在前面的代码段中,外部语句是always 程序中的单个语句,因此不需要begin-end语句组。

可以使用以下语法命名begin-end语句组:

begin:

命名语句组可以包含局部变量声明,局部变量可以在语句组内使用,但不能在可综合RTL模型的组外引用,(SystemVerilog的更高版本增加了在未命名的begin端组中声明局部变量的功能,但在编写本文时,大多数综合编译器都不支持这种功能。)

也可以选择命名组的匹配端。命名语句组的结尾可以帮助直观地匹配嵌套的语句组。SystemVerilog要求用于开始和结束的名称必须完全匹配。

局部变量的使用有助于确保在某些情况下得到适当的综合结果。在时序always程序中计算并由另一个程序使用的临时中间变量可能在仿真中起作用,但可能综合出与RTL仿真行为不匹配的门级功能,在过程中声明局部变量将防止此编码错误-无法从过程外部访问局部变量,

下面的示例声明了一个临时变量,该变量位于always_ff 过程的局部。临时变量用于计算中间结果,然后用于计算最终结果(本例中的计算特意保持简单,以便专注于局部变量的声明,而不是一些可能需要中间计算的复杂算法

pYYBAGPkp82ANQc0AAB7rygNNsA668.png

请注意,冒号前后允许有空白,如上面的begin后面所示。但是,end后面不能有空白,如上图所示。使用空格有助于使复杂的代码更易于阅读。

在程序块中使用变量和网络

程序赋值的左侧只能是变量类型,包括基于变量的用户自定义类型。在运算符或赋值语句更新之前,变量仍然保持其先前的值,变量的这种特性会影响仿真和综合。

在下面的代码段中,sum必须声明为变量类型,因为它位于过程赋值的左侧。有关RTL建模中可使用的可综合变量类型的讨论,请参见之前的文章。

poYBAGPkp9iAF0blAABuby7azoE347.png

只有程序赋值的左侧必须是变量。赋值的右侧可以使用变量、网络、参数或文字值。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1325

    浏览量

    109297
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36567
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
收藏 人收藏

    评论

    相关推荐

    一文详解PLC子程序与子程序指令

    在编程时经常会遇到相同的程序段需要多次执行的情况,如图6-39所示,程序段A要执行两次,编程时要写两段相同的程序段,这样比较麻烦。解决这个问题的方法是将需要多次执行的程序段从主
    的头像 发表于 12-14 13:33 2414次阅读
    一文详解PLC子<b class='flag-5'>程序</b>与子<b class='flag-5'>程序</b>指令

    【转】浅谈西门子plc程序加密和程序加密及解密

    (保护)选项,选择所需加密方式,设置密码后保存编译重新下载硬件组态就可以了。注意:如何设置密码忘记或丢失,那么只有通过编程软件在线连接PLC,清空PLC程序,(包括程序,系统和数据
    发表于 12-18 22:20

    Siemens S7-1200学习笔记程序相关资料推荐

    Siemens S7-1200 学习笔记 程序自学S7-1200PLC系列一、S7-1200中的程序程序
    发表于 07-01 12:42

    S7-1200中的程序是怎样执行的

    S7-1200中的程序是什么?S7-1200中的程序分为哪几类?S7-1200中的程序是怎
    发表于 08-12 07:57

    在c语言中的程序相关资料分享

    0.0 程序在c语言中{ 多条声明 多条语句} 程序这种复合语句叫程序。接下来我们就开始学
    发表于 12-09 08:17

    欧姆定律演示程序和源程序

    欧姆定律演示程序和源程序
    发表于 04-10 21:05 24次下载

    903双模程序-调试程序

    903双模程序-调试程序 三相无刷BLDC应用程序
    发表于 11-10 10:45 13次下载

    S7-200 PLC(下位机)程序_labview程序案例

    程序案例 S7-200 PLC(下位机)程序
    发表于 01-12 15:44 29次下载

    开关量输出(DO)【集合】Labview程序_程序案例

    程序案例 开关量输出(DO)【集合】Labview程序
    发表于 01-13 16:24 105次下载

    STM32_DMA程序程序

    STM32 DMA程序程序,很好的学习资料,快来下载吧
    发表于 02-15 15:27 27次下载

    8×8×8光立方测试程序程序、原理图

    8×8×8光立方测试程序程序、原理图
    发表于 11-23 11:52 130次下载

    循迹避障小车(寻迹程序+避障程序

    循迹避障小车(寻迹程序+避障程序),感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-23 15:45 449次下载

    通过抽象程序证明复杂具体程序

    描述了证明抽象程序和具体程序满足一致性关系的方法.抽象程序使用抽象数据结构(ADTs),如set,list,map及其上的操作,具体程序使用类C语言中的类型.抽象
    发表于 12-29 16:17 0次下载
    通过抽象<b class='flag-5'>程序</b>证明复杂具体<b class='flag-5'>程序</b>

    什么是程序

    当了几年的程序员了,一直都在想一个问题,什么是程序员,程序员应该做好那些事情,什么样的程序员是有素质的程序员?什么样的
    的头像 发表于 06-04 16:21 8623次阅读

    程序员表白程序

    电子发烧友网站提供《程序员表白程序.rar》资料免费下载
    发表于 11-21 10:41 0次下载
    <b class='flag-5'>程序</b>员表白<b class='flag-5'>程序</b>