Verilog 版本:Verilog-95、Verilog-2001与System Verilog区别简谈

发展历史

1984年,Verilog开始作为一种专用的硬件建模语言使用,取得了相当大的成功。1990年,Cadence Design Systems公司将该语言面向公众开放,作为试图与VHDL相抗衡的竞争手段的一部分。1995年,Verilog成为IEEE标准1364-1995,也就是所谓的Verilog-95。

Verilog-95以后不断演变,2001年成为IEEE的另一个标准1364-2001,即所谓的Verilog-2001。与过去的标准相比,它包含了很多扩展,克服了原来标准的缺点,并引入了一些新的语言特征。2005年,IEEE发布了1364-2005标准,称为Verilog 2005。它修改了一些规范,并具有一些新的语言特征。

IEEE发布了一些System Verilog的标准。最新的标准是1800-2009,是在2009年发布的。System Verilog是Verilog的一个超集,旨在更好地支持设计验证功能,提高仿真性能,使语言变得更加强大、更易于使用。

Verilog-2001是大多数FPGA设计者主要使用的Verilog版本,得到了所有的综合和仿真工具支持。

Verilog-2001

Xilinx 的 XST 和其他 FPGA 综合工具都有一个选项, 可启用或禁用 Verilog-2001 标准。XST 使用-Verilog2001 命令行选项, 而 Synplify 使用“ set_option-vlog_std v2001 ” 命令。

下面简要概括了 Verilog-95 和 Verilog-2001 之间最主要的区别。公众号:OpenFPGA

Verilog-2001 增加了对带符号数补码算术运算的支持。而在 Verilog-95 中, 开发者需要使用按位操作进行带符号数的运算。Verilog-2001 中的相同功能可以使用内置操作符和关键字进行描述。

在自动扩展'bz 和’bx 赋值方面, Verilog-95 中的代码:

wire [63:0] mydata = ‘bz;

将为 mydata [31:0]分配数值 z,并为 mydata [63:32]分配数值 0。

而Verilog-2001将'bz和'bx赋值扩展到变量的全部宽度。

generate结构通过使用if/else/case语句,允许Verilog-2001控制实例和语句例化。通过使用generate结构,设计者可以很容易例化具有正确连接的一组实例。以下是使用generate结构的几个例子。公众号:OpenFPGA

/ / 一组实例
module adder array(input [63:0] a,b, output [63:0] sum);
generate
genvar ix;
  for (ix=0; ix<=7; ix=ix+l) begin : adder_array
    adder add (a[8*ix+7 -:8],
      b[8*ix+7 -:8],
      sum[8*ix+7 - :8]);
  end
endgenerate
endmodule // adder




//array
module adder(input [7:0] a,b, output [7:0] sum );
  assign sum = a + b;
endmodule // adder
// if.......else 语句
module adder_array(input [63:0] a,b, output [63:0] sum);




parameter WIDTH = 4;




generate
if (WIDTH < 64) begin : adder_gen2
  assign sum[63 -: (64-WIDTH)] ='b0;
  adder # (WIDTH) adder1(a[WIDTH-1 -:WIDTH],
    b[WIDTH-1 -:WIDTH],sum[WIDTH-1 -: WIDTH]);
end
else begin:adder_default
  adder # (64) adder1(a, b, sum);
end
endgenerate
endmodule // adder_array




// case statement
module adder_array(input [63:0] a,b, output [63:0] sum);
generate
case (WIDTH)
  1: begin : ease1
    assign sum[63 -: 63] = 'b0;
    adder #(WIDTH) adder1(a[0], b[0], sum[0]);
  end
  default: begin : def
    adder # (64) adder1(a, b, sum);
  end
endcase
endgenerate
endmodule // adder_array

Verilog-2001增加了对多维数组的支持。综合工具对多维数组的综合设置了一些限制。例如,XST支持的数组维数最多为2,不允许一次选择多个数组元素。不能将多维数组传递给任务或函数。

下面举例说明如何描述一个256x16线网型元素的数组,宽度为4位。

wire [3:0] multi_dim_array [0:255][0:15];

更简洁的端口说明如下所示。

/ / Verilog-95
module adder(a,b,sum);
  input [7:0] a,b;
  output [7:0] sum;
assign sum = a + b;
endmodule // adder




