verilog代码风格及FPGA设计思路

一、电路

有限状态机

状态机状态不能太多,能合并的状态合并,减小电路综合难度。
能不用状态机最好不用,用底层电路实现。
状态机可以不用理解底层电路是什么,用综合工具实现即可。
摩尔型状态机(输出只与状态有关)比米利型状态机(输出与状态和输入有关)运行速度更快,因为不用考虑输入逻辑的延迟。

选择器

最好使用assign代替if-else和case,原因如下:
1、if-else和case不能传递不定态,例如判断条件中出现X时,会将条件等效为0,而导致仿真阶段掩盖致命bug。
使用assign out = a? in1:in2;完成选择器。在这里插入图片描述
2、if-else和case会产生优先级的选择电路而非并行电路,从而不利于时序和面积。改进方法如上图所示。

寄存器

由于代有reset的寄存器面积和时序会差一点,因此在数据通路上可以不使用带reset的寄存器,而只在控制通路上使用带reset的寄存器。

二、测试

testbench

$:
打印 用的不多,比较浪费cpu资源,效率很低;只是关键信号的关键时刻可以打印;通常用于长时间大型仿真中,提取关键状态信号,以确保得知仿真在正常运行。

仿真文件层次越少越好。

仿真速度过慢时,可以酌情选择合适的仿真精度(timescale)。

关于延迟信号赋值,不用拘泥于某一种语法,选自己习惯的即可(重点在于波形符合要求)。
在仿真中,上升沿赋值时,0->z,0->x都算上升沿,z->0,x->0都算作下降沿。

函数任务:
任务结构内不可以出现initial或always过程块。
任务可以使用时间控制,函数不可以。
主要在测试中使用,电路中尽量不用。
task可以用于测试中经常出现的操作。

specify

用于定义电路延迟
在这里插入图片描述

预编译处理

除了`timescale以外,用的不多。

三、设计方法

层次化设计

自顶向下设计,高层次调用,底层次写电路具体功能结构。 初期设计越详细越好,把问题、电路、接口想越清楚越好,最后写代码只是把电路实现而已。
经验足够丰富后,可在设计之前评估资源。

设计流程

综合:将rtl代码对应成相应网表,也就是具体FPGA中资源。可设置不同的策略,如最小资源或最高性能。
实现:布局布线,在FPGA中对不同资源位置分配。 时序约束影响了FPGA中布局位置,位置越近,布线时延越短,可达到的频率越高。
静态时序分析:动态时序仿真占用时间过长,测试向量覆盖率不确定,效率很低。

设计约束和时序分析

课程最后两节,值得多听几次。

作用:

通过约束将对设计的期望传递给eda工具,例如资源、时序、io等因素。
提高设计性能,控制逻辑综合、映射、布局布线,减少逻辑和布线延迟,合理利用逻辑资源,提高设计综合性能。
掌握时序特性,通过eda得到布线后的时序分析报告,判断是否符合设计要求。
指定引脚位置和电器标准。
理解:约束是用来告诉eda一些时序信息,方便eda对电路进行正确综合布线。(调整eda资源分配和布线,以达到要求的时序)

分类

时钟约束:
约束过松会导致电路不符合性能要求;约束过紧导致布线难度过大,占用资源过多。
一般约束的最高频率是实际工作频率的110%左右,时钟周期约束为期望值的90%。
偏移约束:
规定了时钟和数据输入/输出管脚之间的相对时序关系,只用于端口信号,不用于内部信号。
为了确保芯片数据采样可靠和上下级芯片之间的正确交换数据,需要约束外部时钟和数据输入输出引脚之间的时序关系,用于进行电路的时序分析。(其实就是芯片之间的时序约束)
虚假路径约束:
设计中不会影响时序性能的路径,可以从时序约束中排除。
可以减少流程时间,提高时序性能的目的。(不给无关紧要的路径分配优势资源,取而代之分配给时序要求高的路径,以此提高利用率和性能)。
电路优化方法:
在这里插入图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

拉钩上吊一百年

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值