Verilog可综合语句实战指南

需积分: 50 84 下载量 140 浏览量 更新于2024-09-13 3 收藏 294KB PDF 举报
"这篇资料汇总了Verilog语言中可综合与不可综合的语句,并给出了建立可综合模型的原则,对于理解和编写能被硬件综合的Verilog代码非常有帮助。" 在Verilog HDL中,可综合语句是那些能够被硬件综合工具转化为实际电路结构的语句。例如,`always`块用于描述时序逻辑,`assign`用于创建静态赋值,`reg`和`wire`定义存储和连接元素,`and`、`nand`等逻辑运算符表示基本逻辑门,以及`module`表示电路模块。这些语句在设计数字逻辑电路时非常常见,且能够被大多数综合工具接受。 然而,有一些语句在综合过程中不被支持,比如`initial`块通常用于仿真初始化,`time`用于时间量的声明,`defparam`用于参数的默认值设定, `$finish`结束仿真,`fork`和`join`处理并发执行,以及`wait`语句。这些语句在硬件实现中没有对应的实体,因此在设计需要综合的Verilog代码时应当避免使用。 还有一些语句,如`casex`、`casez`(考虑X和Z值的case语句)、`wand`、`triand`、`wor`、`trior`(带三态的逻辑操作),以及`real`数据类型,它们在某些综合工具中可能被支持,但不是所有工具都支持。同样,`disable`、`forever`循环、数组、内存(`memories`)、`repeat`循环、`task`任务和`while`循环可能因工具而异。在编写可综合代码时,应谨慎使用这些特性。 建立可综合模型的关键原则包括: 1. 避免使用`initial`块来描述时序行为,因为它们在综合时通常不被处理。 2. 不使用延迟操作,如`#10`,这在综合时可能导致不确定性。 3. 避免使用循环次数不确定的循环,如`forever`和`while`,因为它们可能导致无限循环或难以预测的行为。 4. 不推荐使用用户定义的原语(UDP),因为它们可能不被所有工具支持。 5. 优先采用同步设计方法,以减少 metastability 和时序问题。 6. 尽量使用行为描述而非门级元件描述,以提高抽象级别和可读性。 7. 在`always`块中,列出所有输入信号作为敏感列表,以清晰描述组合逻辑的响应。 8. 内部寄存器应有复位功能,使用全局复位信号可以简化系统设计。 9. 对于时序逻辑,推荐使用非阻塞赋值(`<=`);组合逻辑可以使用阻塞赋值(`=`)或非阻塞赋值,但不要混用。 10. 同一变量不应在多个`always`块中被赋值,且一个赋值对象不应同时用阻塞和非阻塞方式赋值。 11. 如果不希望产生锁存器,确保所有条件分支都对变量进行赋值。 12. 避免在设计中混合使用上升沿和下降沿触发的触发器,以简化时序分析。 13. 在同一`always`块内,避免对同一变量的阻塞和非阻塞赋值,以防止不确定的行为。 遵循这些原则,可以编写出更健壮、更易于综合的Verilog代码,从而确保设计能够成功转化为硬件实现。