高质量verilog设计
可综合语句
- always
- if-else
- case
- assign
if语句

if-else语句映射为多路选择器
不同的if-else结构会导致不同的电路结构,根据约束不同,设计:先加法器后选择器;先选择器后加法器
加法器的面积比选择器大,但是先加法器后选择器的延时小。
单独的if-else语句没有优先级,会逐一检查,多个if语句之间具有优先级,多个选择器之间级联,最后一级具有最高优先级。
若某些设计中,有些信号要求先到达(如关键使能信号、选择信号等),而有些信号需要后到达(如慢速信号、有效时间较长的信号等),此时侧需要使用if…if…结构。
设计方法:最高优先级给最迟到达的关键信号
case语句
case和单if语句类似,但是case语句互斥
case的使用注意点:
- 要在
always块里使用,如果是用always块描述组合逻辑,注意括号里的敏感变量列表都是电平触发,并且赋值时都要用阻塞赋值“=”: always块里的变量必须声明成reg类型,当然声明成reg类型不代表一定会综合成寄存器,只是语法要求always块里要这样;always:块描述组合逻辑时,用*可以代表所有always块内敏感信号;- 分支条件要写全,最好补齐
default缺省条件,不然在组合逻辑中可能会由于条件不全导致出现锁存器Latch;
Latch语句
综合工具很难解释Latch
latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发同步制。latch容易产生毛刺,DFF则不易产生毛刺。latch将静态时序分析变得极为复杂。
Latch容易在不完备的if-else和case中产生
使用完备
if-else语句使用
default覆盖case语句查看综合工具的
warning信息使用
full_case,告诉综合工具case已经完备
使用
parallel_case,告诉综合工具,所有条件互斥且并行,没有优先权
资源重复利用
负载均衡、逻辑复制

资源共享、减小面积
顺序重排、降低延时
赋值语句
关于assign:
- 仅用于信号连接
- 难以阅读,且多层嵌套后很难被综合器解释
可综合风格
always敏感信号表
- 所有的组合逻辑或锁存的
always结构必须有敏感信号列表。这个敏感信号列表必须包含所有的输入信号。 - 综合过程将产生一个取决于除敏感列表中所有其它值的结构,它将可能在行为仿真和门级仿真间产生潜在的失配。
- 在综合过程中,每个
Verilog always敏感信号列表只能对应一个时钟。 - 这是将每一个过程限制在单一寄存器类型的要求。
wait和delay不能用于可综合RTL设计
- 原因:从
RTL级转换到gate级的综合工具一般都不支持Wait声明和#delay声明,为了有效的综合,这些语句应该避免。 - 例外:在不需要行综合的行为模块中,如测试模块
Testbench、表示行为的虚拟器件模块中可以使用。
非阻塞赋值和阻塞赋值
- 在时序电路中必须使用非阻塞赋值
<= - 组合逻辑电路必须使用阻塞赋值
=
异步逻辑和同步逻辑
- 建议分开异步逻辑与同步逻辑
- 避免综合时的问题,简化约束和编码难度。
- 不可应用于非综合模块中(例如:总线模块,总线监视器或是模拟模块)除非他们被设计来综合仿真。
控制逻辑和存储器
- 建议控制逻辑和存储器逻辑分成独立的模块
- 便于高层的存储器模块的使用和便于重新描述为不同的存储器类型
优秀的设计
- 牢记并理解可综合“四大法宝”所对应的硬件结构
- 写前确认电路指标是什么:性能?面积?
- 硬件思维方式,代码不再是一行行的代码而是一块一块的硬件模块
- 对所需实现的硬件电路“胸有成竹”,有足够的数电基础
降低延时
尽可能将延时高的模块放在后面
RTL编码面积
减小设计面积:
- 成本降低、功耗降低
- 特别是对于
FPGA的设计,直接决着FPGA的选型 - 估计设计使用资源的数量,知道设计中哪些部分占用了较大的面积
触发器的数量有功能决定,很难减少,面积则很好估计
组合逻辑—》RTL代码—》各种操作符
必须使用复杂运算符,需要考虑能否使用资源共享。
多比特操作,应该看一看这个信号的所有比特是否都需要参与操作,如果不是则可以只对需要的部分比特进行操作。
addr<=addr+32;—》addr[7:5]<=addr[7:5]+1; addr[4:0]<=addr[4:0]+0;
RTL编码功耗
$$
p_d=∑afCV^2
$$
pd是电路割点功耗总和,a是该点电路翻转次数,f是电路工作频率,C是该点电容,V表示电压值
RTL无法改变负载电容、工作电压,只能考虑尽可能降低电路翻转频率
主要措施:
- 门控时钟
- 增加使能信号,使得部分电路只有在需要工作时才工作;
- 对芯片各个模块进行控制,在需要工作时才工作;
- 除了有用信号和时钟的翻转会消耗功耗组合逻辑产生的毛刺也会大量消耗功耗。
但是,毛刺在设计中无法避免,因此,只有尽量减少毛刺在电路中的传播,才可以减少功耗。
即,在设计中,尽量把产生毛刺的电路放在传播路径的最后。另外,可以使用一些减少毛刺的技术。
RTL编码布线
- 但即使使用最好的布局工具,还是可能出现无法布通的情况。
- 如果可以在
RTL编码阶段考虑代码可能对布线产生的影响就可能避免最后出现无法布通的情况
RTL设计指导原则
指导原则:
- 面积与速度互换
- 乒乓操作
- 流水线设计