1.引言
众所周知,SystemVerilog语言是基于verilog语言引入面向对象特性的硬件设计和验证语言。SystemVerilog语言在UVM验证中广泛使用,表明了其强大的建模能力。但是SystemVerilog语言不仅用于验证(Verification)。从SystemVerilog标准设计之初,其主要目标之一就是以更少的代码更精确地构建复杂硬件设计的可综合模型。在SystemVerilog推出的初期,其某些可综合特性在EDA工具支持上确实不太完美。但是在21世纪20年代的今天,IC和FPGA开发工具(Design Complier、Vivado、Quartus Prime)均已经很好的支持了SystemVerilog面向可综合设计的特性。
下图1展示了主要的Verilog和SystemVerilog语言集特性的发展历程。
图1. Verilog到SystemVerilog的发展历程
Verilog语言从1995年IEEE将Verilog语言标准化后,一直跟随IC设计实践的发展而不断丰富和扩展。Verilog语言先后推出了1364-1995(名为Verilog-1995)标准、1364-2001(名为Verilog-2001)标准和1364-2005(名为Verilog-2005)标准。在2005年,出现的SystemVerilog-2005并非一个独立语言,只是在Verilog-2005基础之上的一组扩展。2009年,IEEE将Verilog 1364-2005和SystemVerilog扩展(1800-2005)合并为同一个文件,并且将合并后的标准名称改为SystemVerilog。SystemVerilog标准是一个完整的硬件设计与验证语言!
2.可综合语言子集探讨
本文主要针对FPGA逻辑设计中应用SystemVerilog语言的接口(interface)和类型定义(typedef)做简要介绍。
2.1接口(Interface)
接口是端口的进一步增强,可以包含众多的可参数化的端口,同时接口中可以包含function。 Function现在也是可综合的。接口最大的好处是一次声明,到处使用,大大简化了设计连接的复杂度,减少连接出错的可能性。接口中定义modport(module port 的缩写),可以将接口中的端口封装成用于模块连接的master和slave两种,指明端口信号的方向。
以FPGA设计中经常使用的avalon stream 包接口为例,如图2所示包接口的定义。流式包接口中包括基本的sop(start of packet), eop(end of packet),dat(data of packet), mty(empty of data), val(valid of packet), rdy(ready of interface),还可以增加自己设计定义的chn(channel),err(error)和sbd(sideband)等信号,增加接口的灵活性和丰富性。另外error 和sbd 信号也可以定义成特定数据类型,精确到每个具体信号,而不是多比特数据的聚合。图2的示例是一个参数化的接口。
图2. avalon stream packet 接口示例
接口定义在文件中独立出来。使用时需要include包含接口文件。然后在模块的接口上使用自定义的接口。接口的使用如图3所示。
图3. 接口的使用
接口用于模块互联的示例如图4所示。注意,接口需要先例化,再用于模块互联。另外,通过数组能够轻松例化多个相同的接口,简化编码,轻松维护代码。
图4. 使用接口做模块互联
2.2 类型定义(typedef)
使用类型定义(typedef)可以自由方便的定义自己期望的数据类型,比如包含3位ecc校验位的32比特数据类型:
typedef logic [32+3-1:0] data_ecc_t ;
data_ecc_t data0 , data1 ;
这样一处声明,到处使用。 只需要修改typedef 的定义值,就可以方便调整ecc的具体位宽。
更进一步可以定义设计需要的自定义结构体。结构体的每一项成员可以随时调整位宽,也可以新增加结构体的成员。图5示例自定义结构体类型,并且嵌套结构体。针对读访问构造了Sbd结构体。
图5. 自定义结构体类型
使用typedef 定义的特定类型是一种新的数据类型。在逻辑设计中使用时需要先声明变量再使用。图6示例的是图5中定义的新数据类型的使用。结构体类型的成员可以方便的通过.操作符引用,而不用担心数据比特位置是否错误。如果使用verilog中的大位宽数组来表示stats_req_info, 那么必须小心的使用【x:y】来选择域段表示特定的含义,扩展数据位宽非常容易出错。而使用结构体类型则完全避免了数据的错误使用,含义清晰。
图6. 结构体类型的使用
3. 总结
FPGA逻辑设计中使用SystemVerilog的可综合特性已经在具体项目开发中获得了强大的表达力,灵活性和可维护性。本文只是展示了SystemVerilog可综合语言特性的冰山一角,其他的可用好用的地方,以后继续探索。