2014-02-19 51 views
1

我試圖實現一個路由器。在合成和非合成模塊之間傳遞一個類作爲數據 - SystemVerilog

在測試臺中,我使用一個Class來表示SystemVerilog中的一個包,它包含整型變量和一些例程。

現在我試圖將一個數據包對象轉換爲邏輯向量。

我試過使用靜態和動態鑄造,它沒有工作。

我也嘗試將數據包數據轉換爲結構,然後將結構轉換爲邏輯向量,但是當我需要將向量轉換回結構時,它失敗了。

這是臨時的結構:

typedef struct { 
    integer data; 
    integer address; 
    integer source; 
    integer counter; 
    integer failure; 
} Packed_packet; 

這是我想要做的轉換:

logic [$bits(Packed_packet)-1:0] i; 
Packed_packet packet1; 
Packed_packet packet2; 

assign i = packet1; 
assign packet2 = i;//fails 

你能幫助我處理這件事?

回答

2

您應該看看流操作符以將類的成員轉換爲整型變量(pack)和返回(unpack)。假設P具有手柄用的相同部件名稱作爲你的結構類對象:

i = {>>{p.data,p.address,p.source,p.counter,p.failure}}; //pack 
{>>{p.data,p.address,p.source,p.counter,p.failure}} = i; //unpack 

,你應該表現出已經失敗在兩個方向上的代碼。如果沒有強制轉換,您無法在打包和解壓縮類型之間進行分配。

typedef logic [$bits(Packed_packet)-1:0] temp_t; 
temp_t i; 
Packed_packet packet1; 
Packed_packet packet2; 

assign i = temp_t'(packet1); 
assign packet2 = Packed_packet'(i); 
+0

我想你的意思 (typedef的** **邏輯[$位(Packed_pa​​cket)-1:0] temp_t;) 它仍然沒有奏效雖然 我收到以下消息: __結構分配/取消分配不受結構支持。請考慮使用強制/釋放代替.__ 這與我以前得到的編譯錯誤基本相同... 有什麼建議嗎? – DirtyBit

+0

已嘗試__i = {>> {p.data,p.address,p.source,p.counter,p.failure}}; __和它的工作非常感謝你:) – DirtyBit

+1

是的。我在我的例子中加入了'logic'。 「不支持」消息通常意味着代碼是正確的,但是你的模擬器尚未實現該功能。 –

0

你或許應該使用一個packed struct做你想要什麼。這將打包所有的位一起作爲一個整體式(見standard 7.2.1節):

typedef struct packed { 
    integer data; 
    integer address; 
    integer source; 
    integer counter; 
    integer failure; 
} Packed_packet; 

你的問題的標題意味着要傳遞的數據在數據包中合成的邏輯。邏輯真的期望5個整數,還是每個數據包的塊都有不同的比特長度?如果是這樣,那麼一起打包5個整數將不會做你想要的。我猜你想是這樣的:

typedef struct packed { 
    bit [15:0] data; 
    bit [15:0] address; 
    bit [3:0] source; 
    bit [3:0] counter; 
    bit failure; 
} Packed_packet; 
相關問題