FPGA基礎 -- Verilog行為級建模之alawys語句

Verilog 中的 always 語句塊,這是行為級建模的核心結構之一,在 RTL 級設計中廣泛用于時序邏輯組合邏輯的建模。


一、什么是 always 語句?

? 定義:

always 語句用于描述可綜合的硬件行為邏輯,表示一個**“事件驅動”的過程塊**,當敏感列表中某個信號發生變化時,always 塊會立即觸發執行。


二、基本語法格式

always @(sensitivity_list)begin// 過程性代碼end

sensitivity_list 是觸發該塊執行的信號列表。


三、分類:三種常見 always 使用方式

類型敏感列表用途典型應用
時序邏輯posedge clk / negedge rst_n同步邏輯寄存器建模、狀態機
組合邏輯(*) 或所有組合信號列出無時序行為算術邏輯單元(ALU)
異步邏輯posedge clk or negedge rst異步復位結構上電初始化控制

四、時序邏輯建模(推薦使用方式)

4.1 同步復位寄存器建模:

always @(posedge clk) beginif (!rst_n)q <= 0;elseq <= d;
end

? 非阻塞賦值 <=,確保“并行硬件”的表達。

4.2 異步復位建模:

always @(posedge clk or negedge rst_n) beginif (!rst_n)q <= 0;elseq <= d;
end

? posedge clk or negedge rst_n:表示 rst_n 變化時立即響應。


五、組合邏輯建模

推薦使用 always @(*)

always @(*) begincase (sel)2'b00: y = a;2'b01: y = b;default: y = 0;endcase
end

? 使用 = 阻塞賦值。
? 確保對每個輸出都完全賦值,否則綜合工具會推斷出 latch(鎖存器)!


六、敏感列表詳解

? 常見寫法對比:

寫法解釋建議
always @(a or b or c)顯式列出每個信號? 可控但冗長
always @(*)隱式敏感列表,表示所有用到的組合信號? 推薦用于組合邏輯
always @(posedge clk)上升沿觸發(時序邏輯)? 推薦用于寄存器

七、阻塞/非阻塞賦值回顧(重點)

場景使用賦值類型示例
時序邏輯(同步時鐘)非阻塞 <=q <= d;
組合邏輯阻塞 =y = a + b;

?? 錯誤示例:混用賦值類型

always @(posedge clk) begina = b;   // ? 錯誤:阻塞賦值在時序邏輯中易引發競態c <= a;  // 實際 c 得到的是舊值,不是當前周期的 b
end

八、綜合注意事項(總結)

誤用影響修正建議
@(*) 中漏掉信號可能漏更新,綜合錯誤使用 @(*) 自動推導
混用 =<=引起競態與不符合意圖遵循賦值語義規則
不完全賦值可能推斷 latch加默認路徑 / default 分支
變量多處被賦值沖突或競態避免變量在多個 always 中賦值

九、典型設計范式:分離時序與組合邏輯

// 狀態寄存器
always @(posedge clk or negedge rst_n)if (!rst_n) state <= IDLE;else        state <= next_state;// 下一狀態邏輯
always @(*) begincase (state)IDLE:      if (start) next_state = RUN;RUN:       if (done)  next_state = IDLE;default:             next_state = IDLE;endcase
end

? 這是 FSM 設計的推薦結構:組合邏輯決定 next_state,時序邏輯更新 state。


