verilog中wire和reg类型的区别

一、基本概念

wire型数据常用来表示以assign关键字指定的组合逻辑信号,模块的输入输出端口类型都默认为wire型,wire相当于物理连线,默认初始值是z

reg型表示的寄存器类型,用于always模块内被赋值的信号,且必须定义为reg型,代表触发器,常用于时序逻辑电路,reg相当于存储单元,默认初始值是x

二、深入理解

1、从仿真角度来说,HDL语言面对的是编译器,相当于使用软件思路,此时:

  • wire对应于连续赋值,如assign;

  • reg对应于过程赋值,如always,initial;

2、从综合角度来看,HDL语言面对的是综合器,相当于从电路角度来思考,此时:

  • wire型变量综合出来一般情况下是一根导线;

  • reg变量在always中有两种情况:
    1)always @(a or b or c)形式的,即不带时钟边沿的,综合出来还是组合逻辑;
    2)always @(posedge clk)形式的,即带有边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop

3reg型数据保持最后一次的赋值,而wire型数据需要持续的驱动。

  • 在连续赋值语句assign中,表达式右侧的计算结果可以立即更新到表达式的左侧,可以理解为逻辑之后直接连接了一条线,这个逻辑对应于表达式的右侧,这条线对应于wire
  • 在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,这个变量可以声明成reg型。
三、区别总结

1使用场景区别:

  • wire一般是用在组合逻辑中,reg用在时序逻辑中。但是在always中,变量必须定义成reg型,即使always块也可以实现组合逻辑。那么这里刚好说明一下,其实always块不止能实现时序逻辑,还能实现组合逻辑:
    (1)如果这个条件是时钟上升沿或下降沿,那硬件模型就是一个触发器,只有是指定了always@(posedge or negedge)才是触发器。
    (2)如果这个条件是某一信号的高低电平,那这个硬件模型就是一个锁存器。
    (3) 如果这个条件是赋值语句右侧任意操作数的变化,那这个硬件模型就是一个组合逻辑。
  • wire用于连续赋值assign语句中;reg用于过程赋值always,initial语句中;

2在端口信号和内部信号上的使用区别

信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。

  • 对于端口信号,一旦定义为input或者output端口,默认就定义成了wire类型,输入端口只能是net类型(wire/tri)。输出端口可以是net类型,也可以是reg类型。若输出端口在过程块中赋值则为reg类型;若在过程块外赋值(包括实例化语句),则为net类型。

  • 内部信号类型与输出端口相同,可以是net或reg类型。判断方法也与输出端口相同。若在过程块中赋值,则为reg类型;若在过程块外如assign赋值,则为net类型。

  • inout是一个双向端口, 不能声明为reg类型,只能是wire类型。

  • 16
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog ,当你调用一个模块时,端口复制(port connection)可以使用 `reg` 类型的变量。`reg` 类型可以用于连接模块的输入端口(input port)或输出端口(output port)。 以下是一个示例代码,展示了如何使用 `reg` 类型的变量进行端口复制: ```verilog module MyModule( input reg A, output reg B ); // 模块内部逻辑 always @(A) begin B = A; end endmodule module TopModule; reg input_data; reg output_data; MyModule u1( .A(input_data), .B(output_data) ); initial begin // 初始化输入数据 input_data = 1; #5; // 等待一段时间 $display("Output: %b", output_data); // 显示输出数据 $finish; // 结束仿真 end endmodule ``` 在上述示例,我们定义了一个名为 `MyModule` 的模块,该模块有一个输入端口 `A` 和一个输出端口 `B`,它们都被声明为 `reg` 类型。在模块的内部逻辑,我们将输入端口 `A` 的值赋给输出端口 `B`。 在顶层模块 `TopModule` ,我们创建了一个实例 `u1`,并将 `input_data` 和 `output_data` 分别连接到实例 `u1` 的输入端口 `A` 和输出端口 `B`。这样,我们就可以通过 `input_data` 来向模块传递输入值,并通过 `output_data` 接收模块的输出值。 请注意,端口复制时使用的变量类型必须与模块的端口类型匹配。如果模块的端口是 `wire` 类型,则可以使用 `reg` 或 `wire` 类型的变量进行连接。如果模块的端口是 `reg` 类型,则只能使用 `reg` 类型的变量进行连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

耐心的小黑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值