当前位置: 首页>前端>正文

rttests的代码 rtl代码设计

一般性的指导原则

总的来说,RTL级的评判标准有许多,从时序、面积到功耗等等,都是非常重要的指标。但是这里只介绍一般性的指导原则。
1.面积和速度的平衡互换原则,这两者的目标是对立统一的关系,相互制衡。
2.硬件原则:理解HDL语言的本质,注意与软件设计区分。
3.系统原则:从整体上、全局上优化和把握设计从而提高设计质量,优化设计效果。
4.同步设计原则:要求设计的时序稳定,这也是高速RTL设计的通用标准。

面积与速度的平衡互换原则

面积指的是一个设计所消耗的资源量。
速度指的是设计再芯片稳定运行上达到的最高频率。
通常,在两者之间需要去分析哪一个为主要矛盾,从缓解主要矛盾入手解决问题。如果时序余量较大,则”用时间换面积“,如果面积余量较大,则”用面积换时间“。通常而言更小的面积意味着更少的器件,更大的时序余量意味着更高的频率,都能增强系统的鲁棒性。如果二者发生冲突,则采用速度优先的原则。
书上的示例较长,这里就省略不写了。
合理地使用速度和面积的转换,可以在满足前提条件的情况下,进一步优化设计。

硬件原则

首先要注意,无论看上去多么相像,硬件描述语言同软件语言是有着本质区别的!
评价一段HDL代码的优劣是看他实现的电路的性能(面积和速度)两个方面的,而不是看代码是否简短。需要对电路本身所代表的硬件有一个较好的理解,然后再用描述语言把它表达出来。
HDL语言同C语言的最显著区别在于HDL语言存在”互联“、”并发“、”时间“三个概念。
1.互联:硬件语言中的线网类型描述的是器件之间的连接。
2.并发:高级语言天生是串行的,而硬件语言则天然是并行执行的。
3.时间:高级程序执行的时间依赖于其处理器性能,而硬件语言中通过描述的时间在仿真时模拟信号的时间关系。

进一步讨论for循环的使用
在行为级描述测试激励时,通常使用for循环来描述测试激励,描述简单,代码清晰,而且仿真时回单独为for循环开辟内存,加速仿真。
在RTL级描述时,则不建议使用for循环,在综合时,for循环的内容只是被一个个展开分别实现罢了,很容易造成资源浪费。

系统原则

系统原则包含两层含义:其一,目标器件本身可以看成一个系统,如何设计系统,分割功能模块,这很重要,其二,模块化设计方法。合理划分模块,单独优化各个模块的效率,最后再融合到顶层中去。

同步设计原则和多时钟处理

同步设计原则

同步设计原则是PLD和ASIC最重要的设计原则。

同步时序设计与异步时序设计

首先比较一下同步时序电路和异步时序电路:
1.异步电路:
核心是由组合逻辑构成的,同时钟没有关系,不依赖于触发器驱动。容易产生毛刺,不利于电路的移植,不利于静态时序分析和验证设计时序功能。
2.同步电路
核心是通过各种各样的触发器来实现。主要信号和输出信号都是由时钟沿驱动触发器完成的。因此,可以避免毛刺,同时有利于移植和时序分析。

同步时序设计

基本原则:要求使用时钟边沿驱动所有的操作。
对于所有的寄存器,都必须要满足setup和hold的时间指标。
setup:在有效时钟沿到达前,信号必须已经建立setup时间。
Hold :在有效时钟沿到来之后,信号必须还要保持hold时间。
同步时序的延时:对于比较大的延时,通过一个计数器来模拟,对于比较小的延时,过一个触发器打一拍然后就完成了时序同步。对于”#5 state <= next_state“这样的行为级描述是用于仿真测试激励的,在综合时是不可能对电路本身产生影响的。

亚稳态

如果触发器是setup和hold时间不满足,就可能产生亚稳态。此时触发器的输出就是不确定的,同输入没有关系。
亚稳态最主要的危害在于破坏系统的稳定性,可能使得后续电路产生误判,甚至把亚稳态传播下去。
只要有异步元件,亚稳态就不可避免,设计时首先要减少亚稳态带来的错误,其次应该让电路对亚稳态不那么敏感。前者可以通过同步设计实现,后者通过使用两级以上的寄存器实现。
注意,多级寄存器也不一定能完全避免错误,但是对于有些情况如声音图像的传播,对错误并非那么敏感则无伤大雅,如果有精确需求则应该配合校验码,实现查错纠错。

异步时钟域数据同步

异步时钟域的数据同步问题主要分为两类:同频异相,异频问题。

不推荐的处理方法

1.通过buffer等组合逻辑来调整采样时间:首先组合逻辑就容易产生毛刺,其次很容易受到环境因素的影响。
2.同时使用时钟上下沿来调整采样时间:
首先如果是倍频可以直接通过倍频时钟来实现。同时使用双沿可能回带来占空比、相位差等一系列指标的问题。
其次一般对于某一个时钟,都只能保证一个时钟沿的指标比较好,对于另一个沿则难以保证质量。
第三,即使特殊情况要使用时钟双沿,一般也不会在一个周期内同时使用双沿,对于DDR(Double rate sych Dynamic RAM)等特殊电路通常对时钟双沿都有明确的要求,同普通类型的设计是截然不同的。

异步时钟数据同步常用方法

