文章目录
经常看到是否可 Synthesis 的题目,网上对于Verilog 结构是否可 Synthesis 有很多分类标准,但是没有说明具体引用来源,所以学起来总感觉没有底气。
现在以Vivado IDE Synthesis 支持的Verilog 结构来具体学习 Verilog 的可综合性。具体文档是UG901。
1 Verilog 设计
复杂电路的设计通常采用自顶向下的方法。
- 设计过程的每个阶段都需要不同的规范级别(specification level)。例如,在体系结构级别,规范可以对应于框图或算法状态机(ASM)图。
- 一个块 或 ASM阶段 对应于一个寄存器传输块,其中的连接是n位导线,例如:
- 寄存器(Register)
- 加法器(Adder)
- 计数器(Counter)
- 乘法器(Multiplexer)
- 内部连接逻辑(Interconnect logic)
- 有限状态机(Finite State Machine (FSM))
- Verilog允许用计算机语言表达诸如ASM图和电路图之类的符号。
2 Verilog 功能
Verilog提供行为(behavioral)和结构(structural)语言结构。这些结构允许在高抽象级别和低抽象级别上表达设计对象。
- 使用Verilog设计硬件允许使用软件概念,例如:
- 并行处理
- 面向对象的程序设计
- Verilog的语法类似于C和Pascal
- Vivado synthesis 支持 IEEE 1364 Verilog
- 在Vivado synthesis 中支持Verilog,允许以最有效的方式描述全局电路和每个块。
- 对每个block采用最佳 synthesis 流程进行 synthesis
- 本文中的synthesis是将高级行为和结构Verilog HDL语句编译成一个平坦的门级网表( gate-level netlist)。然后,可以使用网表对可编程逻辑设备(如Virtex设备)进行自定义编程。
- 不同的synthesis方法用于:
- 算数运算块
- 内部连接逻辑
- 有限状态机组件
2.1 对 Verilog-2001 的支持
Vivado synthesis 支持 Verilog-2001 的如下功能:
- 生成(Generate)语句
- 组合端口/数据类型声明
- ANSI-style端口列表
- 模块操作符端口列表
- ANSI C风格的任务/函数声明
- 逗号分隔敏感列表
- 组合逻辑的敏感信号
- 使用连续赋值的默认线网类型
- 禁用默认的net声明
- Indexed vector的部分选择
- 多维数组
- net和real数据类型的数组
- 数组 位和部分选择
- Signed reg、net和 port 声明
- Signed-based 整数
- Signed 算术表达式
- 算术移位操作符
- 自动宽度扩展超过32位
- 幂操作符
- 待定位宽参数(N-sized parameter)
- 固定的局部参数
- 增强的条件编译
- 文件和行编译器指令
- 变量的部分选择
reg [3:0] data; reg [3:0] select; // a value from 0 to 7 wire [7:0] byte = data[select +: 8]; - 递归任务和函数
- 常量函数
2.2 结构性Verilog
结构化的Verilog描述集合了几个代码块,并允许在设计中引入层次结构。硬件结构的相关概念及其说明如下表所示。
| 概念 | 说明 |
|---|---|
| Component | 构建或基本块 |
| Port | 组件的 I/O 连接器 |
| Signal | 对应于组件之间的连线 |
内建逻辑门包括 与(AND)、或(OR)、异或(XOR)、与非(NAND)、或非(NOR)、非(NOT)
Verilog的结构特性允许通过实例化预定义的原语,Xilinx提供的源于如BUFG、CLKDLL等
2.3 Verilog 参数
Verilog参数的作用:
- 创建易于重用和扩展的参数化代码。
- 使代码更具可读性、更紧凑、更易于维护。
- 描述这样的功能:
- 总线位宽
- 在模型设计单元中某些重复元素的数量
- 常数。对于参数化模块的每个实例化,可以重写默认操作符值。
- 相当于VHDL泛型。不支持空字符串参数。
2.4 Verilog 参数与属性冲突的情况
Verilog参数和属性冲突可能会出现以下情况:
- 参数和属性可以应用于Verilog代码中的实例和模块。
- 同时属性也可以在约束文件中指定
2.5 Verilog使用限制
Verilog在Vivado synthesis中的使用限制包括:
- 大小写敏感
- Verilog大小写敏感,但是当模块名称只是大小写不同时,Vivado synthesis会出错。
- 阻塞和非阻塞赋值
- 不要混合使用阻塞和非阻塞赋值。虽然 Vivado synthesis 不会报错(注意只是不会报错)但是仿真会出错。
- 错误示范
always @(in1) begin if (in2) out1 = in1; end else out1 <= in2;
- 整数处理
- 在case表达式中,未设置大小的整数可能导致不可预测的结果。
- 连接操作符中的整数处理,vivado会新建32bit临时变量在进行位拼接。
2.6 Verilog元注释
- Translate Off and Translate On
// synthesis translate_on // synthesis translate_off - Parallel Case
// synthesis parallel_case full_case // synthesis parallel_case // synthesis full_case
3 Verilog 结构
下表列出了Vivado synthesis 支持的 Verilog结构:
3.1 常量
| 常量 | 是否支持 |
|---|---|
| Integer | 支持 |
| Real | 支持 |
| String | 不支持 |
3.2 数据类型
| 数据类型 | 是否支持 |
|---|---|
| tri0,tri1,trireg三种线网类型 | 不支持 |
Vivado综合支持的Verilog特性与限制

本文详细介绍了Vivado综合工具对Verilog设计的支持情况,包括Verilog-2001的功能、结构化描述、参数、过程性语句、系统任务与函数、基本单元和保留关键词。强调了在Vivado中哪些特性是可综合的,哪些是不支持的,例如,Vivado支持结构化Verilog、参数化、多维数组,但不支持某些过程性语句和特定的系统任务。此外,还提到了Verilog变量、初始值、数据类型、合法语句和过程性赋值的使用注意事项。
最低0.47元/天 解锁文章
1305





