constraint的一些问题记录. 过程记录, 持续更新......

  • 概率的约束

需要约束在某些值的概率大一些,其他值的概率小一些,可以使用以下方法

constraint xxx::yyy_cons{(aaa inside {bbb_q}) dist {1:/1, 0:/2}; //约束aaa在某些值,比如bbb_q中的值时,概率大一些{(aaa == bbb),(ccc == ddd)} dist {[2'b00:2'b10]:/1, 2'b11:/1}; //约束aaa==bbb,ccc==ddd两个条件都满足时的概率大一些(aaa < 0) dist {1:/2, 0:/1};  //aaa为有符号数,约束aaa为负数的概率大一些(aaa) inside {['1-2:'1]}; //注意,如果$bits(aaa)>=32时,没有问题,否则解约束失败,因为此等效于 (aaa) inside {[32'hFFFFFFFF-32'h2:'1]} , 正确写法为 (aaa) inside {['1-2'h2:'1]}; sv表达式原则中有讲此部分内容
}
  • soft constraints
class c1;
bit[63:0] a;
bit[63:0] b;
constraint cons1{soft a == 0;foreach(b[i]) soft b[i] == 0;
}
endclassmodule test;initial beginc1 c = new();c.randomize() with {a[0] == 1; b[0] == 1;};end
endmodule

此例中,随机完后,a = 随机值(a[0]=1); b = 1;

  • 符号数的约束
要求:exp2 > 0时,exp2 < exp3 - exp1; exp2 < 0时, abs(exp2) <= exp1;//可以参照以下的做法
bit[15:0] exp1, exp3;
bit (signed) [31:0] exp2;
constraint c1 {exp1 + exp2 < exp3;if(exp2[31]) exp2[31:15] == '1;else exp2[31:15] == '0;
}

sv中取绝对值的做法

1. $abs(); //可以接受real类型和int类型的变量

可以对其他数据类型进行一定转换来使用

