Fields
ralgen不會生成field的抽象類。
每個field對應一個uvm_ral_field類的實例漱挚。
這個類的實例(對象)在它所屬的register和這個register所屬的block里
filed類的實例存儲在對filed類進行例化的reg類和對這個reg進行例化的block類的屬性中。
Registers
對每個定義的reg生成一個抽象類:
- 名稱為regnam的reg是獨立定義的饲齐,對應一個類ral_reg_regnam
- 名稱為regnam的reg定義在一個名稱為blknam的block中愈捅,對應一個類ral_reg_blknam_regnam
- 名稱為regnam的reg定義在一個名稱為blknam的block中的名稱為filnam的regfile中损同,對應一個類ral_reg_blknam_filnam_regnam
如果一個register里包含field數組翩腐,則在這個register對應的類里聲明這個field的數組。
register r {
bytes 1;
field f[8] {
bits 1;
}
}
對應ral
class ral_reg_b_r extends uvm_ral_reg;
rand uvm_reg_field f[8];
...
endclass: ral_reg_b_r
Register Files
對每個register file定義生成一個抽象類膏燃。
- 名稱為filnam的register file定義在一個名稱為blknam的block中茂卦,對應一個類ral_regfile_blknam_filnam
block dma_ctrl {
regfile chan {
register src {
field addr { ... }
}
register dst {
field addr { ... }
}
register count {
field n_bytes { ... }
}
register ctrl {
field TXE { ... }
field BSY { ... }
}
}
}
對應ral
class ral_regfile_dma_ctrl_chan;
ral_reg_dma_ctrl_chan_src src;
uvm_reg_field src_addr;
ral_reg_dma_ctrl_chan_dst dst;
uvm_reg_field dst_addr;
ral_reg_dma_ctrl_chan_count count;
uvm_reg_field n_bytes, count_n_bytes;
uvm_reg_field TXE, ctrl_TXE;
uvm_reg_field BSY, ctrl_BSY;
...
endclass: ral_reg_dma_ctrl_chan
regfiles類的實例在包含這個regfile的block類中。
virtual Registers
virtual register是fields的集合组哩,一般是隊列的形式等龙,跟memory關聯处渣。
對每個定義的virtual register生成一個抽象類(擴展自uvm_vreg):
- 名稱為vregnam的vreg隊列是獨立定義的,對應一個類ral_vreg_vregnam
- 名稱為vregnam的vreg隊列定義在一個名稱為blknam的block中蛛砰,對應一個類ral_vreg_blknam_vregnam
block blk1 {
memory ram0 { ... }
virtual register dma[256] ram0@0x0000 {
field len { ... }
field bfrptr { ... }
field ok { ... }
}
}
對應ral
class ral_vreg_blk1_dma extends uvm_ral_vreg;
uvm_vreg_field len;
uvm_vreg_field bfrptr;
uvm_vreg_field ok;
...
endclass: ral_vreg_blk1_dma
class ral_block_blk1 extends uvm_reg_block;
uvm_mem ram0;
ral_vreg_blk1_dma dma;
...
endclass: ral_block_blk1
注意ralf文件里virtual register中的field對應ral文件中的uvm_vreg_field
而且在block中實例化virtual register罐栈,只例化一個實例,而不是一個實例的隊列泥畅,參考上面例子中的virtual register dma[256] 在ral文件中的ral_block_blk1類中的聲明荠诬。這與register中的field隊列不一樣。ralf文件中的隊列大小位仁,在vreg調用configure()的第三個參數體現
Memories
對每個定義的memory生成一個抽象類(擴展自uvm_mem):
- 名稱為memnam的memory是獨立定義的柑贞,對應一個類ral_mem_memnam
- 名稱為memnam的memory定義在一個名稱為blknam的block中,對應一個類ral_mem_blknam_memnam
Blocks
對每個定義的block生成一個抽象類(擴展自uvm_reg_block):
- 名稱為blknam的block是獨立定義的聂抢,對應一個類ral_block_blknam
- 名稱為blknam的block定義在一個名稱為sysnam的system中钧嘶,對應一個類ral_block_sysnam_blknam
前面的例子可以看到,block類里會包含每個register和register file琳疏,reg和regfile的名字跟ralf中的名字一樣有决;block類里還會包含每個field,會有一個這個field的名字(如果field的名字唯一轿亮,如果不唯一疮薇,沒有這個同名的field,只有一個連接的名字)和一個連接的名字(register名字_field名字)的field類聲明我注。
隊列
如果一個block里包含了register隊列或者regfile隊列按咒,在block類例化的register,regfile也是同樣大小的隊列但骨,register里的field也會在block里包含為一個隊列励七,如果register里的field也是一個隊列,則block中對應的field是一個二維隊列奔缠。
block comp1 {
bytes 4;
register regA[10] @0x00 {
field data[4] { bits 8; }
}
...
}
對應ral文件
class ral_reg_comp1_regA extends uvm_reg;
rand uvm_reg_field data[4];
endclass
class ral_block_comp1 extends uvm_reg_block;
rand ral_reg_comp1_regA regA[10];
...
rand uvm_reg_filed regA_data[10][4];
...
endclass
Systems
對每個定義的system生成一個抽象類(擴展自uvm_reg_block):
- 名稱為sysnam的system是獨立定義的掠抬,對應一個類ral_sys_sysnam
- 名稱為subnam的system定義在一個名稱為sysnam的system中,對應一個類ral_sys_sysnam_subnam