Verilog reg, Verilog wire, SystemVerilog logic. What’s the difference?

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 变量数据类型只能通过过程赋值来赋值。这意味着要在始终块、初始块、任

### 配置 `verilog_systemverilog.vim` 文件 为了优化 VerilogSystemVerilog 的编辑体验,在 `.vimrc` 中添加特定配置是必要的。这不仅能够实现语法高亮,还能增强其他功能如自动补全、语法检查和格式化。 #### 修改 .vimrc 文件 在 `.vimrc` 文件中加入以下内容可以确保 Vim 正确识别并处理不同类型的 SystemVerilog 文件: ```vim augroup filetypedetect au BufNewFile,BufRead *.sv,*.svh,*.svp,*.vh,*.vp setfiletype systemverilog augroup END ``` 上述设置通过关联指定扩展名到 `systemverilog` 类型来触发相应的语法高亮和其他特性[^4]。 #### 安装插件支持 对于更高级的功能需求,安装专门针对 Verilog 及其超集——SystemVerilog 设计的插件是非常有帮助的。推荐使用[Vim Syntax Plugin for Verilog and SystemVerilog][^3]这款插件,它可以极大地提升开发效率,使 Vim 成为一个强大的硬件描述语言开发平台。 #### 自定义 verilog_systemverilog.vim 如果希望进一步自定义 `~/.vim/syntax/verilog_systemverilog.vim` 或者类似的文件路径下的配置文件,则可以根据个人喜好调整颜色方案、关键字列表等参数。下面是一个简单的例子展示如何增加额外的关键字用于更好的语法着色效果: ```vim " ~/.vim/syntax/systemverilog.vim syn keyword svStatement if else case default forever fork join repeat while do begin end module initial always task function wire reg input output inout supply0 supply1 tri pullup pulldown small medium large vdd vss hi def link svStatement Statement ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂的码泰君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值