探讨always和always_ff的编码风格

描述

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

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

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

 

always和always_ff

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

门级电路

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

门级电路

这个例子可以在仿真中编译和运行,没有任何警告或错误提示,但是综合编译器在试图编译这个例子时,会报告一个错误。它不符合要求,即除了时钟和异步置位或复位的边沿之外,其他信号都不能包含在灵敏度列表中。对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专用程序强制执行上一篇文章中所要求的综合风格,以正确模拟时序逻辑行为。






审核编辑:刘清

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分