在module /chip 中要访问寄存器,就要用到ral model ,对寄存器的测试包含哪些内容呢?
- 检测register复位值是否正确
- 检测寄存器的类型是否和ralf file中规定的一致 (RO/WR/W1C...)
- bit cross test(检测同一register 和不同register的bit之间是否有粘连
生成ral model
ralgen -uvm -l sv -t <tb_name> -o <ral_model_name> <ralf_all_file_name>.ralf
如果需要generate出backdoor Access的代碼,需要加-b這個option,如果需要收Coverage,需要添加-c baF這個option。上面的command中,<ralf_all_file_name>.ralf為input文件,是需要驗的所有RALF檔案構成的一個文件,格式如下:
source ./module_1_name.ralf
source ./moduel_2_name.ralf
system ralf_name {
bytes 4;
block module_1_name_reg_blk = module_1_name_reg_blk @ 'h25CB0000;
block module_2_name_reg_blk = module_2_name_reg_blk @ 'h25CC0000;
}
1. 拿到ralf 中所有reg
uvm_reg_map maps[$];
uvm_reg_map map[$];
uvm_reg regs[$];
uvm_reg_field fields[$];
uvm_reg single_reg;
maps.delete();
model.get_maps(maps);
foreach(maps[j])begin
maps[j].get_registers(regs);
end
foreach(regs[ii])begin
regs[ii].get_maps(map);
regs[ii].get_fields(fields);
end
检测register的类型:
RO:
- 拿到field的期望值保存
- 把期望值取反写入该field
- check 值是否改变
RW:
- 拿到field的期望值保存
- 把期望值取反写入该field
- 读该register check 值是否改变
- 重复step2-3
RC:(读之后就会清零该寄存器, W0/W1无影响)
1. front door to write all 0 value into this field
2. front door to read, expect read back default from this field 证明W0无影响
3. front door to read again, expect read back all 0 from this field 证明R会清零(前提是default value不是全0)
4. front door to write all 1 value into this field -> W1
5.front door to read, expect read back all 0 证明上面W1无影响
上面步骤有个问题:如果default就是0,那么不清楚是否是R清零的,所以需要后门写1进去
6.back door to write all 1 value into this field 后门写入1
7.back door to read all 1 value into this field 确认一下后门是否写入
8.front door to write all 0 value into this field W0
9.front door to read back , 证明W0无影响 (W1上面有了)
10.front door to read again, 证明R会清零
W1C(写1清零,写0无影响,读无影响)
1. front door to write all 1
2. front door to read -> 证明写1会清零
上面不完善,如果rst值就是0,那么没办法判断是写清零还是初始为0所以需要后门操作
3. back door to write all 1 value
4. front door to read all 1
5.front door to read all 1 value 证明没有RC
6.front door to write all 0
7.front door to read all 1 证明写0无影响
8.front door to write all 1
9.front door to read all 0 证明写1会清零
bit cross test
对以下序列进行读写(采用二分法进行check)
1111_1111_0000_0000 //可以判断对前8bit写0/1会不会影响后8bit
0000_0000_1111_1111
1111_0000_1111_0000
0000_1111_0000_1111
1100_1100_1100_1100
0011_0011_0011_0011
1010_1010_1010_1010
0101_0101_0101_0101
这种方法,对于第6个bit写1同时误把第11个bit写0验证不到;但在前一个测试类型中,已经有过全写入ffff和0000了。
检测相邻register是否有粘连
将所有的reg存在一个数组中,Shuffle :相邻的reg并不是地址上相邻的,增加随机性
Order=1:读写操作完一个reg后,再读写操作下一个,看看上面读写操作有没有改变下面这个的值
Order=0:先下后上。