RTL时序逻辑的综合要求
数字门级电路可分为两大类:组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点,在后面会作为单独的主题处理。
组合逻辑描述了门级电路,其中逻辑块的输出直接反映到该块的输入值的组合,例如,双输入AND门的输出是两个输入的逻辑与。如果输入值发生变化,输出值将反映这一变化,组合逻辑的RTL模型需要反映这种门级行为,这意味着逻辑块的输出必须始终反映该逻辑块当前输入值的组合。
SystemVerilog有三种在可综合RTL级别表示组合逻辑的方法:连续赋值语句、always程序块和函数。接下来几篇文章将探讨每种编码风格,并推荐最佳实践编码风格。
(资料图片仅供参考)
时序逻辑概念
时序逻辑描述了一种重要的门级电路,其中输出反映了一个由门的内部状态存储的值。只有特定的输入变化,如时钟沿,才会导致存储的变化。对于D触发器,时钟输入的特定边沿将改变触发器的存储,但D输入值的变化并不直接改变存储。相反,特定的时钟沿会使触发器的内部存储更新为时钟沿的D输入值。
时序逻辑的RTL模型需要反映这种门级行为,也就是说,逻辑块的输出必须在一个或多个时钟周期内存储一个值,并且只为特定的输入变化而更新存储的值,而不是所有输入变化。在RTL层面,一个always或always_ff过程被用来模拟这种时序行为。本系列文章主要研究:
RTL时序逻辑的综合要求
always_ff 时序逻辑建模
时序逻辑时钟到Q的传播和建立/保持时间
使用非阻塞赋值来模拟时钟到Q的传播效应
同步和异步复位
多个时钟和时钟域交叉(CDC)。
在时序逻辑RTL模型中使用单元延时
建立有限状态机(FSM)模型
对Mealy和Moore FSM架构进行建模
状态解码器,并使用独热码的独特情况
对内存设备进行建模,如RAM
触发器和寄存器的RTL模型
触发器和寄存器被用来在一段时间内存储信息。术语触发器和寄存器经常被当作同义词使用,尽管它们在加载和复位的方式上可能存在差异。触发器是一种存储元件,在时钟沿上改变存储的状态。各种各样的硬件应用都可以由触发器构建,如计数器、数据寄存器、控制寄存器、移位寄存器和状态寄存器。寄存器可以由任何类型的数据存储设备构建,包括触发器、锁存器和RAM。大多数硬件寄存器是由触发器建立的。
时序逻辑触发器和寄存器的RTL模型是用一个带有灵敏度列表的always或always_ff过程建模的,该过程使用时钟边沿来触发过程的评估。一个RTL触发器的例子是:
一般来说,RTL模型被写成在时钟输入的正边沿触发触发器。所有的ASIC和FPGA器件都支持在时钟的上升沿(正边沿)触发的触发器。一些ASIC或FPGA器件还支持在时钟的下降沿触发的触发器。触发器和由触发器组成的寄存器可以是不可复位或可复位的。复位可以是同步的,也可以是与时钟触发不同步的。一些触发器也有一个异步复位输入。
在门级设计中,有几种类型的触发器,例如。SR, D,JK和T触发器。RTL模型可以从这个实现细节中抽象出来,并被写成通用的触发器。
在RTL建模中,重点是设计功能,而不是设计实现。综合编译器的作用是将抽象的RTL功能描述映射到具体的门级实现。大多数ASIC和FPGA器件使用D型触发器,所以本文假设综合编译器从RTL触发器中推断出的触发器类型。
RTL时序逻辑的综合要求
当always程序的敏感度列表包含关键字posedge或negedge时,综合编译器将尝试推断出一个触发器。然而,综合编译器还要求满足以下额外的代码限制,以便推断出一个触发器。
程序灵敏度列表必须指定时钟的哪个边沿触发更新触发器的状态(posedge或negedge)。
灵敏度列表必须指定任何异步设置或复位信号的前缘(posedge或negedge)(同步设置或复位不在灵敏度列表中列出)。
除了时钟、异步设置或异步复位外,灵敏度列表不能包含任何其他信号,如D输入或使能输入。
该过程应该在零仿真时间内执行。综合编译器会忽略#延迟,并且不允许@或等待时间控制。这条规则的一个例外是使用分配单元内的延迟(后续详解)。
在时序逻辑程序中赋值的变量不能被任何其他程序或连续赋值所赋值(允许在同一程序中多次赋值)。
在一个时序逻辑程序中,一个被赋值的变量不能有阻塞和非阻塞的混合赋值。例如,复位分支不能用阻塞赋值建模,而时钟分支则用非阻塞赋值建模。
审核编辑:刘清