有人可以告诉我RTL和行为性Verilog代码有什么区别吗?在这两个级别的设计之间是否有明确的界限?
有人可以告诉我RTL和行为性Verilog代码有什么区别吗?在这两个级别的设计之间是否有明确的界限?
Answers:
行为代码是较高级别的,通常无法进行综合。诸如循环,延迟和“初始”语句之类的构造都是行为性的。
RTL代码是较低级别的,旨在进行合成。它定义了一个电路,该电路是互连的寄存器以及对这些寄存器之间的信号执行的操作的组合。
取自Yahoo Answers,并立即在Google中发现!
“寄存器传送级别”代码是根据位于它们之间的寄存器和组合逻辑描述的代码,旨在用作综合工具的输入。该代码遵循该语言的可综合子集[1]。没有明确的延迟,所有时序均基于时钟沿。通常避免使用代表电平触发的锁存器的结构。寄存器通常以少量时钟为时钟源,其详细信息可以提供给时序分析器。通常期望组合逻辑[2]稳定在单个时钟周期内,这限制了它的复杂性。它比门级模型高,但它仍然定义了每个寄存器在每个时钟周期上具有什么值。
“行为”代码通常是在更高级别上描述用于仿真的行为的代码,但并非旨在可合成。它可用于描述仿真中设计周围的环境。在取代单个模块的详细RTL设计之前,可以将其用作设计的第一步,以使总体设计正确。
[1]允许的确切子集在综合工具之间有所不同。
[2]如果没有在一个周期内稳定下来,那么模拟和合成可能会得出不同的结果,并且时序分析器将显示违规,除非明确告知不要这样做。
它是相同的语言,但是使用了不同的样式。有了经验,您可以迅速将它们区分开,以下是每种的一些特征:
行为Verilog代码通常看起来更像是在一个initial begin
块中从上到下运行的顺序计算机程序。您可能会发现在顶级行为模块中没有定义输入/输出端口,因为输出可能是输出到模拟器工具的,例如$display()
带有的控制台或文件系统$open
或带有$dumpfile
和的波形转储器$dumpvars
。注意使用较长的仿真时间等待(例如)#4000
和调用任务实现的语句之间的延迟wishbone_master.checked_read(addr, value)
。对于这些更高级别的构造,尚不知道与之等效的综合技术。
用于综合的Verilog始终具有输入/输出端口,因为没有连接的端口,该模块没有副作用,可以消除[1]。延迟可能是通过计算某些特定时钟的周期来实现的。请注意,某些Verilog系统功能(例如,$clog2(PARAMETER)
可能在代码中允许用于综合),因此,$function
两种方式均不能保证的存在。合成代码往往包含许多独立的“过程”,每个过程都有一个敏感度列表。某些技术确实允许initial begin
块用于内存初始化,因此这又不能保证。
最终,设计人员知道了编写代码的目的,并将使用综合工具集或在模拟器中适当地调用它。
[1],但某些IP模块可能会与内部芯片设施进行后门连接,例如JTAG