【verilog】在同一个 always 块中写了多个“看起来独立”的 if / if-else,到底谁先谁后,怎么执行?会不会冲突?

🔍 问题本质

在一个 always @(posedge clk) 块中,所有的代码都是顺序执行的。但这不意味着它就像软件一样“一条一条执行”,因为最终是电路!电路是并行存在的!

Verilog 是硬件描述语言(HDL),你写的 if 看起来像判断语句,实际上是用来描述硬件行为的。比如赋值,就是描述电路连线和寄存器触发器之间的连接与更新方式


🌰例子一:多个 if 控制不同变量(并行)

always @(posedge clk) beginif (a) x <= 1;if (b) y <= 2;
end

✅ 分析:

  • xy 是两个不同的变量(信号)

  • if (a)if (b) 虽然写在一个 always 里,但它们控制的是不同的变量

  • 所以它们最终在硬件上是并行存在的,谁满足条件谁赋值,互不干扰

🎯 打比方:

你想象有两个电工:

  • 电工A:看到 a=1 就把灯 x 打开

  • 电工B:看到 b=1 就把灯 y 点亮

两个电工各干各的,不会打架。


🌰例子二:多个 if 控制同一个变量(后面会覆盖前面)

always @(posedge clk) beginif (a) x <= 1;if (b) x <= 2;
end

⚠️ 注意:

  • 现在两个 if 都是对 x 赋值

  • 如果 a=1b=1,那么两个赋值都触发,但最后一个有效

💥 为什么?

Verilog 顺序描述 => 最后一个赋值会“覆盖”前面那个 所以:

  • 如果 a=1b=1x <= 2

  • 如果 a=1b=0x <= 1

  • 如果 a=0b=1x <= 2

🎯 打比方:

还是两个电工:

  • 电工A先来,把灯 x 调到1

  • 电工B后到,把灯 x 调到2

最后你看到灯 x 是2,电工A的动作被“覆盖”了
 

这里如果有疑惑,可以看这篇博客:
【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?


🌰例子三:中间插入打拍语句(可以)

always @(posedge clk) beginif (a)x <= 1;x_d1 <= x;  // 打拍:让x的值走一拍if (b)x <= 2;
end

⚠️ 这个时候 x <= 1 先执行,但后面又 x <= 2,会不会有问题?

会被覆盖!除非你做数据隔离或选择性赋值


🌰例子四:多个 if else + case 都是并行行为的体现

always @(posedge clk) beginif (sel == 0)x <= 1;else if (sel == 1)x <= 2;case(sel)2: x <= 3;3: x <= 4;endcase
end

😵‍ 分析:

  • 如果 sel == 2,那么:上面 if-else 不触发,case 触发 x <= 3

  • 如果 sel == 1,if-else 触发 x <= 2,case 不触发

但是注意,如果你写多个能影响同一个变量的赋值语句,它们中间的优先级以代码顺序为准


✅ 结论总结

情况行为说明
多个 if 控制不同变量并行谁条件满足谁执行,互不干扰
多个 if 控制同一个变量顺序后面赋值覆盖前面
if/else + case 控制同一变量顺序+可能冲突后面的 case 会覆盖前面 if 的赋值
插入打拍语句合法不影响并行结构,但要注意覆盖风险
多个嵌套 if按照语句顺序但并不表示电路是串行运行,是条件表达上的判断顺序

😎 建议写法

为了代码清晰和避免莫名其妙的赋值冲突:

  • 推荐使用 if-else if-else 结构统一处理一个变量的所有情况

  • 或者先保存中间变量,最后统一赋值

  • 打拍信号最好和主赋值语句分开块写,减少混乱


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【React】什么是 Hook

useStateuseEffectuseRef 什么是hook&#xff1f;16.8版本出现的新特性。可以在不编写class组件的情况下使用state以及其它的React特性 为什么有hook&#xff1f;class组件很难提取公共的重用的代码&#xff0c;然后反复使用&#xff1b;不编写类组件也可以使用类组件的状态st…

如何查看自己抖音的IP属地?详细教程及如何修改

在当今互联网时代&#xff0c;IP属地信息已成为各大社交平台&#xff08;如抖音、微博、快手等&#xff09;展示用户真实网络位置的重要功能。以下是关于如何查看抖音IP属地的详细教程及常见问题解答&#xff0c;帮助您快速了解相关信息&#xff1a; 一、如何查看抖音账号的IP属…

深度学习算力革新:AI服务器在运维工作中的智能化实践

【导语】作为IT基础设施服务领域的从业者&#xff0c;我们在日常工作中发现&#xff0c;AI服务器的智能化运维能力正在重塑传统IDC的管理模式。本文将以DeepSeek系列服务器为例&#xff0c;分享智能算力设备在真实运维场景中的创新应用。 一、传统服务器集群的运维痛点 在数据…

安装部署RabbitMQ

