SyetemVerilog Function coverage练习
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SyetemVerilog Function coverage练习,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3231字,纯文字阅读大概需要5分钟。
内容图文
正好在学习func_coverage,读到大佬的两个blog,学习一下。
参考:
https://www.amiq.com/consulting/2015/09/18/functional-coverage-patterns-bitwise-coverage/
汇总
这里列出了所有的patterns,可以先自己尝试一下。
- bit toggle coverage: 一个位宽为WIDTH的数,覆盖每个bit都toggle过0和1, 进一步,覆盖过0=>1 和1=>0
- onehot coverage: 一个位宽为WIDTH的数,覆盖所有onehot值
- power-of-two coverage: 一个位宽为WIDTH的数,所有power-of-two状态,例如:4‘bit的数: 只关心:4’b0000, 4’b001?, 4’b01??, 4’b1???,其中?表示0/1/x/z任意值。
- duty cycle coverage: 一个位宽为WIDTH的数,出现1的数量的统计。
- Consecutive Bit Coverage: 对于一个单bit的序列,需要cover有多少个连续的1的场景
具体代码
bit toggle coverage
一个位宽为WIDTH的数,覆盖每个bit都toggle过0和1.
bit[WIDTH-1:0] data;
covergroup bit_toggle(int width) with function sample(int idx, bit value);
idx_toogle0: coverpoint idx iff(value == 1'b0){
bins index[] = {[0:width-1]};
}
idx_toogle1: coverpoint idx iff(value == 1'b1){
bins index[] = {[0:width-1]};
}
endgroup
bit_toggle = new(`WIDTH);
for(int i=0;i<`WIDTH;i++) begin
bit_toggle.sample(i,data[i]);
end
进一步覆盖每个bit从0=>1,1=>0的场景,
可以利用辅助的变量,bit bit_tg : 0=>1: bit_tg=1, 1=>0 bit_tg=0;
onehot coverage
一个位宽为WIDTH的数,cover所有onehot的值
logic[WIDTH-1:0] encoding[WIDTH] ;
logic[WIDTH-1:0] data;
covergroup onehot_cg(int width);
onehot_cp: covergroup data{
bins onehot[width] = encoding; //这里onehot的每个子bins中都是有效的场景<6'b1><6'b10><6'b100> ... <6'b10_0000>
}
endgroup
foreach(encoding[i]) encoding[i] = 1<<i; //encoding构造onehot数组 //需要在covergroup new之前定义好数组场景
onhot_cg = new(WIDTH);
blog中提供了另一种方法。
power-of-two coverage
一个位宽为WIDTH的数,所有power-of-two状态,例如:4‘bit的数: 只关心:4’b0000, 4’b001?, 4’b01??, 4’b1???,其中?表示0/1/x/z任意值。
bit[WIDTH-1:0] data;
covergroup power_of_two_cg(int width) with function sample(int idx , bit[WIDTH-1:0] value);
//关键是mask如何计算
coverpoint idx iff(value[idx]==1 &&((value & ({WIDTH{1'b1}} << idx+1 )) == {WIDTH{1'b0}})){
bins all[] = {[0:WIDTH-1]};
}
endgroup
duty cycle coverage
duty_cycle 是指一个单bit序列(或者是一个多bit的数),中信号是active的状态,等价: 一个多bit的数中1的数量。 对于需要parity check的数据,可以去收集这个点。
可以直接使用$countones 来进行计算。但注意一个很长的单bit序列的需要分段计算。
bit[WIDTH-1:0] data;
covergroup duty_cycle_cg(int width) with function sample(int num);
coverpoint num{
bins all[] = {[0:width]};
}
endgroup
duty_cycle_cg = new(WIDTH);
duty_ctcle_cg.sample($countones(data));
Consecutive Bit Coverage
一个单bit的序列(或者多bit的数),可能需要关心有这个序列连续多少个1。
bit[WIDTH-1:0] data;
covergroup consecutive_bit_cg(int width) with function sample(int num);
coverpoint num {
bins [] = {[0:width]};
}
endgroup
function sample_consecutive_bit;
int count;
int count_q[$];
if(data == 0 || data == {WIDTH{1'b1}}) begin
consecutive_bit_cg.sample(((data==0)? 0 :WIDTH));
return;
end
for(int i=0; i<=WIDTH; i++) begin
count += data[i];
if(data[i]==0 || i== WIDTH-1 && count != 0) begin
count_q.push_back(count);
end
end
foreach(count_q[i])
consecutive_bit_cg.sample(count_q[i]);
endfunction
附赠链接
对于counter的 function coverage
https://www.amiq.com/consulting/2016/11/11/functional-coverage-patterns-the-counter/
内容总结
以上是互联网集市为您收集整理的SyetemVerilog Function coverage练习全部内容,希望文章能够帮你解决SyetemVerilog Function coverage练习所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。