目录
什么是逻辑综合
可综合语句
不可综合语句
逻辑综合建模建议
综合流程
什么是逻辑综合
所谓逻辑综合就是在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。
标准单元库(工艺库)可以包含简单的单元,例如与门,或门和或非门等基本逻辑门,也可以包含宏单元,例如加法器,多路选择器和特殊的触发器。
自动化的逻辑综合工具有效减少了高层次设计到门级网表的转化时间。
可综合语句
结构类型 | 关键字或描述 | 注释 |
端口 ports | input,output,inout | |
参数 | parameter | |
模块定义 | module endmodule | |
信号和变量 | wire,reg,tri | 允许使用向量表示 |
实例引用 instantiation | module instance primitive instance gate instance | 例如: mymux m1 (out, i0, i1, s); |
函数和任务 | function,task | 不考虑时序结构 逻辑综合忽略所有 #delay延迟 |
过程 | always,if,then,else,case,casex,casez | 不支持 initial 使用复位机制进行电路信号初始化 |
过程块 | begin end,named block,disable | 命名块的禁止是允许的 |
数据流 | assign | 不考虑延时信息 |
循环 | for,while,forever | while和forever必须包含 @(posedge clk) 或 @(negedge clk) 终止 |
操作符:几乎所有操作符都可综合。
只有 === 和 !== 这种与 x 和 z 相关的操作符不能用于逻辑综合。
避免在代码中与 x 或 z 比较。
操作类型 | 操作符 | 操作 |
算数 | * | 乘 |
/ | 除 | |
+ | 加 | |
- | 减 | |
% | 取模 | |
+ | 单目加 | |
- | 单目减 | |
逻辑 | ! | 逻辑反 |
&& | 逻辑与 | |
|| | 逻辑非 | |
关系 | > | 大于 |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
等价 | == | 相等 |
!= | 不相等 | |
按位逻辑 | ~ | Bitwise NOT |
& | Bitwise AND | |
~& | Bitwise NAND | |
| | Bitwise OR | |
~| | Bitwise NOR | |
^ | Bitwise XOR | |
^~ 或 ~^ | Bitwise XNOR | |
移位 | >> | 右移 |
<< | 左移 | |
>>> | 算数右移 | |
<<< | 算数左移 | |
拼接 | { } | 拼接 |
条件 | ? | 条件 |
不可综合语句
关键字或描述 | 注释 |
initial | 只能在测试文件中使用 |
events | 在测试中使用 |
real | 不可综合 |
time | 不可综合 |
force and release | 不可综合 |
assign and deassign | assign 用于reg不支持 |
fork join | 使用非阻塞赋值同样效果 |
table | UDP and table不可综合 |
逻辑综合建模建议
1.使用有意义的信号和变量名称,增强可读性
2.避免混合使用上升沿和下降沿触发的触发器
3.不要一个always块中混合使用电平和边沿敏感的单元
4.使用圆括号优化逻辑结构
5.再简单组合逻辑中使用连续赋值语句assign
6.对组合逻辑使用阻塞赋值,对时序逻辑使用非阻塞赋值
7.不要混合使用阻塞和非阻塞语句在一个always块里
8.不要对同一个变量多重赋值
9.显式定义if-else或者case语句,可能的条件分支不全,可能产生锁存器。
10.使用基本构造模块比连续赋值语句效率高,使用的门数少,但仿真需要时间长。
综合流程
参考:
1.Verilog Synthesis Tutorial (asic-world.com)
2.《Verilog HDL数字设计与综合》第二版。