2015-10-06 22 views
0

我正在寫一組使用uvm_reg類的註冊模型。單獨的寄存器大小是8位。創建寄存器塊來包含那些寄存器:註冊抽象層差異訪問類型

class my_reg_block extends uvm_reg_block; 
    my_byte_reg reg_00; 
    my_byte_reg reg_01; 
    my_byte_reg reg_10; 
    my_byte_reg reg_11; 
    ... 
    // build() 
    my_map.add_reg(reg_00, 32'h0000 /*offset*/, ""RW"); 
    my_map.add_reg(reg_01, 32'h0001 /*offset*/, ""RW"); 
    my_map.add_reg(reg_10, 32'h0002 /*offset*/, ""RW"); 
    my_map.add_reg(reg_11, 32'h0003 /*offset*/, ""RW"); 
    ... 

我有一個註冊適配器,將讀/寫轉換爲總線事務。 所以,我能夠做到這一點我的序列中:

reg_00.write(status, 'hff, .parent(this)); 

總線事務會做寫入到特定的寄存器:reg_00

我的問題是總線有byte_enable,它允許它在雙字訪問中跨4個寄存器寫入。使用上面的現有寄存器模型,是否可以同時寫入/讀入4個寄存器?還是需要創建另一組寄存器(32位大小)? 這將是這樣的僞代碼:

{reg_11,reg_10,reg_01,reg_00}.write(status, 'hffffffff, .parent(this)); 

什麼建議嗎?

+1

好像你正在尋找突發傳輸。可能[此鏈接](http://stackoverflow.com/questions/23143815/using-burst-read-write-with-register-model)可以幫助。 – sharvil111

回答

0

您可以嘗試在write函數中使用擴展參數將其他信息(如byte_enable)傳遞給適配器。然後,如果這是一個合法的雙字交易並且相應地分配總線交易字段,那麼適配器可以相應地決定。看到序列在下面

virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); 
bus_trans   trans; 
uvm_reg_item   item; 
regtrans_params   params; 


item     = get_item(); 
trans     = bus_trans::type_id::create("trans"); 

if(item.extension == null) 
    `uvm_fatal("", "item.extension==null !!") 
if(!$cast(params, item.extension)) 
    `uvm_fatal("", "FAILED $cast(params, item.extension) !!") 

trans.dst_chip_addr    = params.chip_addr; 

部分例如:

block.reg_00.write(status, 32'hfffffffff .extension(params)); 
+0

此方法適用於我,謝謝。 – AldoT