2016-03-17 93 views
0

我想設置一個總線等於一個結構的位,爲一個結構數組(s.t.數組大小==總線大小)。我的結構看上去像verilog設置總線等於結構位數組

typedef struct { 
    //other stuff 
    logic   valid; 
} BFRAME_OUTPUT; 

而且我已經聲明結構的陣列和公交車一樣

BFRAME_OUTPUT    bframe_outs[`BSTACK_SIZE-1:0]; 
    logic [`BSTACK_SIZE-1:0] valid; 

我要像做任何的這些簡單地使有效總線等於有效位爲結構數組。

assign valid[`BSTACK_SIZE-1:0] = bframe_outs[`BSTACK_SIZE-1:0].valid; 
// 
// or 
// 
for(int i = 0; i < `BSTACK_SIZE; ++i) begin 
    assign[i] = bframe_outs[i].valid; 
end 

但是我在嘗試使用VCS模擬時的錯誤:

Error-[XMRE] Cross-module reference resolution error 
/modules/branch_stack.sv, 87 
    Error found while trying to resolve cross-module reference. 
    token 'bframe_outs'. Originating module 'branch_stack'. 
    Source info: assign valid[(16 - 1):0] = bframe_outs[(16 - 1):0].valid; 

回答

2

更重要的是,你還沒有表現出另一個錯誤:

錯誤 - [pSNA的]部分選擇不允許testbench.sv,14部分選擇 不允許在類的數組上使用。源信息:分配有效[(5 - 1):0] = bframe_outs [(5 - 1):0] .valid; 將部件選擇轉換爲 分別指各個元件

由於錯誤指出,您需要將分配轉換爲零件選擇。在這裏,你可以使用兩種方式之一。或者使用logic作爲reg並在always區塊中使用它,或者使用logic作爲wire並執行其他一些操作。

使用它作爲reg時,需要在某個程序塊中提取該值。因此,只需刪除assign聲明並使用alway_comb即可。由於您在此處使用了logic,因此無需更改其數據類型。

always_comb 
    begin 
     for(int i = 0; i < `BSTACK_SIZE; ++i) 
     valid[i] = bframe_outs[i].valid; 
    end 

可選擇地,有一個generate塊執行某些東西多次。請注意,通過使用generate塊,您可以提供連續分配,並使用logic作爲wire。在這裏,您需要分別向wire提供每個bit信號。在這裏,使用generate如下:

genvar i; 
    generate 
    for(i = 0; i < `BSTACK_SIZE; ++i) begin 
     assign valid[i] = bframe_outs[i].valid; 
    end 
    endgenerate 

請參考結構SystemVerilog IEEE 1800-2012 7.2節和這個鏈接generate blocks。我在EDAPlayground鏈接創建了一個工作示例。

+0

很好的解釋..! –

+0

順便說一句,在SystemVerilog中'Always_comb'優於'always @ *'以處理常量傳播邏輯 –

+0

是的,由於零時間執行保證和其他一些差異,'always_comb'更可取。感謝指針@ dave_59。 – sharvil111