【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.pswp.cn/bicheng/77310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77310.shtml
英文地址,請注明出處:http://en.pswp.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;用于監聽該對象被綁定…