2014-03-05 77 views
2

枚舉我有一個接口:系統的Verilog:內部接口

interface my_intf(); 
typedef enum logic [1:0] { 
    VAL_0 = 2'b00, 
    VAL_1 = 2'b01, 
    VAL_2 = 2'b10, 
    VAL_3 = 2'b11 
} T_VAL; 
T_VAL val; 
endinterface 

我的模塊使用這個接口:

my_intf intf; 

的問題是從enum值分配val

我可以將其指定爲:

intf.val = 0;(和接收警告或錯誤)

但不如:

intf.val=VAL_0;

也不如

intf.val = my_intf.T_VAL.VAL_0

我如何克服這個問題?

+0

爲了便於記錄,只有在模塊使用的modport列表中包含「val」時,最後的語法才能與Vivado配合使用。 – ted

回答

2

我只處理過包含枚舉的包,並避免了接口。這是我使用包的方式。模塊定義之前導入的包要使用它:

import my_intf_pkg::* ; 

module bla(
    output my_val_t intf 
); 

    initial begin 
    intf = VAL_0 ; 
    end 

endmodule 

含枚舉可能看起來像包:

package my_intf_pkg; 
    typedef enum logic [1:0] { 
    VAL_0 = 2'b00, 
    VAL_1 = 2'b01, 
    VAL_2 = 2'b10, 
    VAL_3 = 2'b11 
    } my_val_t; 
endpackage : my_intf_pkg 

注意,VAL_0等是全球性的,而不是綁在T_VAL的typedef。因此,我經常讓它們更獨特,包括名稱中的typedef。 T_VAL_0 for T_VAL typedefs等

Here is an example on EDAplayground

+0

「my_intf.sv」存在細化錯誤:類型名稱'T_VAL'未知。 – Michael

+0

嘗試在界面中使用它: 'interface my_intf(); 的typedef枚舉邏輯[1:0] { VAL_0 = 2'b00, VAL_1 = 2'b01, VAL_2 = 2'b10, VAL_3 =爲2'b11 } T_VAL; T_VAL val; endinterface' – Michael

+0

嘗試在界面外定義枚舉,就像我爲模塊完成的一樣,然後導入它。 – Morgan

0

intf.val = 0;應該是一個錯誤,因爲您試圖將一個整型分配給一個沒有轉換的枚舉。

intf.val = VAL_0;是一個錯誤,因爲VAL_0沒有在當前範圍中定義。

你應該能夠做到

intf.val = intf.VAL_0; 

然而,最好的解決方案,把共享類型的封裝,其中進口所需的軟件包。

+0

'intf.val = intf.VAL_0;'不工作 - vcs不支持它。 – Michael

+0

@Michael一定要向Synopsys提出一個案例! – Chiggs

+0

他們已經知道了。 – Michael