十、仿真輔助結構(testbench 中的 always

always #5 clk = ~clk;  // 每 5ns 翻轉一次
  • 通常用于生成仿真用時鐘;
  • 非綜合代碼,僅用于 initial 或 testbench。

十一、拓展:SystemVerilog 中的 always_ff / always_comb

類型SystemVerilog 替代特點
時序邏輯always_ff自動檢查敏感列表,防止誤用
組合邏輯always_comb自動推導敏感列表

? 更強語義檢查,更安全可維護,但需要 SystemVerilog 工具支持。


十二、實戰示例總結:組合 + 寄存器 + 狀態機

// 組合邏輯:計數器是否達到最大值
always @(*) begindone = (cnt == 15);
end// 時序邏輯:計數器累加
always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt <= 0;else if (en)cnt <= cnt + 1;
end

小結

內容核心要點
語義always 塊是硬件中的過程行為
時序建模使用 posedge clk + 非阻塞賦值
組合建模使用 @(*) + 阻塞賦值,完整賦值
綜合約束不可在綜合邏輯中使用 #延遲
推薦實踐將時序邏輯與組合邏輯分離建模,提高可讀性與綜合效果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87567.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87567.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87567.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【力扣 簡單 C】704. 二分查找

目錄 題目 解法一&#xff1a;二分查找 題目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…

Java并發編程實戰 Day 30:并發編程未來展望與最佳實踐總結

【Java并發編程實戰 Day 30】并發編程未來展望與最佳實踐總結 文章簡述 經過30天的系統學習&#xff0c;我們從Java并發編程的基礎知識逐步深入到高并發系統的架構設計與性能優化。本文作為“Java并發編程實戰”系列的收官之作&#xff0c;將全面回顧整個系列的核心內容&#…

量化面試綠皮書:23. 醉酒乘客

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 23. 醉酒乘客 100名乘客排隊登機&#xff0c;每人持有一張對應座位的機票&#xff08;第n位乘客的座位號為n&#xff09;。 第一位乘客喝醉后…

AntV G6入門教程

以下教程聚焦于 AntV?G6 的 數據操作 API,詳細介紹各個方法的用途、參數以及完整的使用示例,幫助你在圖實例上精細地讀取、修改和管理節點/邊/組合等數據。文中示例代碼均基于 G6 v5.0.47 官方文檔 ([g6.antv.antgroup.com][1])。 一、獲取完整圖數據 1.1 graph.getData() …

67、數據訪問-crud實驗-分頁數據展示

67、數據訪問-crud實驗-分頁數據展示 分頁數據展示是數據訪問中常見的功能&#xff0c;用于將大量數據分割成多個頁面顯示&#xff0c;提升用戶體驗和系統性能。以下是分頁數據展示的相關介紹&#xff1a; #### 基本原理 1. **確定每頁顯示數量**&#xff1a;設定每頁顯示的數…

常見 Web 服務器

Web 服務器有很多種&#xff0c;功能和用途略有不同&#xff0c;下面我會分類介紹主流的 Web 服務器&#xff08;包含靜態/動態/反向代理支持&#xff09;并重點說明類似 Tomcat 的 Java 支持型。 常見 Web 服務器分類 類型名稱描述與特點&#x1f310; 靜態資源服務器Nginx高…

【MacOS】M3 Pro芯片MacBook極速搭建Kubernetes

M3 Pro 芯片 MacBook 2023上使用 Colima 安裝 Kubernetes。 Colima 輕量、高效&#xff0c;并且在 Apple Silicon 架構上表現出色。 下面是詳細的、一步一步的安裝和配置指南。 核心思路 我們將通過以下步驟完成整個過程&#xff1a; 準備工作: 安裝必要的工具&#xff0c;…

import { Add, Dongdong, UserAdd } from ‘@nutui/icons-react‘ 使用圖標導入庫報錯

import { Add } from "nutui/icons-react-taro"; 官網的導入的庫名字不全&#xff0c;后面要加-taro&#xff0c;就行了

猿人學js逆向比賽第一屆第七題

分析響應 看到響應體里面的data是個字體加密&#xff0c;于是這里可以看到woff文件也給返回了&#xff0c;這里現分析這個文件。 打開可以看到這里a351對應的是3和頁面中的3是對應的&#xff0c;于是用ddddocr動態識別字體文件中的字體&#xff0c;然后對應對應的字體替換是不…

股票心理學習篇:交易的人性弱點 - 頻繁交易

以下內容為學習時的筆記整理&#xff0c;視頻作者來自B站&#xff1a;老貓與指標 視頻鏈接&#xff1a;頻繁交易必死&#xff1f;底層邏輯深度剖析&#xff0c;老貓的的破局心法與實戰策略分享 交易的人性弱點 - 頻繁交易 主講人&#xff1a; 老貓 1. 引言&#xff1a;問題的…

WPF入門 #1 WPF布局基礎、WPF樣式基礎、WPF數據模板、WPF綁定

WPF當中有許多的布局容器控件&#xff0c;例如<Grid>、<StackPanel>、<WrapPanel>、<DockPanel>、<UniformGrid>。接下來分別介紹一下各個布局容器控件。 布局基礎 Grid <Grid><Grid.RowDefinitions><RowDefinition Height&qu…

開源大型語言模型的文本記憶新突破!

在現代科技的推動下&#xff0c;人工智能領域正在不斷地突破人類認知的極限。今年&#xff0c;由斯坦福大學、康奈爾大學和西弗吉尼亞大學的計算機科學家們&#xff0c;與法律學者共同展開了一項引人入勝的研究&#xff0c;聚焦于開源大型語言模型的文本記憶表現。這項研究不僅…

LeetCode 3090.每個字符最多出現兩次的最長子字符串

題目鏈接 https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/ 題目描述 給定一個字符串 s&#xff0c;找出滿足每個字符最多出現兩次的最長子字符串&#xff0c;并返回其長度。 示例 輸入&#xff1a;s "aabba" 輸出&#xff1a;5解…

使用開源NVIDIA cuOpt加速決策優化

使用開源NVIDIA cuOpt加速決策優化 文章目錄 使用開源NVIDIA cuOpt加速決策優化決策優化的現實挑戰供應鏈優化的復雜性實時決策的挑戰計算復雜性的挑戰 NVIDIA cuOpt&#xff1a;GPU加速的決策優化解決方案cuOpt的核心技術架構支持的優化問題類型性能優勢分析 實際應用案例&…

【JVM 09-垃圾回收】

垃圾回收 筆記記錄 1. 如何判斷對象可以回收1.1 引用計數法1.1.1 缺點 1.2 可達性分析算法1.2.1 可達分析、根對象1.2.2 優缺點 1.3 四種引用(強軟弱虛)1.3.1 軟引用的實際使用案例1.3.2 軟引用-引用隊列1.3.3 弱引用的實際使用案例 2. 垃圾回收算法2.1 標記清除算法2.2 標記整…

《二叉搜索樹》

引言&#xff1a; 上次我們結束了類和對象的收尾&#xff0c;之后我們就要學習一些高級的數據結構&#xff0c;今天我們先來看一個數據結構-- 二叉搜索樹。 一&#xff1a; 二叉搜索樹的概念(性質) 二叉搜索樹又稱二叉排序樹&#xff0c;它或者是一棵空樹&#xff0c;或者是…

【Redis】Sentinel哨兵

&#x1f6e1;? 深入理解 Redis Sentinel&#xff1a;高可用架構的守護者 在實際開發中&#xff0c;我們常用 Redis 構建緩存系統或數據中間件。然而&#xff0c;主從復制雖然能實現數據同步&#xff0c;但無法自動故障轉移&#xff08;failover&#xff09;&#xff0c;這就…

Shell腳本應用及實戰演練

文章目錄 一、Shell腳本語言的基本結構1、Shell腳本的用途&#xff1a;2、 Shell腳本基本結構&#xff1a;3、 創建Shell腳本過程4、 腳本注釋規范 二、Shell腳本語言的變量用法詳解位置與預定義變量 三、 Shell字符串詳解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

軟件工程瀑布模型學習指南

軟件工程瀑布模型學習指南 一、瀑布模型核心概念 1.1 定義與特點 瀑布模型是一種經典的軟件開發流程,將項目劃分為順序性的階段,每個階段有明確的輸入和輸出,如同瀑布流水般單向推進。其特點包括: 階段間具有明確的順序性和依賴性強調文檔驅動和階段評審適合需求明確、穩…

獲取gitlab上項目分支版本(二)

獲取gitlab上項目分支版本_gitlab代碼分支版本在哪-CSDN博客 原先寫過一版&#xff0c;但是這次想更新一下項目的分支信息時&#xff0c;提示我 git服務器上的Python版本是2.7.3&#xff0c;這個錯誤表明當前Python環境中沒有安裝requests庫&#xff0c;服務器也沒有連接外網&…