Verilog reg 和 Verilog wire 之间的区别经常让许多刚开始学习这种语言的程序员感到困惑(我也曾困惑过!)。作为初学者,我被告知要遵循以下准则,这些准则似乎普遍有效:
- 在始终块内部分配的信号左侧 (LHS) 使用 Verilog 规范
- 使用 Verilog wire 处理分配在 always 块外的信号左端 (LHS)
后来,当我采用 SystemVerilog 编写 RTL 设计时,我被告知现在一切都可以是 “类型逻辑”。这在一般情况下也行得通,但时不时会遇到关于变量、网和赋值的令人费解的错误信息。
于是,我决定找出这些数据类型的确切工作原理,来撰写这篇文章。我翻阅了语言参考手册,搜索了现已失效的 Verilog-2005 标准文件,并上了一堂历史课。请继续阅读我发现的 Verilog reg、Verilog wire 和 SystemVerilog 逻辑之间的区别。
Verilog data types, Verilog reg, Verilog wire
Verilog 数据类型分为两大类:网和变量。它们的区别在于它们如何表示不同的硬件结构。
网数据类型表示结构实体之间的物理连接(想象一根普通的导线),如门之间或模块之间。它不存储任何值。它的值来自其驱动程序的驱动内容。Verilog 线可能是最常见的网络数据类型,尽管还有许多其他网络数据类型,如 tri、wand、supply0。
变量数据类型通常代表一块存储空间。在下一次赋值之前,它可以保持一个赋给它的值。Verilog reg 可能是最常见的变量数据类型。Verilog reg 通常用于模拟硬件寄存器(尽管它也可以表示组合逻辑,如 always@(*) 块内部)。其他变量数据类型包括整数、时间、real、realtime。
几乎所有 Verilog 数据类型都是 4 态的,这意味着它们可以取 4 个值:
- 0 表示逻辑零,或假条件
- 1 代表逻辑 1,或真条件
- X 代表未知逻辑值
- Z 代表高阻抗状态
Verilog 经验法则 1:要表示存储空间时使用 Verilog reg,要表示物理连接时使用 Verilog wire。
Assigning values to Verilog reg, Verilog wire
Verilog 网络数据类型只能通过连续赋值来赋值。这意味着要使用连续赋值语句(赋值语句)等结构,或从输出端口驱动。连续赋值驱动网络的方式与门驱动网络的方式类似。右侧的表达式可以看作是连续驱动网络的组合电路。
Verilog 变量数据类型只能通过过程赋值来赋值。这意味着要在始终块、初始块、任