1.同频异相问题:
其一就是在信号后面加寄存器,但是如果出现亚稳态仍然不能保证就一定输出正确。其二,采用DPRAM和FIFO把数据根据上级时钟控制写入,通过下级时钟控制输出,完成相位的调整。
2.异频问题:
其实解决方法和上面的第二点是一致的,但是,在异频问题中,需要注意,因为频率不同,所以上下级的吞吐率是不一样的,所以必须设置合理的缓冲池来完成缓冲,防止信息丢失。这其实也非常类似操作系统里的缓冲池。

代码风格

注意,有的代码风格是不依赖于设计目标、EDA工具等等外界因素的准则,但是有的代码风格则是同这些相关。例如前面我们反复提到组合逻辑会产生毛刺,但是在ASIC设计中有时就会有意识的采用组合逻辑的设计。因此还是要随机应变。

结构层次设计与模块划分

结构层次化编码

结构层次化是设计的一种基本思想,不仅仅在硬件,甚至软件以及其他的许多行业的设计中也广泛应用了这一思想。
需要注意:
1.结构不宜太深,否则综合时面积过大,综合工具会默认做扁平化处理
2.顶层设置不宜过于复杂,主要完成诸如输入输出,模块调用与实例化,全局时钟,三态总线,全局复位等等简单的功能。
3.双向的信号最好只在顶层出现。
4.子模块之间最好不要有跨层次的接口。
5.合理考虑子模块的功能、结构、时序等。

模块划分的技巧

1.对每个同步时序设计的子模块的输出使用寄存器处理
2.将相关的逻辑或者可以复用的逻辑写在一起
3.将不同优化目标的部分分开,时序的和面积的分开处理。
4.将时序宽松的分到同一个模块
5.将存储器件独立划分
6.合理规划模块的规模

组合逻辑设计的主要事项

always信号敏感表的注意事项

1.敏感表必须包含所有的输入和判断信号模块;
2.不可能通过改变敏感表的内容来改变逻辑(在综合时没有写入的相关变量综合工具会自动加上),设计时应该注意逻辑的问题而非通过修改敏感表实现逻辑的变换。

组合逻辑环路

组合逻辑环路是设计的大忌
在物理实现中,完成组合逻辑环路往往依靠器件本身的延时性能保证的,但是事实上这些性能会受到PVT(工艺,电压,温度)极大的影响,往往是难以保证的。
在存在反馈的环路上必须加上寄存器。

脉冲产生器

简单的脉冲产生器往往依靠一系列的反向器和原信号相与产生,利用的是反相器本身器件的延时特性,是没有办法保证较为准确的脉冲持续时间的,应该用寄存器来实现。

锁存器

锁存器同前面提到的环路一样是很容易出错的电路。
避免锁存器,就应该在组合逻辑中的if...else...一定要加else,case语句一定要加default,这样才能比较好地避免锁存器的出现。

时钟设计的注意事项

对于一些PLD如FPGA等,通常是内嵌有时钟的,这里主要是做一些比较。

组合逻辑产生的时钟

首先为了避免组合逻辑产生的毛刺,依然需要在组合逻辑输出加上寄存器。
其次,组合逻辑产生的时钟质量比较低,skew和Jitter都比较大。

Ripple Counter

行波计数器,实际上就是把每一级寄存器的输出加到下一级寄存器的时钟端。但是这是一个异步时序电路,会产生很多奇怪的问题。

时钟选择

通常在通信系统中会产生不同数据速率的要求,因而要使用专门的CLOCK MUX进行切换,这些MUX通常新能都非常不错,切换时的冲击也很小。

门控时钟

门控时钟通常使用一个异步信号与时钟信号相与然后接到寄存器的时钟端,其优点在于能控制功耗,缺点在于通过了一个门会降低时钟信号的质量。

时钟同步使能端

大多数寄存器单元都包含这样的使能端,但是需要注意,这里的使能端不能减少功耗,实际上是屏蔽了输出,寄存器内部仍然在运作,因此仍然会产生功耗。

RTL代码优化技巧

使用pipeline技术优化时序

即使用流水线的方法,虽然对于每一个操作本身并没有缩短时间,但是增大了总体的吞吐率,同时保证了时序。一定程度上增大了频率。

模块复用与resource sharing

以一个补码平方器为例:

module resource sharing(
	input[7:0] data_in,
	output[15:0] square);
	wire[7:0] data_bar;
	assign data_bar = ~data_in + 1;
	assign square = (data_in[7])? data_bar*data_bar : data_in*data_in;
//以下是方案二
	wire[7:0] temp_data;
	assign temp_data = (data_in[7])? ~data_in+1 : data_in;
	assign square = temp_data * temp_data;
endmodule

显然,方案二比方案一节省了一个多路选择器和一个乘法器,大大优化了电路的面积性能。
需要注意,有时综合工具可以帮助我们优化,但是不要过于依赖工具,还是应该提高自己的代码能力。

逻辑复制

逻辑复制旨在为例改善时序而增加面积。
最常用于调整扇出,因为扇出若很大必须加多级寄存器以增加其驱动能力,这样会耽误时序,所以可以进行逻辑复制,减少单个扇出,从而改善时序。
简而言之就是用面积换时间。

香农扩展运算

香农扩展运算其实对应于这个公式:F(a, b, c) = aF(1, b, c) + ~aF(0, b, c)
实际上,香农扩展运算也是通过把一个输入变为MUX的控制信号从而改善时序的。
这也是以空间换时间,是否使用需要综合实际情况进行考虑。


https://www.xamrdz.com/web/2fd1944688.html

相关文章: