目录
1 UVM寄存器模型的生成命令
即如何通过 ralf 文件生成生成 ral_model.sv 的命令
ralgen [options] -t topname -I dir -uvm {filename.ralf}
其中:
-t:指定block或者system中顶层模块的名字;
-uvm:指定生成的ral文件用的是UVM验证方法学
-I:指定ralgen搜索源Tcl文件的目录的可选列表
filename.ralf:指定包含ralf描述信息的文件名称.ralf后缀可以不加,但是还是建议加上.
可选参数:
-b:提供完成的hdl_path,可以为register和memory生成后门访问代码;
-B:生成具有字节粒度的ralf模型
-f file_name:指定存储ralf参数的文件
1.1 寄存器模型操作
2 RALF 文件的语法构成
RALF 描述是一个Tcl 8.5文件。因此,可以使用循环和变量等编程构造来快速而简洁地构造大型寄存器集和内存定义。可以使用Tcl source命令来执行多个和分层注册规范管理。此外,还可以使用Tcl表达式来指定寄存器偏移值、基值和寄存器名称。RALF的构造包括几个部分:
-
field
-
register
-
regfile
-
memory
-
virtual register
-
block
-
system
实例:vlan.ralf
register vlan{
bytes 2;
field add {
bits 11;
reset ‘hff;
access rw;
}
field inc {
bits 1;
reset ‘h1;
access rw;
}
}
block vlan_regmodel {
bytes 2;
register vlan_edit @'ha;
}
system vlan_top_regmodel {
bytes 1;
block vlan_regmodel[2] @’hF0000 +’h01000;
}
2.1 field 语法
field 定义了寄存器连续 bit 的最小集合。不同的 field 串联构成寄存器。
field add/inc:域段名字;
bits:指定此域段的位宽;如果未指定,默认为1。此属性只能指定一次。
reset:设置复位值;
access:设置域段的读写属性;
2.2 register 语法
寄存器定义了字段的连接。寄存器用于寄存器文件和寄存器块中。
vlan:寄存器名字
bytes 2:寄存器总位宽,byte为单位,如果所有field位宽之和大于此 bytes 生成 ral 文件时会报错;如果没有添加 bytes,那么系统会自动计算所有 bits 之和,然后找到最小正整数*8>=所有域短之和,例如所有域段是12bit,那么系统会用16bit来存储这个寄存器数据。
left_to_right:默认情况下,字段从寄存器的最低有效位开始连接。如果指定了此属性,字段将从寄存器的最重要部分开始连接,但从最低重要部分对齐。当使用从左到右的规范样式时,第一个字段不能指定位偏移量:第一个字段的偏移量取决于其他字段之间的大小和间距。
2.3 block语法
块定义了一组寄存器和存储器。寄存器被连接成块。一个块可以有多个物理接口。寄存器和内存可以在块内的物理接口之间共享。
vlan_regmodel:block 的名字
bytes 2:设置寄存器位宽;
register:指示block中添加的寄存器名字,@'ha指示此寄存器的地址是a;
2.4 system语法
系统定义由块或子系统组成的设计。一个系统可以用来创建更大的系统。
vlan_top_regmodel :system的名字
2.4.1 模块例化多次
在实际的应用当中,一个moudle可能会被例化多次,只是每个module的基地址不一样而已,它们的空间大小都是一样的,uvm支持这样的操作:
block vlan_regmodel[2] @’hF0000 +’h01000;
@后面跟的第一个地址是 vlan_regmodel 第一个的起始地址,而后面跟的第二个地址是每个module之间的间隔。
3 由ralf生成的 ral_XXX.sv 内容说明
从图中可以看出,寄存器的 class 会在名字前面加上 ral_reg_XXX;
field 名字保持不变;
bytes设置寄存器的数据位宽,在new函数中体现;
field位宽、读写属性、复位值在build函数中体现。
block中支持array类型的寄存器,生成的时候同样会是array类型方便访问,寄存器的地址会以数据位宽宽度递增。
4 相同名字的register在不同block的写法
在设计当中难免会存在不同模块有相同名字的寄存器,如果按照之前的先用register设置寄存器相应的域段,然后再将register添加到block当中的方法,在生成ral文件时会报名字一样的错误.遇到此类错误,可以修改ralf文件的格式,将寄存器的例化和域段的例化都放到block内。