Not True! SystemVerilog was designed to enhance both the design and verification capabilities of traditional Verilog VCS, Design Compiler and Synplify-Pro all support RTL modeling with SystemVerilog.

作为数字设计工程师来说,一项很重要的任务就是写可综合的HDL代码,不可综合的代码那只能是behavior model或者testbench。什么样的HDL代码是可综合的?你能通过代码构思出其对应电路的就是可综合的,否则就是不可综合的,这样的判断也是八九不离十了。简而言之,能在你颅内综合,一般而言就可以被综合工具综合,反之亦然。

现在很多代码,尤其是IP vendor的代码,还是基于verilog的,而不是system verilog的,这可能与其想尽可能地支持多种或者低版本的EDA工具有关。实际上System Verilog有很多好的可综合feature是非常有用的,有助于我们简化代码,提高可读性。至于EDA工具的支持,主流工具都是支持的,可综合的System Verilog代码,Verilator也是支持的。本文我们只考虑可综合的System Verilog特性。

别眼馋Chisel了,SystemVerilog就很香!

1. logic, always_ffalways_comb

Verilog中我们有wirereg,当然reg可能对应组合逻辑中的信号线,也可能对应时序逻辑中的flip-flop。在System Verilog中我们可以把wirereg替换成logic,至于综合成什么,交给综合工具吧。不过作为数字电路设计工程师,代码写下之前你就应该知道综合成组合逻辑还是时序逻辑。你可以继续使用always,组合逻辑使用always @(*),时序逻辑用always @(posedge clk)之类。或者更进一步,我们使用System Verilog里的always_ffalways_comb。顾名思义,always_ff是要综合成时序逻辑中的flip-flop,always_comb是综合成组合逻辑。如果实际综合结果不是名字所提示的那样,那么工具会报错的,这时你可以有改正的机会。比如下面这段代码:

always_combif (en)a = b;

对应的电路是个latch,和组合电路的期望不符,会得到compiler的报错。

正如你所认为的那样,always_ffalways_comb是特意给可综合代码设计的。

不过需要注意的是,logic是单驱动的,不像wire是可以多驱动的,但这对于可综合电路来说完全不是问题。

至于always_latch?除了极特殊场合,一般用不上。

2. typedefstructparameter type, package

能够自由地自定义类型是System Verilog非常大的优势。比如32位的数据,我们会附加一位的校验位,于是我们在代码里可能有多处logic [8:0]来表示带校验位的数据。那如果某天我要把一位的校验位换成3位的ECC怎么办?里面所有logic [8:0]要改为logic [10:0],增加了很多工作量,且容易出错。

有了typedef我们就好办了,我们可以这样使用:

typedef logic [8:0] data_t;
data_t data0, data1;

下次变成3位ECC只需要改typedef里的位宽即可。

甚至我们可以把它定义成struct,把校验位单独拎出来:

typedef struct packed {logic [7:0] val;logic       par;
} data_t;
data_t data0, data1;//......
if (data0.par != ^data0.val)
//......

struct的功能极其强,我们可以把一些联系紧密的信号捆绑在一起,实现轻量级的interface功能。packed表示此类型是压缩的,即一维形式存储的,在waveform里显示出来也是一个一维向量,当然仿真工具会把其成员的值也显示出来,方便debug。

如果我想在input, output里使用自定义的类型怎么办?因为在输入输出列表里,此时还没有经过typedef定义。一种简便的方法是定义在parameter列表里:

