SystemVerilog logic、wire、reg数据类型详解

作者:民工袁师傅
链接:https://zhuanlan.zhihu.com/p/38563777
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在Verilog中,wirereg是最常见的两种数据类型,也是初学者非常容易混淆的概念。SystemVerilog的一大改进是支持logic数据类型,它在多数时候可以不加区分地替代wire和reg。但如果不熟悉logic的限制随意使用,也容易遇到意想不到的错误。本文主要对比三种数据类型的区别,并总结它们的使用方法。

Verilog的wirereg类型
在Verilog中,由于需要描述不同的硬件结构,数据类型总体分为net和variable两大类。

net类型设计用于表示导线结构,它不存储状态,只能负责传递驱动级的输出。net类型数据需要使用assign关键字连续赋值(continuous assignment)。虽然assign语句一般被综合成组合逻辑,但net本质还是导线,真正被综合成组合逻辑的是assign右边的逻辑运算表达式。常见的net类型数据包括wire、tri、wand和supply0等。

variable类型设计用于表示存储结构,它内部存储状态,并在时钟沿到来或异步信号改变等条件触发时改变内部状态。variable类型数据需要使用过程赋值(procedural assignment),即赋值定义在always、initial、task或function语法块中。reg是最典型的variable类型数据,但需要说明的是,综合工具可能将reg优化综合成组合逻辑,并不一定是寄存器。常见的variable类型数据包括reg、integer、time、real、realtime等。

所以总结Verilog wire和reg的区别:

wire表示导线结构,reg表示存储结构。
wire使用assign赋值,reg赋值定义在always、initial、task或function代码块中。
wire赋值综合成组合逻辑,reg可能综合成时序逻辑,也可能综合成组合逻辑。
SystemVerilog的logic类型
SystemVerilog在Verilog基础上新增支持logic数据类型,logic是reg类型的改进,它既可被过程赋值也能被连续赋值,编译器可自动推断logic是reg还是wire。唯一的限制是logic只允许一个输入,不能被多重驱动,所以inout类型端口不能定义为logic。不过这个限制也带来了一个好处,由于大部分电路结构本就是单驱动,如果误接了多个驱动,使用logic在编译时会报错,帮助发现bug。所以单驱动时用logic,多驱动时用wire。

在Jason的博客评论中,Evan还提到一点logic和wire的区别。wire定义时赋值是连续赋值,而logic定义时赋值只是赋初值,并且赋初值是不能被综合的。

wire mysignal0 = A & B;     // continuous assignment, AND gate
logic mysignal1 = A & B;    // not synthesizable, initializes mysignal1 to the value of A & B at time 0 and then makes no further changes to it.
logic mysignal2;
assign mysignal2 = A & B;   // Continuous assignment, AND gate

所以总结SystemVerilog logic的使用方法:

单驱动时logic可完全替代reg和wire,除了Evan提到的赋初值问题。
多驱动时,如inout类型端口,使用wire。
参考资料
[1] http://www.verilogpro.com/verilog-reg-verilog-wire-systemverilog-logic

[2] Spear, Chris. SystemVerilog for Verification, Second Edition: A Guide to Learning the Testbench Language Features. Springer, 2008.

版权声明:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。

  • 11
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值