// Verilog-2001
module adder(input [7:0] a,b, output [7:0] sum );
  assign sum = a + b;
endmodule // adder

Verilog-2001增加了对指数或幂运算符“**”的支持。在许多应用中,例如用于计算存储器的深度,这是非常方便的。综合工具支持指数时有一些限制。XST要求两个操作数都是常数,并且第二个数为非负数。数值x和z是不允许使用的。如果第一个操作数是2,则第二个数是可变的。公众号:OpenFPGA

下面举例说明如何使用指数。
localparam BASE = 3,
  EXP = 4;
assign exp_out2 = BASE**EXP;




/ / 该代码综合为移位寄存器
assign exp_out1 = 2**exp_in;




使用逗号分隔敏感信号列表。
// Verilog-95
always @(a or b);
  sum = a + b;




/ / Verilog-2001
always @(a,b);
  sum=a + b;
always @(*);
  sum=a + b;

要求的线网型信号说明

Verilog-95 要求所有不是端口且被连续赋值驱动的 1 位线网型信号必须要说明。这一要求在 Verilog-2001 中已被删除。取而代之的是, Verilog-2001 标准中增加了一个新的'default_nettype 编译器指令。如果该指令被赋值为“none",则必须声明所有1位线网型信号。公众号:OpenFPGA

/ / Verilog-95
wire sum;
assign sum = a+b;




// Verilog-2001
wire sum; / / 不 需 要
assign sum = a + b;




'default_nettype none
wire sum; // 必须的
assign sum = a + b;

System Verilog

System Verilog标准被设计为一个统一的硬件设计、规范和验证语言。这是一个大型标准,由几个部分组成,包括设计规范方法、嵌入式说明语言、函数覆盖、面向对象编程及约束。System Verilog的主要目标是建立统一的设计和验证环境,兼具Verilog\VHDL和硬件验证语言的最好功能及编译优势。System Verilog将多样化的工具和方法进行合并,消除了软件和硬件工程师在系统设计上的隔阂,以便共享成果。

System Verilog中包含几个现有Verilog规范的扩展,用于减少代码行数,鼓励设计复用,并提高仿真性能。同时,它还完全兼容以前的Verilog的各种版本。

System Verilog得到多数商业模拟器的支持,包括ModelSim、VCS、NCSim等。System Verilog标准的可综合部分能被Synplify和Precision综合工具支持。

设计综合及验证环境经常要使用System Verilog和Verilog语言编写。用于大型设计的一种方法如图1所示。

顶层模块既在Verilog中实现,又在SystemVerilog中实现。这使得它与所有不支持System Verilog的FPGA综合工具相兼容。该设计可以很容易地与System Verilog编写的验证库集成在一起。

以下简要概述System Verilog的一些独特功能。公众号:OpenFPGA

数据类型

System Verilog 定义了以下一些新的数据类型(见表1)

表1 System Verilog的数据类型

数据类型

描述

int

32 位带符号整数, 2 个状态

shortint

16 位带符号整数, 2 个状态

longint

64 位带符号整数, 2 个状态

bit

用户自定义矢量位宽, 2 个状态

byte

8 位带符号整数, 2 个状态

logic

用户自定义矢量位宽, 2 个状态

2个状态的数据类型接受数值0和1。

4个状态的数据类型接受数值0、1、z和x。

System Verilog提供了创建信号和变量的自定义分组,这类似于C语言。自定义分组定义了以下功能:类型定义、枚举类型、结构、合并和静态强制类型转换casting)。

下面的例子中使用了几个System Verilog的数据类型。

bit x;
enum {STATE1, STATE2, STATE3} state;
typedef  enum{ red=0,green,yellow } Colors;
integer a,b;
  a=green*3 // 3赋值给a
  b = yellow+green;
struct {
  bit [31:0] characteristic;
  bit [31:0] mantissa;
  } float_num;
float_num.characteristic = 32'h1234_5678;
float num.mantissa = 32'h0000_0010;
typedef union{
  int u1;
  shortint u2;
} my_union;

System Verilog 提供了强类型功能,以避免困扰 Verilog 设计的多种解译和条件竞争。

端口连接

SystemVerilog提供了“.name”和隐含的“.*”方法来描述端口连接,这大大压缩了代码长度。公众号:OpenFPGA

