EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 wang20030608 于 2022-8-16 10:50 编辑 * w8 D; F& i+ g# ?( f9 ~
8 g2 v1 D) ?- O$ U) T% W& c( {6 Z原文地址 | reg | wire | 基本概念 | 1.是存储单元,用于时序电路
& N C* I* B: f; b/ }8 k2.默认初始值为X | 1.是一条线,用于组合电路+ x3 t; X5 K" f, L; ]
2.默认初始值为Z
% _, p& d+ }! u9 v' Q9 k$ u3.模块的输入输出端口都是wire型 | 赋值语句的差异 | 1.右侧的计算结果在某一条件触发后才赋给左侧
( {8 ~* M* z( |5 t2.用在always/initial语句中
$ y7 s3 K' ]' K( j* t, E# Y- X( [0 Q
| 1.右侧的计算结果立即更新到左侧 I& W M q3 g( f6 r, m9 \2 `
2.用在assign语句中& X5 i% o" M8 M5 Y* s7 g
: L7 B: B" r8 b2 `3 S$ m
| | % V3 {2 |/ M9 h2 t1 i5 j Y
| , C* F# o; f1 f R8 h5 K
| 端口信号和内部信号:
; i( {/ _7 H/ j信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。' a! d* o( l, K! @
4 w* f; |( \0 n) E
对于端口信号,一旦定义位input或者output端口,默认就定义成了wire类型,输入端口只能是net类型(wire/tri)。输出端口可以是net类型,也可以是reg类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。
) e# R& x$ b3 [$ e* }6 c% J: X/ a# x2 l' @* t! O* u$ L5 a
内部信号类型与输出端口相同,可以是net或reg类型。判断方法也与输出端口相同。若在过程块中赋值,则为reg类型;若在过程块外如assign赋值,则为net类型。
1 V- \2 L2 F: Q; E' _- x9 k2 o$ w& @1 g2 h0 i2 ]
若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信号。这时需要一个中间信号转换。4 S& w) O! U7 ]( q
4 o& V+ ^- s' j
inout是一个双向端口, inout端口不能声明为reg类型,只能是wire类型。地址4 F D9 o* y7 e7 I) y
关于 wire (可描述组合逻辑)在Verilog中, wire 可以纯粹看作一根导线(或者任意位宽的总线)。在使用 wire 时需要注意以下几点语法规则: - wire 类型用于将模块例化时的输入输出端口连接到你设计的电路的其他地方。
- wire 类型在模块声明也作为输入输出。
- wire 类型必须被其他东西驱动而不能用于存储数据。
- wire 类型在 always@ 块中不能作为 = 或 <= 的左值。
- wire 类型是 assign 语句中左值的唯一合法类型。
- wire 类型可以将两个基于Verilog的设计相结合,是一种无状态的方法(并不是很明白这里指的是什么意思)。
- wire 类型只能用于组合逻辑建模。
5 w! y3 I; t( W/ e3 A& L3 M
下面这段程序给出了几种 wire 类型合法使用的例子 关于 reg (既可描述组合逻辑也可描述时序逻辑)reg 和wire有点类似,但能够存储信息(状态),类似寄存器。在使用 reg 时有以下这些语法规则: - reg 类型可以用于在模块例化时连接其输入。
- reg 类型不能用于在模块例化时连接其输出。
- reg 类型可以在模块声明时作为输出。
- reg 类型不能在模块声明时作为输入。
- reg 类型是 always@ 块中作为 = 或 <= 左值的唯一合法类型。
- reg 类型是 initial 块中作为 = 左值的唯一合法类型(用于Test Bench)。
- reg 类型不能作为 assign 语句的左值。
- reg 类型能用于创建寄存器,以用于 always@(posedge Clock) 块。
- reg 类型既可以描述组合逻辑也可以描述时序逻辑。# s# V/ [: _9 Y) L/ T4 m
下面这段程序给出了几种 reg 类型合法使用的例子 ![]()
0 s1 E9 ~- { V: b9 b7 X |