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