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

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

3天内不再提示

探讨always和always_ff的编码风格

OpenFPGA 来源:OpenFPGA 2023-02-03 10:24 次阅读

数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。

组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出是两个输入的逻辑与。如果输入值发生变化,输出值将反映这一变化,组合逻辑的RTL模型需要反映这种门级行为,这意味着逻辑块的输出必须始终反映该逻辑块当前输入值的组合。

SystemVerilog有三种在可综合RTL级别表示组合逻辑的方法:连续赋值语句、always程序块和函数。接下来几篇文章将探讨每种编码风格,并推荐最佳实践编码风格。

always和always_ff

通用的always程序可以用来为任何类型的逻辑建模,包括组合逻辑、时序逻辑(触发器)和电平感应的时序逻辑(锁存器)。为了让通用的always程序对触发器行为进行建模,always关键字后面必须紧跟一个敏感度列表,指定时钟信号的posedge或negedge,如:。

b68a7e2c-a30e-11ed-bfe3-dac502259ad0.png

尽管这个例子在功能上是准确的,但是通用的always程序并不要求也不强制执行前面一节中列出的任何综合要求。下一个例子在语法上是合法的,但是不可综合。

b6a33958-a30e-11ed-bfe3-dac502259ad0.png

这个例子可以在仿真中编译和运行,没有任何警告或错误提示,但是综合编译器在试图编译这个例子时,会报告一个错误。它不符合要求,即除了时钟和异步置位或复位的边沿之外,其他信号都不能包含在灵敏度列表中。对RTL仿真的仔细验证会发现,即使在没有发生时钟触发的情况下,触发器的状态也会在每次enable改变值时更新其内部存储。门级的触发器没有这个功能。

always_ff过程也需要一个敏感度列表,指定一个时钟的posedge或negedge,但是always_ff也执行上一节中列出的许多综合要求。SystemVerilog标准要求所有软件工具在以下情况下报告错误。

过程的主体包含#,wait,或者@时间控制延迟时,将阻止过程的执行,直到要求的仿真时间。

在程序中,有一个对任务的调用(因为任务可以包含延迟)。

任何其他存储过程、连续赋值或输入端口的赋值与always_ff存储过程的变量相同。

IEEE标准还建议(但不要求)软件工具检查其他综合限制,如不正确的灵敏度列表。设计工程工具,如综合编译器和lint检查器(检查编码风格)执行这些可选的检查,但大多数仿真器不对always_ff程序执行额外的检查。这些错误和可选的额外检查有助于确保具有时序逻辑的RTL模型既能正确仿真,又能正确综合(仿真和综合后功能相同)。

always_ff过程之后必须有一个符合综合要求的敏感性列表。灵敏度列表不能像always_comb可以推断灵敏度列表那样从程序的主体中推断出来。原因很简单:时钟信号在always_ff过程的主体中没有命名。时钟的名称,以及时钟的哪个边沿触发了存储过程,必须由设计工程师在灵敏度列表中明确指定。

最佳实践指南8-1
使用SystemVerilog always_ff RTL专用存储过程来模拟RTL时序逻辑。请不要使用通用的always过程。

always_ff RTL专用程序强制执行上一篇文章中所要求的综合风格,以正确模拟时序逻辑行为。






审核编辑:刘清

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

    关注

    8

    文章

    747

    浏览量

    41042
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59077
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8162
  • 门级电路
    +关注

    关注

    0

    文章

    15

    浏览量

    1933

原文标题:数字硬件建模SystemVerilog-时序逻辑建模(2)always和always_ff

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是always on buffer?什么情况下需要插always on buffer?

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以让AOB即使在primary power off的情况下保持on的状态;AOB在secondary pg pin off的情况下也是off的。
    的头像 发表于 12-01 15:31 836次阅读
    什么是<b class='flag-5'>always</b> on buffer?什么情况下需要插<b class='flag-5'>always</b> on buffer?

    关于always语句的问题

    1个Verilog HDL语言,有很多个always语句,这些always语句是并行一起执行,还是按照先后顺序执行?
    发表于 06-29 10:01

    Verilog中always @*是什么意思

    Verilog中always @*是什么意思???
    发表于 09-27 16:27

    什么是AO/DI (Always On-line/Dynam

    什么是AO/DI (Always On-line/Dynamic ISDN)  英文缩写: AO/DI (Always On-line/Dynamic ISDN) 中文译名: 永远在线/动态ISDN
    发表于 02-22 10:03 590次阅读

    谈谈Always@_【FPGA助学系列—技巧篇】

    电子专业单片机相关知识学习教材资料——谈谈Always@
    发表于 08-08 17:03 0次下载

    verilog中单/双/三always块状态机写法

      三段式结构中,2个时序always块分别用来描述现态逻辑转移,及输出赋值。组合always块用于描述状态转移的条件。这种结构是寄存器输出,输出无毛刺,而且代码更清晰易读,特别是对于复杂的状态机来说,但是消耗的面积也更多点。这是一种比较流行的状态机结构。
    发表于 09-16 09:04 5次下载

    always block內省略else所代表的電路 (SOC) (Verilog)

    Abstract在Verilog中,always block可以用來代表Flip-Flop, Combination Logic與Latch,本文比較在不寫else下,always block所代表
    的头像 发表于 09-28 11:16 4511次阅读
    <b class='flag-5'>always</b> block內省略else所代表的電路 (SOC) (Verilog)

    initial和always两者的关系分析

    两者的关系 一个程序块可以有多个initial和always过程块。每个initial和always说明语句在仿真的一开始同时立即开始执行;initial语句只执行一次,而always语句则不断重复
    的头像 发表于 11-24 14:48 5142次阅读

    你们知道always,assign和always@(*)之间的区别吗

    1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。2.如果没有
    的头像 发表于 06-27 11:47 1.4w次阅读

    assign组合逻辑和always@(*)组合逻辑的区别

    1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。
    的头像 发表于 03-15 14:08 8625次阅读

    数字硬件建模SystemVerilog篇OpenFPGA介绍

    专用的RTL程序。Always_ffalways_comb和always_latch专用always程序块的行为与通用always程序块相
    发表于 10-11 09:20 1251次阅读

    SystemVerilog中的always语句块

    always”关键字意味着这个语句块“总是”一直执行。大多数时候“always”后面跟一个边沿事件或者延迟。
    的头像 发表于 12-06 09:47 1788次阅读

    always组合逻辑块的讲解和译码器的实现

    always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。
    的头像 发表于 05-22 15:13 1320次阅读
    <b class='flag-5'>always</b>组合逻辑块的讲解和译码器的实现

    SystemVerilog相比于Verilog的优势

    我们再从对可综合代码的支持角度看看SystemVerilog相比于Verilog的优势。针对硬件设计,SystemVerilog引入了三种进程always_ffalways
    的头像 发表于 10-26 10:05 367次阅读
    SystemVerilog相比于Verilog的优势

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always语句用于时序逻辑建模。本文将详细探讨这两种语句
    的头像 发表于 02-22 16:24 493次阅读