ystemverilog提供了乙個ref關鍵字作為函式引數的字首。當使用ref時,表明引數是使用引用傳遞,'ref』語法類似c++中的引用。
有兩種情況下使用』ref』做引數比較有意義:
第一種情況:由於函式只能有乙個返回值(不考慮傳統verilog上的input/output引數埠宣告),任務沒有返回值。當函式需要返回多個值或者任務需要返回乙個以上值的時候,通過引用傳遞就用得上。
第二種情況是執行效率的考慮:當大量的資料需要作為引數傳遞的時候,值傳遞效率很低。所有的資料需要在每次函式呼叫的時候被複製。如果引數使用』ref』字首,可以不需要進行資料複製。但是這樣會使得引數的資料容易被函式/任務中的**修改。此危險可以通過宣告ref引數為常量來解決.
這裡簡單舉例解釋一下,需要結合c的指標概念理解:
task/function ***xx(ref logic arguments);
endtask/endfunction
上面的task/function,其「形參」是:ref logic arguments,
ref的意思你自己已經看過了,那麼,這個task/function被呼叫的時候發生了什麼呢?
那就是logic型變數arguments的指標被複製並傳遞至task/function內部,在task/function內部的一切
對arguments的操作,都是對變數arguments對應的指標,所指向的內容做操作。這和c語言的指標是乙個概念。也就是說task/function引數是複製乙份送入task/function的,這個行為是沒有改變的,加了ref,那麼引數的指標被複製,不加ref則引數本身被複製,當你對arguments操作的時候,你改變的,是指標所指向位址的內容而非指標本身。(這就是所謂的:在子程式修改ref引數變數的時候,其變化對於外部是立即可見的,因為指標指向的位址沒變而該位址本身指向的內容可能改變了。如果sv允許修改指標本身,那麼,這句話立刻就不成立了,但是sv限制了對指標本身的修改。)
const限定符限定了指標指向的內容是不可修改的,這個限定符可以防止在task/function內部修改了某個引數,引起意外錯誤(比如,在其他地方也用了這個指標指向的內容,但他不知道在task/function內部這個指標指向的內容已經被改變了,這是一種非常有用保護措施).
語言這種東西最好不要僅僅從概念解釋上理解。所有這些表述形式都只是編譯實現的需要。
所有語言的資料結構,其實都是儲存器中的bit,只有兩類語義,位址和資料,這都地球人全知道。
所謂的多型、引用、整合、指標、靜態、以及這裡提到的ref等等,都只不過是一些翻譯詞彙,用來描述針對某位址的資料進行了某些讀寫操作。
比如ref ,大白話講:就是說你一加這東西,你程式操作的目標資料,都是儲存器中同一片位址資料,這樣凡是用到這片資料的程式,都會牽一發動全身。
使用注意:見綠皮書p121
1)在需要方法中修改類中引數值得時候,需要在引數前加上ref,尤其是控制代碼,否則在方法內部對引數的修改 不會被呼叫該方法的**看到。p123
2) ref 引數只能被用於帶自動儲存的子程式中,若程式或模組指明了automatic屬性,則其子程式都是自動儲存的(p55);如果不希望子程式修改陣列的值,則使用const ref型別。
總結:ref
ref 只能被用於帶自動儲存的子程式中,不希望被修改則用const ref(p55)
在任務裡修改變數對呼叫他的函式隨時可見(p123)
關於 git reset 命令幾個常用引數的理解
我們在使用git進行版本管理的時候,如果遇到需要回退 的情況,一般會用git reset命令,不過這個命令還有幾個引數,這篇文章就來詳解一下。先來了解一下 git 大致的工作流程,配合這張圖會比較容易講清楚 首先,想象一下,我正在寫著我的 這個狀態對應圖中的 working diretory,這個時...
Batch Normalization的理解體會
網路上對於batch normalization的講解也非常多了,本文主要想記錄下對此的心得體會,並總結下我所理解的bn的優勢。在此先mark一下我認為寫得比較全面的資料 bn的原理 文章1 深度學習 深入理解batch normalization批標準化 bn的 batch normalizati...
25 理一理關於tensorflow的各種騷操作
1.tf.squeeze 2.tf.cast 3.tf.expand dims 4.tf.slice 按照指定的下標範圍抽取連續區域的子集 講的不錯 5.tf.gather 按照指定的下標集合從axis 0中抽取子集,適合抽取不連續區域的子集 6.tf.one hot 7.tf.transpose ...