2012-05-31 12 views
1

我想將一個向量轉換爲結構並在同一語句中提取成員。這可能嗎?否則,我將不得不分配給一個臨時變量,這很醜陋。Casting to System Verilog結構和引用成員

例如:

typedef struct packed { logic a; logic b } struct_t; 
struct_t my_struct; 

logic [1:0] foo; 
assign bar = struct_t'(foo).a; 

^^^^^這顯然是不允許的!爲什麼?

+0

很高興看到我不是唯一一個發現這種煩人的人!我對comp.lang.verilog提出了幾乎完全相同的問題(甚至使用了單詞**醜陋**!) - 請參閱[在轉換後訪問結構成員](http://www.edaboard.co.uk/accessing -a-結構構件-後-A-鑄t519016.html)。 – Chiggs

+1

看來,標準委員會仍在討論這樣的事情:http://www.eda.org/svdb/view.php?id=2735 – nguthrie

回答

2

根據規範,這看起來不像有效的語法。我敢肯定成員訪問權限只允許在標識符上,而不是任意的表達式。

+0

好吧,海事組織這將是非常有用的。例如,在我感興趣的情況下,我定義了一個打包結構,這是一種定義(軟件可訪問)寄存器中值的字段的方法。所以寄存器本身只是64位向量,但是在向量和每個寄存器的結構定義之間來回轉換很有用。但這是不允許的! – ThePopMachine

+0

所以它顯然是一個疏忽。 @ Adam12,你說成員訪問不允許任意表達式。那麼,我聲稱這不是一個任意的表達。它是一個類型轉換。 – ThePopMachine

3

我同意這樣做很好,但在語言中不允許。 SystemVerilog LRM(IEEE 1800-2009)在23.7節解釋了這一點。

分層名稱和部件選擇成結構,聯合類或覆蓋組對象份額由句點分隔名稱組件的序列的相同 語法形式。這些名稱在確定名稱是分層名稱還是成員選擇之前稱爲虛線名稱 。分層名稱的區別 方面是該名稱的第一個組件必須與作用域名稱匹配,而成員選擇的第一個名稱組件必須與變量名稱匹配。使用的一般方法是嘗試 立即解析名字組件,並使用該解析的結果嘗試確定 如何處理整體名稱。

由於您有struct_t'(foo)而不是變量名稱,因此不會將.a視爲成員選擇。

同樣,你不能訪問類似於C++中的函數調用返回的類或結構的成員。

function struct_t getStruct(); 
    // do something 
endfunction 

logic a; 
a = getStruct().a; // <= Not allowed 
+0

@dwinkle:是的,很好的答案。那麼,國際海事組織,他們應該明確補充說。我想通過說我的例子明確地從當地情境中明確定義爲另一種說foo的方式來證明這一點。 但是這讓我意識到「.a只是另一種說法[1]不能證明任何理由,因爲」(x + y)[1]「或者甚至只是」(foo)[1]「都是不允許的或者 – ThePopMachine

+0

@dwinkle:....我仍然聲稱一個類型轉換不同於任意表達式,但是如果我有可能的話,成員訪問和部分選擇對於任意表達式也是有效的,我可能是錯誤的,但是首先想到的是,這種東西在C,C++,Python和Perl等中是有效的。 – ThePopMachine