本文总结了在使用Verilog进行硬件描述时,哪些语句是可综合(能被综合工具转换为电路网表)以及哪些是不可综合的,并提供了避免设计中出现不可综合代码的建议。
Verilog是一种用于电子系统设计的硬件描述语言(HDL),其语句可综合性是实现可综合硬件电路的关键因素。本段落将详细介绍哪些Verilog语句是可以被综合工具识别并转换为实际硬件电路的,以及在构建这类模型时应遵循的原则。
所有综合工具都支持的一些基本结构包括always块、assign语句、begin-end块、case语句、wire和reg类型声明、default子句、for循环、函数定义(function)、基础逻辑门操作符(如and, or, nand, nor等)以及模块声明等。
有一些特定的Verilog结构则不被任何综合工具所支持,例如time关键字、defparam指令、$finish语句、fork-join结构块、initial块、延迟操作(比如#10)、用户定义原语(UDP)及wait语句等。
还有一些结构可能只被某些综合工具支持而另一些并不支持。这些包括casez和casex条件分支,wand和triand逻辑运算符,wor与trior的特殊布尔运算符,real类型变量、disable指令、forever循环定义、数组声明以及内存声明(memory declarations)、repeat循环结构、任务(task)定义及while循环等。
在创建可综合模型时需要遵循以下原则:
1. 不使用initial块,除非是在测试平台中。
2. 避免采用以#开头的延迟操作符,因为综合工具会忽略此类语句。
3. 尽量避免在条件表达式中比较X或Z状态值,这可能会被综合器忽略。
4. 使用always块来描述组合逻辑,并确保敏感信号列表完整无缺地列出所有输入信号。
5. 所有的内部寄存器应该能够通过复位端口进行重置,建议使用全局复位接口。
6. 在定义时序逻辑电路时优先采用非阻塞赋值而非阻塞赋值;并且在一个always块内避免同时混合这两种方式的赋值操作。
7. 尽量不要在多个always块中对同一个变量赋值以防止生成锁存器(latches)现象。
8. 避免使用上升沿和下降沿触发混杂在一起的方式定义触发器。
9. 在可能的情况下尽量避免使用数组与内存声明,因为综合工具不一定能够支持这些特性。
10. 信号在使用时应确保只有两种有效状态:逻辑0或逻辑1。
另外,在寄存器传输级(RTL)设计中常用的语法结构包括:
- 模块定义(module...endmodule)
- 参数设置(parameter)
- 端口声明,如input、output和inout
- 信号类型说明,例如wire、reg、tri以及integer等
- 运算符,比如逻辑运算符、算术运算符、关系运算符及位操作符
理解并遵循这些规则对于创建可综合的硬件电路至关重要。例如,在进行综合时,所有的always块都必须明确其敏感信号列表以便工具能够确定何时重新计算块内语句;同时使用非阻塞赋值(<=)而非阻塞赋值(=),有助于避免生成锁存器现象。
值得注意的是,不同的综合工具有着各自的特性与限制,在设计过程中验证这些特定功能是非常重要的。尽管某些简单的initial块可能在一些工具中能够被部分支持或特殊处理,但在编写规范的可综合代码时仍然不建议使用它们。