$abs(int'($signed(in)))

2. 针对任意位宽整型变量,可以定义宏进行处理

`define _abs(in)
(((in) >> ($bits(in) - 1)) ? (~(in) + 1) & (1 << $bits(in) - 1) : (in))//使用举例
bit[34:0] flag;
`_abs(flag)bit[89:0] sel;
`_abs({sel,flag})

排列组合的约束

要求:

x1-x5均为有符号数, 作为偏移;

a为基数, 为无符号数;

要求a和任意组合的偏移相加必须在[c:d]范围内;

代码示意:

bit f[2]; //使用其index作为"有无"系数进行此项的处理
bit f1[32];  //一共32种排列组合constraint c {foreach(f[f5]) foreach(f[f4]) foreach(f[f3]) foreach(f[f2]) foreach(f[f1]) a + f1*x1 + f2*x2 + f3*x3 + f4*x4 + f5*x5 + 64'h0 inside {[c:d]};
}constraint c1 {foreach(f1[f])a + f[0]*x1 + f[1]*x2 + f[2]*x3 + f[3]*x4 + f[4]*x5 + 64'h0 inside {[c:d]};
}
  • 注意约束中的优先级
//比如,a = sel ? b : c;//约束中,需要注意添加括号constraint {a == (sel ? b : c);
}
  • sv系统函数的运用

$bits,$countones

用法1: 判断一个数是否进行了符号位扩展

bit[63:0] a;

int b;

$countones(a >> $bits(b)) ==  $bits(a)-$bits(b)

用法2: 进行符号位扩展

`define sign_extend(in,out) \

if(in >> ($bits(in)-1)) { \

out == {{($bits(out)-$bits(in)){1'b1}},in}; \

} else { \

out == in; \

}

  • 约束中solve...before...的运用

当有多个变量时,可以使用如下写法,减少一些代码量

solve A,B before C,D

当代码中写成环时,比如:

solve A before B

......

solve B before A

仿真时会报warning:

Warning-[...] cyclic ordering warning

...

  • 注意变量位宽

bit[7:0] mul,a,b,c;

constraint {

mul == a*b*c;

}

那么,a,b,c可能随机出非常大的值,因为此约束的意思是mul==(a*b*c) & 8'hff;

需要得到想要的结果,那么借助sv数据类型相关的规则,可以采用如下办法,

1.mul == a*b*c + 24'h0

2.mul == 24'(a*b*c)

  • $urandom和$random

$urandom: 根据仿真seed的不同随机不同的值; 但在module中,无论module例化多少次,随机值都是一样的。

$random: 不会根据仿真seed的不同随机不同的值;但在module中,module的不同例化,随机值都是不一样的。

另外,返回值是32bit数据,如果给超过32bit的数进行赋值时,需要注意.

【sv】constraint相关推荐

  1. 用友U9【SV】服务

    1:将UFIDA.U9.Cust.ZhaoDi.CreateItemTransferSV.ICreateItemTransferSV 文件拷贝至portal的services下面: 2:添加附件con ...

  2. 【SV】SystemVerilog语法总结 3.0

    覆盖率 RTL代码覆盖率衡量测试案例验证覆盖了哪些设计规格在RTL中实现了,而不能衡量验证计划行(Line Coverage):RTL中的代码行有限状态机(FSM Coverage):RTL代码中的有 ...

  3. 【sv】复制/拼接操作符

    concatenation replication 拼接字符串{} file_name = {getenv("PROJECT_HOME"),"/src/top_xxx_t ...

  4. 【sv】打印格式控制

    2.7 Assignment pattern format %p or %P 格式说明符可用于打印聚合表达式,例如解压缩结构,数组和联合(unpacked structure,array,unions ...

  5. 【SV】 $sformat和$formatf的用法

    目录 1.基本使用方法 2.巧妙的使用方法 1.基本使用方法 首先查看一下这两个函数什么含义.看下这段代码: string inside_string; string outside_string; ...

  6. 【论文】解读Robust bike-sharing stations allocation and path network design: a two-stage stochastic...

    解读Robust bike-sharing stations allocation and path network design: a two-stage stochastic programmin ...

  7. Verilog:【4】脉冲发生器(pulse_gen.sv)

    碎碎念: 明明是周四,这周竟然不开组会_(:з)∠)_ 那我可以继续愉快地学习人家的代码了,这篇博客介绍的是脉冲发生器,脉冲和Killer Queen是不是很配呢hhh 目录 1 模块功能 2 模块代 ...

  8. 【总结】alter table *** add constraint *** 用法 . 建立约束 ,主键、外键的SQL语句写法

    [总结]alter table *** add constraint *** 用法 2010年08月26日 星期四 08:31 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 ...

  9. Verilog:【3】边沿检测器(edge_detect.sv)

    碎碎念: 学习新知识的感觉还是比较快乐,下面要介绍的是一个全能的边沿检测器,可以识别上升.下降.以及同时检测两种边沿,不得不说人家的代码写得确实很优雅. 目录 1 模块功能 2 模块代码 3 模块思路 ...

最新文章

  1. 漫谈计算机体系.md
  2. 清华90后校友、MIT助理教授斩获ACM博士论文奖!博士期间曾发表论文20余篇
  3. OpenCV使用Facemark API
  4. 使用Dottrace跟踪代码执行时间
  5. linux出站入站端口维护,linux下如何用iptables开放指定端口_网站服务器运行维护,linux,iptables,端口...
  6. 云小课丨SA基线检查:给云服务来一次全面“体检”
  7. Python实战从入门到精通第二讲——类
  8. k8s kafka集群 连接不上_k8s利用statefulset部署kafka集群(依赖zookeeper)
  9. 网络模型介绍、数据网络传输过程与网络传输速率
  10. PUBG 绝地逃亡 吃鸡压枪宏 彩虹六号压枪宏 Autohotkey
  11. 11000-雷达基本资料
  12. 什么是scrum敏捷项目管理
  13. Android性能优化学习记录(二)稳定性与内存优化
  14. 谷歌中国正式宣布李开复辞去总裁一职
  15. 【地球科学】常用的地理投影坐标系介绍(笔记)
  16. 【uni-app】app与H5进行双向通讯
  17. css3中斜杠_使用斜杠语法设置CSS3边界半径
  18. 【Excel】选择性粘贴
  19. 精通Node.js: 你应该阅读的书籍
  20. 微信编辑器哪个操作最简单?

热门文章

  1. Debug-单步调试
  2. 为什么上班只能养家,不能发家?
  3. HBuilder开发App教程01-推开前端开发App的大门
  4. android webview清理缓存
  5. 作为一个领导,最看重下属什么?
  6. 音视频系列四 ffmpeg配合opensl es播放音频
  7. 阿里大牛分享的三本书豆瓣评分8.5分!让你的架构思维略窥门径
  8. 微信小程序全局生命周期和页面生命周期
  9. linux共享内存原IPCS,共享内存相关(ipcs/ipcrm)
  10. 电脑磁盘通过Bitlocker上锁,为磁盘添加右键上锁菜单功能