日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态和自动变量

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态和自动变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

靜態和自動變量

自動變量–也可以稱為動態變量,主要是用來描述在測試程序、抽象系統級、交易級或總線功能模型中的驗證程序。自動變量的另一個用途就是編寫可重入的任務,當一個任務的前一次調用仍然在執行時,可以再次對其調用。
自動變量也允許編寫遞歸函數–函數調用其自身。含有自動變量的任務或者函數的每次調用,都建立新的變量儲存空間,當訪問結束后,空間被釋放。

function automatic int b_add (int lo,hi);int mid = (lo + hi + 1) >> 1;if(lo + 1 != hi)return (b_add(lo,(mid - 1)) + b_add(mid,hi));elsereturn (array[lo] + array[hi]); endfunction

在Verilog中,通過聲明整個任務或者函數是自動的,來聲明自動變量。自動任務或函數中的所有變量都是動態的。
SystemVerilog加入了靜態和自動變量聲明
SystemVerilog增加了聲明靜態和自動變量的能力。SystemVerilog增加了一個static關鍵字,允許任何變量被顯性地聲明為static或者automatic。這個聲明時變量聲明的一部分,可以出現在任務、函數、begin …end塊或者fork…join塊中。注意在module一級聲明的變量不能顯示聲明為static或者automatic。在模塊級,所有變量都是靜態的。

//在一個靜態函數中顯式地聲明自動變量 function int count_ones (input [31:0] data);automatic logic [31:0] count = 0;automatic logic [31:0] temp = data;for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count; endfunction //在一個自動任務中顯式地聲明一個靜態變量 typedef struct packed{...} packet_t;task automatic check_results(input packet_t sent, received,output int total_errors);static int error_count;...if(sent !== received) error_count++;total_error = error_count; endtask

在模塊、begin…end塊、fork…join塊以及非自動的任務和函數中,所有的儲存方式都缺省為靜態的,除了被顯式地聲明為動態的。如果一個任務和函數被聲明為自動的,則所有的儲存方式默認為自動的,除非被顯式地聲明為靜態的。

靜態變量和自動變量的初始化
Verilog變量的內嵌(in-line)變量初始化
Verilog只允許在模塊級聲明進行內嵌初始化,在任務、函數、begin…end塊及fork…join塊中聲明的變量不能在聲明時志初始值。
SystemVerilog的內嵌初始化
初始化靜態和自動變量
SystemVerilog對Verilog進行了擴展,在任務、函數聲明的變量可以有內嵌初始值。
在非自動任務和函數聲明的變量默認是靜態的。內嵌初始值將在仿真開始前進行一次賦值。對任務或者函數的再次調用不會重新初始化變量。

注意:在任務或函數中初始化靜態變量是不可綜合的,可能在某些工具中不支持

靜態變量只初始化一次

//在一個靜態函數中顯式地聲明自動變量 function int count_ones (input [31:0] data);logic [31:0] count = 0; //只初始化一次logic [31:0] temp = data; //只初始化一次for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count; endfunction

自動變量每次調用時都只初始化
在非自動任務和函數中顯式地聲明為自動的變量在每次任務和函數調用時都會動態地創建,調用完畢會動態地釋放。函數或任務每次調用都會對內嵌初始值賦值。

function int count_ones (input [31:0] data);automatic logic [31:0] count = 0;automatic logic [31:0] temp = data;for (int i = 0; i <= 32 ; i++)beginif(temp[0]) count ++;temp >> 1;endreturn count; endfunction

在自動任務和函數聲明的變量默認是自動的。每次進入任務和函數時,都會為變量動態地創建儲存區,調用完畢釋放。每次調用任務或函數時,內嵌初始值都會被賦值。

如果想使硬件模型中的自動變量是可綜合的,則它只能用于表示暫時儲存–不會傳送到任務、函數或過程塊的外部。

注意:靜態變量初始化是不可綜合的,動態變量初始化是可綜合的。 用const限定詞聲明的變量的內嵌初始值也是可綜合的

靜態和自動變量的使用原則
(1)在always和initial塊中,如果無內嵌初始化則使用靜態變量,而需要內嵌初始化的使用自動變量。使用帶內嵌初始化的變量,所表現的行為最直觀,因為過程塊每次被重新執行,自動變量都會重新初始化。
(2)如果一個任務和函數會是可重入的,則應該設成自動的。變量也應該是自動的,除非有特殊的原因需要在兩次調用之間保持變量的值。一個簡單的例子,如果需要用一個變量來記錄任務或者函數被調用的次數,則這個變量應該是靜態的。
(3)如果一個任務和函數用來描述硬件的獨立部分,并且不是可重入的,那么應該把它聲明為靜態的,任務和函數中的所有變量也應該是靜態的。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的静态和自动变量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。