module foo #(parameter data_t = typedef struct packed { logic [7:0] val; logic par;}
) (input data_t data,//......

或者参数类型由上一层module传进来:

module foo #(parameter data_t = logic
) (input data_t data,//......
endmodulemodule top;typedef struct packed {  logic [7:0] val;  logic       par;} data_t;foo #(.data_t(data_t)) foo (//......
endmodule

当然,关于类型的定义可以写在package里面,然后使用的时候import即可,这是另一种用法。比如:

package example;typedef struct packed {       logic [7:0] val;       logic       par;   } data_t;
endpackagemodule fooimport example::*;
(input data_t data,//......

typedef及类型的相关用法用得好了,System Verilog HDL编码水平可以上一个台阶。

3. 多维数组

在电路设计中,有些描述天然就是对应多维数组的,而多维数组一般来说都是可综合的,使用多维数组可以让HDL代码更简洁、直观。比如一组16个8-bit的数据用于计算FFT。我们可以这样定义:

logic [7:0] data [0:15];

也可以这样定义:

logic [15:0][7:0] data;

后者是packed array,和上面说的packed struct类似,是以一维的形式存储的。对于非packed array,先引用后面的维度,对于packed array,先引用前面的维度。需要注意的是,赋值的时候要注意引用index的ascend或者descend特性。 不仅可以使用多维数组,还可以对struct类型增加维度。比如:

typedef data_t [15:0] data_array_t;

4. enum与状态机

在Verilog里表示状态机的状态一般是自定义的几个值,比如用parameter或者localparam定义好几个状态的名称和值,或者用define来定义,也可以直接使用状态的编码值。比如使用localparam来定义:

localparam IDLE = 3'b000;
//......
if (~rst_n)state <= IDLE;
//......

System Verilog里提供了enum,可以提供类似parameter的效果,但是更自然,也更容易扩展。比如:

typedef enum {IDLE, /*other states*/} state_t;
state_t state;
//......
if (~rst_n)state <= IDLE;
//......

enum类型也可以指定位宽,如:

enum bit [3:0] {IDLE, /*other states*/} state;

当然,我们也可以手动指定每个状态的编码,否则默认从0开始递增。以上这些用法是可综合的,System Verilog还为enum准备了很多函数,如first(), last(), next()等,可综合的设计里就不要使用了,也没必要。

5. interfacemodport

interface是为了便于模块之间连接而设计的,里面可以做很多事情,里面可以有一系列的信号,也可以有typedef定义的自定义类型,也可以用modport定义信号的方向。modport定义对于可综合代码来说是很重要的。相比较起structinterfacemodport里可以定义inputoutput,但使用interface进行模块间连接的时候需要将其实例化,像这样:

interface intf;wire a, b, c, d;modport master (input a, b, output c,d);modport slave (output a,b, input c,d);
endinterface
module m (intf i);//......
endmodule
module s (intf i);//......
endmodule
module top;intf i();m u1(.i(i.master));s u2(.i(i.slave));
endmodule

interface还有很多花里胡哨的用法,但很多是为了建模和testbench用的,modport算是interface里用的最普遍的可综合的功能了。

6. function void

在Verilog里,function只能返回一个输出,而有时候我们可能会有多个输出,如果使用function的话只能把多个输出拼在一起输出,然后再人为解析开。比如一个坐标点,我们可以算出角度和幅度,在Verilog里只能这么写(假设通过组合逻辑算出来,不然就不能用function了):

function [15:0] cordic;input [7:0] x;input [7:0] y;begin//......cordic = {angle[7:0], mag[7:0]};end
endfunctionassign {angle, mag} = cordic(x, y);

而SystemVerilog 则提供了function void,参数里可以加多个output,所以上面的例子可以这么实现了:

function void cordic(input [7:0] x, y,output [7:0] angle,output [7:0] mag
);
//......
endfunctionalways_combcordic(x, y, angle, mag);

7. genvarfor循环

其实genvar并不算System Verilog的新feature,Verilog里就有。但genvar真是个好东西,可以让代码更简洁明了。比如这样:

module axi_lite_demux #(
//......
)(
//......
output req_t [NoMstPorts-1:0] mst_reqs_o,
input resp_t [NoMstPorts-1:0] mst_resps_i
);
//...
logic [NoMstPorts-1:0] mst_aw_valids, mst_aw_readies;
for (genvar i=0; i<NoMstPorts; i++) begin: gen_mst_awassign mst_reqs_o[i].aw_valid = mst_aw_valids[i];assign mst_aw_readies = mst_resps_i[i].aw_ready
end

配合for使用genvar的时候也无需generate。也可以直接用for完成:

always_comb beginfor (int i=0; i<NoMstPorts; i++) begin: gen_mst_awmst_reqs_o[i].aw_valid = mst_aw_valids[i];mst_aw_readies = mst_resp_i[i].aw_ready;end
end

使用for也是让代码简洁明了的一个重要手段。

reg类型变量综合电路_SystemVerilog的一些可综合实用技巧相关推荐

  1. FPGA数字系统设计(8)——可综合电路及状态机

    一.可综合电路 行为级可综合语法和数据流级语法合在一起被称为RTL级,该级别的模型是可以被综合成电路进而实现的. 1.module 和endmodule 作为模块声明的关键字,必然是可以被综合的. 2 ...

  2. reg型变量怎么赋值_两个always块同时对一个reg类型变量赋值的问题

    两个always块同时对一个reg类型变量赋值的问题 [复制链接] 两个always块同时对一个reg类型变量赋值的问题 问题描述: pps信号为秒脉冲信号(GPS授时模块中的同步秒脉冲),每个一秒钟 ...

  3. 计算机网络基础题解综合练习实验,计算机网络基础题解•综合练习•实验

    计算机网络基础题解•综合练习•实验 作 者:赵宇 编著 出版时间:2005年01月 定 价:23.00 I S B N :9787111137221 所属分类: 标 签: 本书是"计算机网络 ...

  4. 大楼通信综合布线系统_系统梳理一下综合布线系统的方方面面

    综合布线系统采用星形结构的模块化设计,以一套单一的高品质配件,综合了智能建筑及建筑物群中多种布线系统,解决了目前在建筑物中所面临的有关语音.数据.视频.监控等设备的布线不兼容问题.通过冗余布线,满足建 ...

  5. 基于多目标算法的冷热电联供型综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化

    多目标粒子群 冷热电联供 综合能源系统 运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:<基于多目标算法的冷热电联供型综合能源系统运行优化> 仿真平台:MATL ...

  6. [足式机器人]Part3机构运动微分几何学分析与综合Ch02-2 平面机构离散运动鞍点综合——【读书笔记】

    本文仅供学习使用 本文参考: <机构运动微分几何学分析与综合>-王德伦.汪伟 <微分几何>吴大任 Ch02-2 平面机构离散运动鞍点综合 2.3 鞍点圆 2.3.1 鞍圆与二副 ...

  7. 网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...

    网络工程师课程---7.网络通信综合实验(做网络基础综合实验 用什么软件) 一.总结 一句话总结: cisco packet ['pækɪt]  tracer ['treɪsə] packet 英 [ ...

  8. 综合专题学期实训IV综合报告

    综合专题学期实训IV综合报告 题目 基于Java的聊天系统设计与实现 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 夏端峰(副高).黄烜(讲师) 撰写时间 2023年6月 ...

  9. eNSP综合实验合集(eNSP综合大作业合集)_可先收藏

    作者:BSXY_19计科_陈永跃 BSXY_信息学院 注:未经允许禁止转发任何内容 **注:在该文章中就只对ensp综合实验做一个总结和归纳,只给出相应的topo图和需求说明和对应的文章的连接.有什么 ...

最新文章

  1. 边缘链接 matlab,matlab-“简单”边缘-线-检测
  2. 6-1 求链式表的表长
  3. C# 去除所有的html标签
  4. javafor循环打印图案_C程序使用循环打印盒子图案
  5. python时间格式转换time模块
  6. Hyper-V虚拟机安装及网卡无法找到,驱动无法安装解决办法
  7. python中修饰器_python 中的修饰器
  8. HTTP摘要认证原理以及HttpClient4.3实现
  9. node csrf 防御 待续
  10. POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
  11. 黑马程序员_Java基础(环境搭建、进制转换、运算符)
  12. DAY02.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)
  13. 无效镜像问题image has dependent child images
  14. 计算机网络之TCP最大连接限制
  15. 肖邦 《第一钢琴协奏曲》E小调,OP.11 个人赏析
  16. 2022-2028全球与中国脚踏泵市场现状及未来发展趋势
  17. Floyd-傻子也能看懂的弗洛伊德算法(转)
  18. Unity3D 2021.1.1F1。更新与下载。
  19. python编游戏_python编的著名游戏
  20. 自然语言处理(NLP)数据集汇总 3(附下载链接)

热门文章

  1. python file does not exist_python – os.path.exists()的谎言
  2. c语言中point的用法_C/C++中 *和amp;的爱恨情仇
  3. 乌鸦可能是灵长类动物以外最聪明的动物
  4. Linux7-常用文件管理命令及系统变量基础
  5. Nature:iHMP之“微生物组与前驱糖尿病”
  6. 扩增子图表解读7三元图:三组差异数量和关系
  7. pandas使用dropna函数删除dataframe中全是缺失值的数据列(drop columns with all missing values in dataframe)
  8. python使用matplotlib可视化subplots子图、subplots绘制子图、子图之间有重叠问题、使用subplots_adjust函数合理设置子图之间的水平和垂直距离
  9. pandas使用pd.concat横向合并多个dataframe实战:多个dataframe的横向表拼接(行对齐)、多个dataframe的横向表拼接(指定join参数、交集还是并集)
  10. R语言dplyr包all_equal函数检查多个dataframe是否相同实战