以Vivado synthesis支持的Verilog结构来学习 Verilog语句可综合性

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

经常看到是否可 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三种线网类型 不支持
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChipWeaver

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值