一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq

中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)

1、向量&#xff08;Vector&#xff09;的概念 &#xff08;1&#xff09;、向量的定义 向量&#xff1a;在计算机科学中&#xff0c;向量是一组同类型数据的有序集合&#xff0c;例如一个包含多个数值的数组。在数据库中&#xff0c;向量通常指批量数据&#xff08;如一列数…

Python PDF 转 Markdown 工具库对比与推荐

根据最新评测及开源社区实践&#xff0c;以下为综合性能与适用场景的推荐方案&#xff1a; 1. ‌Marker‌ ‌特点‌&#xff1a; 转换速度快&#xff0c;支持表格、公式&#xff08;转为 LaTeX&#xff09;、图片提取&#xff0c;适配复杂排版文档‌。依赖 PyTorch&#xff0c…

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 组件生命周期 父子组件生命周期顺序&#xff1a; 创建时&#xff1a; 父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted 更新时&#xff1a; 父 beforeUpdate → 子组件更新 → 父 updated。 销毁时&#xff1a; 父 beforeDestroy…

Microsoft Azure 基础知识简介

Microsoft Azure 基础知识简介 已完成100 XP 2 分钟 Microsoft Azure 是一个云计算平台&#xff0c;提供一系列不断扩展的服务&#xff0c;可帮助你构建解决方案来满足业务目标。 Azure 服务支持从简单到复杂的一切内容。 Azure 具有简单的 Web 服务&#xff0c;用于在云中托…

C语言链接数据库

目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…

【Maven】手动安装依赖到本地仓库

【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖&#xff0c;中央仓库地址&#xff1a;https://mvnrepository.com/ 搜搜你的依赖的a…

腾讯云golang一面

go垃圾回收机制 参考自&#xff1a;https://zhuanlan.zhihu.com/p/334999060 go 1.3 标记清除法 缺点 go 1.5 三色标记法 屏障机制 插入屏障 但是如果栈不添加,当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况(如上图的对象9). 所以要对栈重新进行三色标记扫…

跨平台嵌入式音视频开发指南:EasyRTC音视频通话的多场景适配与AI扩展能力

在数字化通信技术飞速发展的今天&#xff0c;实时音视频通信已成为众多智能设备和应用的核心功能。从智能家居到远程办公&#xff0c;从在线教育到智能安防&#xff0c;音视频通信技术的应用场景不断拓展&#xff0c;对低延迟、高稳定性和跨平台兼容性的需求也在持续增长。在这…

Android 11 去掉性能受到影响通知

源码位置: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java final void finishBooting() {TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",Trace.TRACE_TAG_ACTIVITY_MANAGER);t.traceBegin("Finis…

Mac idea WordExcel等文件git modify 一直提示修改状态

CRLF LF CR 换行符自动转换问题 查看状态&#xff1a;git config --global --list Mac需要开启&#xff0c;window下需要关闭 关闭命令&#xff1a;git config --global core.autocrlf false 命令解释&#xff1a; autocrlf true 表示要求git在提交时将crlf转换为lf&a…

Apache Commons CLI 入门教程:轻松解析命令行参数

文章目录 Apache Commons CLI 入门教程&#xff1a;轻松解析命令行参数一、什么是 Commons CLI&#xff1f;二、为什么选择 Commons CLI&#xff1f;三、快速开始1. 添加依赖2. 基础示例3. 运行示例1. 在Idea中运行2. 命令行中运行3. 使用 Maven/Gradle 运行&#xff08;推荐&a…

VS2022调试嵌入式linux C# 程序 高效的开发方案

1.目标板子配置好ssh,确保PC可以连上 2.目标板子上传VSDBG程序&#xff0c;详见我的上一个文章 3.PC安装winfsp&#xff0c; sshfs,SSHFS-Win Manager.傻瓜式安装&#xff0c;将目标板子映射到PC的某个盘 4.VS2022中&#xff0c;你的工程的exe生成目录到上面盘中某个路径 5…

Python中如何加密/解密敏感信息(如用户密码、token)

敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…

智能体开发的范式革命:Cangjie Magic全景解读与实践思考

引言&#xff1a;当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天&#xff0c;智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月&#xff0c;仓颉社区推出的Cangjie Magic开源平台&#xff0c;以其创新的设计理念和技术架构&#xff0c;为这一领域带来了…

【Java学习笔记】位运算

位运算 一、原码&#xff0c;反码&#xff0c;补码 (1) 二进制的最高位是符号位&#xff1a;0 表示正数&#xff0c;1 表示负数&#xff08;怎么记&#xff1f; 1旋转一下变成-&#xff09; (2) 正数的原码、反码、补码都一样&#xff08;三码合一&#xff09; (3) 负数的反码…

HttpSessionBindingListener 的用法笔记250417

HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口&#xff0c; 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口&#xff0c;用于监听该对象被绑定…