/ / Verilog
adder_add (a,b,sum);
// SystemVerilog
adder_add (.a,.b,.sum);
adder_add (. *);

interface 和 modport

System Verilog中的interface(接口)和modport(模块端口)说明模块实例之间的端口列表和互连。下面给出一个简单的例子。

/ / 定 义 接 口
interface adder_if;
  logic [7:0] a, b;
  logic [7:0] sum;
endinterface: adder_if




module top;
/ / 例 化 接 口
  adder_if adder_if1();
  adder_if adder_if2();
/ / 将 接 口连接到模块实例
  adder add1(adder_if1);
  adder add2 (adder_if2);
endmodule
module adder(adder_if if);
/ / 访 问 接 口
  assign if.sum = if.a + if.b;
endmodule / / adder

面向对象编程(OOP)

System Verilog可以更好地支持面向对象编程(OOP)。OOP通过建立带自包含功能的数据结构而提高了抽象层次,这种数据结构允许数据封装(encapsulation)隐藏实现细节和增强代码的复用。

表2 给出了System Verilog中支持OOP的结构。

表2 System Verilog 中支持 OOP 的结构

Verilog

System Verilog

块定义

模块

模块、类别

块实例

实例

目标

块名称

实例名称

目标句柄

数据类型

寄存器和线型信号

变量

功能

任务、函数、always块、initial块

任务、函数

约束、覆盖和随机度

System Verilog为覆盖驱动验证(coverage-driven verification)、定向(directed)和约束随机测试平台(constrained random testbench)开发提供了广泛的支持。

断言

断言(assertion)通过在设计中设置多个观测点进行功能覆盖。通常,RTL设计者和验证工程师都会在设计中使用它。断言既可以放在RTL代码之内,也可以放在RTL代码之外。放在里面使更新和管理更加容易,放在外面使代码的可综合和行为部分保持独立。System Verilog提供断言规范,可用于许多ASIC设计验证的环境中。System Verilog断言可用于设计的多个方面:变量说明、条件语句、内部接口和状态机。公众号:OpenFPGA

断言得到了一些商业模拟器的支持,如ModelSim和VCS。

System Verilog断言规范的一小部分子集支持可综合断言。遗憾的是,只有极少数的FPGA设计工具支持可综合断言。其中的一个是Synopsys Identify Pro,它具有断言综合和调试功能。

- END -

NOW现在行动!
推荐阅读
【Vivado那些事】如何查找官网例程及如何使用官网例程【Vivado使用误区与进阶】总结篇【Vivado那些事】Vivado中常用的快捷键(一)F4键【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键
SystemVerilog数字系统设计_夏宇闻 PDFVerilog 里面,always,assign和always@(*)区别
FPGA上如何求32个输入的最大值和次大值:分治图书推荐|ARM Cortex-M0 全可编程SoC原理及实现
简谈:如何学习FPGARISC-V再进阶!世界首款5纳米RISC-V SOC成功流片!
几款开源SDR平台Vitis尝鲜(一)
SDR/无线设计中LNA和PA的基本原理
拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!
一文最全科普FPGA技术知识你见过1-bit CPU吗?高级FPGA设计技巧!多时钟域和异步信号处理解决方案
【Vivado那些事】Vivado中电路结构的网表描述
ZYNQ中裸机开发和Linux开发有什么区别?
现代计算机的雏形-微型计算机MCS-4
世界上第一个微处理器真的是Intel 4004吗?其实这是个很复杂的故事…
【每周一问】如何控制加载FPGA程序时,Xilinx FPGA的IO管脚输出高低电平
【Vivado那些事】vivado生成.bit文件时报错-ERROR: [Drc 23-20]
AD9361 和Zynq及其参考设计说明1202年了,还在使用虚拟机吗?Win10安装Ubuntu子系统及图形化界面详细教程谈谈Xilinx FPGA设计的实现过程
Github 上有哪些优秀的 VHDL/Verilog/FPGA 项目
AD936x+ZYNQ搭建收音机(一)
AD936x+ZYNQ搭建收音机(二)含视频演示
AD936x+ZYNQ搭建收音机(三)-终篇
AD936x+ZYNQ搭建OpenWIFI
点击上方字体即可跳转阅读
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值