FPGA基礎 -- Verilog 共享任務(task)和函數(function)

Verilog 中共享任務(task)和函數(function) 的詳細專業培訓,適合具有一定 RTL 編程經驗的工程師深入掌握。


一、任務(task)與函數(function)的基本區別

特性taskfunction
調用方式可以在過程塊中調用可以在表達式中調用
返回值無返回值,通過 output/inout 傳遞必須有返回值
執行周期可以包含時間延遲 #、事件 @不能有任何延遲
并發可與 fork...join 結合實現并發只能是順序執行
復雜程度可用于復雜時序過程控制通常用于組合邏輯計算(無延遲)

二、定義規則及語法

1. task 定義與調用
task automatic send_byte;input [7:0] data;begin@(posedge clk);  // 等待時鐘上升沿tx <= data;#10;             // 延遲10時間單位end
endtaskalways @(posedge start) beginsend_byte(8'hA5);
end
  • automatic 關鍵字使 task 可重入(重要于并發使用,后面詳細講)。
  • 支持 input / output / inout 端口。
2. function 定義與調用
function [7:0] parity;input [7:0] data;beginparity = ^data;  // 位異或end
endfunctionassign even_parity = parity(data_byte);
  • 只能用于組合邏輯
  • 不能有 #@fork 等時序控制語句。

三、共享任務和函數的綜合注意事項

? 任務與函數默認是“靜態”的,若多個模塊或并發調用同一個 task/function 而它內部使用了靜態變量,會導致競態!

? 解決方案:

使用 automatic 聲明為可重入,讓每次調用使用獨立棧幀變量

task automatic process_data;input [7:0] val;integer i;               // 每個調用獨立的 ibeginfor (i = 0; i < 8; i = i + 1)$display("bit[%0d] = %b", i, val[i]);end
endtask

四、task/function 的高級應用示例

? 1. 復用模塊功能:
function [15:0] sum_with_carry;input [7:0] a, b;input       cin;beginsum_with_carry = a + b + cin;end
endfunctionassign {carry_out, result} = sum_with_carry(a, b, carry_in);
? 2. 仿真測試行為建模(仿真可用,不綜合):
task automatic check_result;input [7:0] expected, actual;beginif (expected !== actual)$display("Mismatch! Expected: %h, Got: %h", expected, actual);end
endtask

五、跨模塊共享 task/function 的方式

Verilog 本身不支持模塊之間直接調用 task/function,但可以通過以下幾種方式實現“模塊級共享行為”:

? 方法 1:抽象為 package(SystemVerilog)
package my_util_pkg;function automatic int abs(input int val);return (val < 0) ? -val : val;endfunction
endpackage// 使用:
import my_util_pkg::*;
? 方法 2:用 include 文件統一復用(Verilog 兼容)

創建 utils.vh

function [3:0] log2;input [31:0] val;beginlog2 = (val <= 1) ? 0 :(val <= 2) ? 1 :(val <= 4) ? 2 :(val <= 8) ? 3 : 4;end
endfunction

模塊中 include

`include "utils.vh"

六、設計規范建議

建議內容理由
所有 task/function 加 automatic保證并發安全,尤其是仿真或流水設計中
使用函數實現純組合邏輯可綜合,方便時序分析
使用任務完成帶延時/事件邏輯適合建模串口、時鐘驅動、通信協議等時序動作
將公共工具抽離為獨立文件/包提高復用性與項目結構清晰度

七、綜合與非綜合支持對比

內容taskfunction
是否可綜合(用于邏輯實現)可(無延遲時)可(純組合)
是否可用于仿真行為建模
是否可調用時序控制語句?(#/@)?
是否能嵌套調用??
是否支持并發?(自動)限制較多

八、實戰中常見誤區與調試建議

誤區 / 問題解決方案或建議
多處調用任務但未加 automatic,產生交叉干擾使用 task automatic 修復
在函數中加了 #10 延遲,綜合失敗函數中禁止延遲語句,只能用于組合邏輯
想通過函數修改外部變量不允許;用任務或通過輸出參數返回
仿真與綜合行為不一致task 中的延遲、事件等仿真語句不能綜合,需分清用途

九、面向 SystemVerilog 的拓展建議(如需使用)

  • 使用 class 中的 function / task 進行面向對象封裝
  • 支持 pure / virtual / static 方法
  • 支持 return 多位向量與結構體

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

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

相關文章

學習大模型---需要掌握的數學知識

1. 線性代數&#xff1a;樂高積木的世界 想象你有很多樂高積木塊。線性代數就是研究怎么用這些積木塊搭建東西&#xff0c;以及這些搭建好的東西有什么特性的學問。 向量&#xff1a; 就像一個有方向的箭頭&#xff0c;或者一組排好隊的數字。比如&#xff1a; 一個箭頭&…

明遠智睿RK3506開發板:多核異構架構賦能高可靠性工業與商業應用

在工業4.0與物聯網&#xff08;IoT&#xff09;技術快速發展的背景下&#xff0c;嵌入式系統對性能、功耗、可靠性和實時性的要求日益嚴苛。針對這一趨勢&#xff0c;瑞芯微推出的RK3506開發板憑借其創新的三核A7單核M0多核異構架構、高能低耗設計以及豐富的外設資源&#xff0…

【AI時代速通QT】第二節:Qt SDK 的目錄介紹和第一個Qt Creator項目

目錄 一、認識 Qt SDK 的目錄結構 二、第一個 Qt 程序 2.1 Qt Creator 創建項目 2.2 介紹項目各文件 三、揭秘 Qt 的構建過程 四、運行項目與總結 &#x1f3ac; 攻城獅7號&#xff1a;個人主頁 &#x1f525; 個人專欄:CQT跨平臺界面編程 ?? 君子慎獨! &#x1f308…

CDH部署Hive詳細指南

CDH部署Hive詳細指南 本文將詳細介紹如何使用Cloudera Manager Web界面部署Hive組件,包括安裝、配置、優化和運維管理等內容。 1. 環境準備 1.1 系統要求 1.1.1 硬件要求 服務器配置 CPU:建議8核以上內存:建議32GB以上磁盤:建議使用企業級SAS或SSD網絡:建議萬兆網絡集…

黨建賦能 醫校協同|廣州附醫華南醫院與湖南中醫藥高等專科學校簽約攜手共育英才

為深入貫徹落實黨中央、國務院關于高校畢業生就業創業工作決策部署&#xff0c;教育部印發《職業學校校企合作促進辦法》&#xff0c;對深化醫教協同提供了政策指引。在醫學教育領域&#xff0c;鼓勵醫學院校與醫療機構開展深度合作&#xff0c;根據醫療行業需求調整專業設置與…

【RTSP從零實踐】2、使用RTP協議封裝并傳輸H264

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

行業熱點丨手機中框設計如何體現增材思維?

編者薦語&#xff1a; 通過增材設計思維在金屬邊框設計晶格結構&#xff0c;既能減輕重量&#xff0c;同時也有助于散熱&#xff0c;針對不同位置設計不同類型的晶格結構還能起到緩沖效果&#xff0c;提高手機抗沖擊能力。 以下文章來源于Inspire增材創新設計&#xff0c;作者…

鴻蒙案例實戰——添加水印

本示例為開發者展示常用的水印添加能力&#xff0c;包括兩種方式給頁面添加水印、保存圖片添加水印、拍照圖片添加水印和pdf文件添加水印。 案例效果截圖 首頁 頁面水印 圖片水印 pdf水印 案例運用到的知識點 核心知識點 頁面添加水印&#xff1a;封裝Canv…

Qt工作總結07 <qBound和std::clamp>

一、qBound簡介 1. 定義 是 Qt 框架中一個非常實用的邊界限制函數&#xff08;也稱為 "clamp" 函數&#xff09;&#xff0c;用于將一個值限制在指定的最小值和最大值之間。頭文件&#xff1a;#include <QtGlobal> 2. 函數原型 template <typename T>…

53-Oracle sqlhc多版本實操含(23 ai)

SQLHC&#xff08;SQL Health Check&#xff09;作為 Oracle 數據庫性能診斷的核心工具&#xff0c;其設計理念和核心功能在 Oracle 各版本中保持高度一致&#xff0c;但在技術實現和周邊生態上存在漸進式優化。定期對關鍵業務 SQL 執行健康檢查&#xff0c;特別是在版本升級或…

math.pow()和pow()的區別

math.pow() 和 pow() 的區別 ? 1. math.pow() 來自 math 模塊參數&#xff1a;兩個數&#xff08;底數&#xff0c;指數&#xff09;結果類型&#xff1a; 始終返回 float 類型 示例&#xff1a; import math print(math.pow(2, 3)) # 輸出&#xff1a;8.0 &#xff08;…

郵科OEM攝像頭POE供電技術的核心優勢

安防監控中&#xff0c;供電方式影響系統穩定性、安裝效率與維護成本。郵科攝像頭采用POE技術&#xff0c;通過網線同時傳輸數據與電力&#xff0c;革新傳統部署模式。本文解析其六大核心優勢&#xff0c;展現其作為現代安防優選方案的價值。 一、布線簡化&#xff0c;效率提升…

微信小程序-數據加密

npm install crypto-js utils/aes.js const CryptoJS require(crypto-js);// 默認的 KEY 與 iv 如果沒有給 const KEY CryptoJS.enc.Utf8.parse(KrQ4KAYOEyAz66RS); // 十六位十六進制數作為密鑰 const IV CryptoJS.enc.Utf8.parse(ep1YCmxXuxKe4eH1); // 十六位十六進制…

【時時三省】(C語言基礎)善于利用指針

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 指針是C語言中的一個重要概念&#xff0c;也是C語言的一個重要特色。正確而靈活地運用它&#xff0c;可以使程序簡潔、緊湊、高效。每一個學習和使用C語言的人&#xff0c;都應當深入地學習和…

單點登錄進階:基于芋道(yudao)授權碼模式的單點登錄流程、代碼實現與安全設計

最近遇到需要單點登錄的場景&#xff0c;我使用的是芋道框架&#xff0c;正好它手動實現了OAuth2的功能&#xff0c;可以為單點登錄提供一些幫助&#xff0c;結合授權碼的模式&#xff0c;在改動最小的情況下實現了單點登錄。關鍵業務數據已經隱藏&#xff0c;后續將以以主認證…

關于Seata的一個小issue...

文章目錄 引言原因&#x1f913;解決方法&#x1f635;總結?? 引言 某一天&#xff0c;筆者在逛著Github的時候&#xff0c;突然看到seata有個有趣的issue&#xff0c;是一個task。 相關描述&#xff1a; While running the DruidSQLRecognizerFactoryTest.testIsSqlSynta…

FTTR+軟路由網絡拓撲方案

文章目錄 網絡拓撲軟路由配置FTTR光貓路由器TPLink路由器配置WAN設置LAN設置 參考 網絡拓撲 軟路由配置 配置靜態IP地址&#xff1a;192.168.1.100設置網關指向主路由的IP 設置自定義DNS服務器 開啟DHCP 這一步很關鍵&#xff0c;可以讓連上wifi的所有設備自動趴強。 FTTR光貓…

RPC - 服務注冊與發現模塊

為什么要服務注冊&#xff0c;服務注冊是做什么 服務注冊主要是實現分布式的系統&#xff0c;讓系統更加的健壯&#xff0c;一個節點主機將自己所能提供的服務&#xff0c;在注冊中心進行登記 為什么要服務發現&#xff0c;服務發現是要做什么 rpc調用者需要知道哪個節點主機…

分布式緩存:應對突發流量的緩存體系構建

文章目錄 緩存全景圖Pre背景與目標說明緩存原則與設計思路緩存體系架構緩存預熱與緩存預加載庫存操作與緩存結合防刷、限流與緩存緩存一致性與失效異步落地與消息隊列監控與指標容災與擴展示例小結 緩存全景圖 Pre 分布式緩存&#xff1a;緩存設計三大核心思想 分布式緩存&am…

華為云Flexus+DeepSeek征文|CCE容器高可用部署搭建Dify-LLM平臺部署AI Agent

華為云FlexusDeepSeek征文&#xff5c;CCE容器高可用部署搭建Dify-LLM平臺部署AI Agent 前言 Dify是一款開源的大語言模型應用開發平臺&#xff0c;融合了后端即服務和LLMOps的理念&#xff0c;使開發者可以快速搭建生產級的生成式AI應用&#xff0c;本文將詳細介紹如何使用華…