systemverilog soft constraint
1、uvm object 使用config_db。
<1>. uvm_object中通过config_db get得到变量
class my_config extends uvm_object;
`uvm_object_utils(my_config)
virtual my_if vif;
function new(string name = "my_config");
super.new(name);
$display("%s", get_full_name());
if(!uvm_config_db#(virtual my_if)::get(null, get_full_name(), "vif", vif))
`uvm_fatal("my_config", "please set interface")
//在get函数原型中,第一个参数必须是一个component,所以这里不能使用this指针,只能使用null或者uvm_root //通过名字get_full_name()得到,即其实例化时指定的名字
//使用null时,UVM会自动将其替换为uvm_root::get(),再加上第二个参数get_full_name() ,就可以完整地得到此object的路径
endfunction
endclass function void base_test::build_phase(uvm_phase phase);
…
cfg = new("cfg");
endfunction module top_tb;
…
initial begin
uvm_config_db#(virtual my_if)::set(null, "cfg", "vif", input_if);
end
//所以,base_test中实例化cfg的名字要与top_tb中config_db::set的路径参数一致。
<2>. uvm_object中通过config_db set变量
class case0_sequence extends uvm_sequence #(my_transaction);
…
virtual task pre_body();
if(uvm_config_db#(int)::get(null, get_full_name(), "count", count))
`uvm_info("seq0", $sformatf("get count value %0d via config_db", count), UVM_MEDIUM)
else
`uvm_error("seq0", "can't get count value!")
#;
uvm_config_db#(bit)::set(uvm_root::get(), "uvm_test_top.env0.scb","cmp_en", );
//可以set 到uvm_component中。
...
void'(uvm_config_db#(bit)::get(uvm_root::get(), get_full_name(), "first_start", first_start)
if(first_start)
`uvm_info("drv0_seq", "this is the first start of the sequence", UVM_MEDIUM)
else
`uvm_info("drv0_seq", "this is not the first start of the sequence",UVM_MEDIUM)
uvm_config_db#(bit)::set(uvm_root::get(), "uvm_test_top.v_sqr.*", "first_start", 0);
//这个sequence向自己传递了一个参数:first_start。在一次仿真中,当此sequence第一次启动时,其first_start值为1;
//当后面再次启动时,其first_start为0。根据first_start值的不同,可以在body中有不同的行为。
//由于此sequence在virtual sequence中被启动,所以其get_full_name的结果应该是uvm_test_top.v_sqr.*,而不
是uvm_test_top.env0.i_agt.sqr.*
endtask
…
endclass
2、uvm_config_db的方法:
<1> set()方法:所有静态函数和方法在使用时,called using域操作符::
set 方法设置为静态函数,才实现了set的变量全局可见。
static function void set ( uvm_component cntxt,
string inst_name,
string field_name,
T value); virtual function void build_phase (uvm_phase phase);
...
uvm_config_db #(int) :: set (null, "uvm_test_top.m_env.m_apb_agent", "cov_enable", );
...
endfunction
// Set virtual interface handle under name "apb_vif" available to all components below uvm_test_top, indicated by the *
uvm_config_db #(virtual apb_if) :: set (null, "uvm_test_top.*", "apb_vif", apb_if); // Set an int variable to turn on coverage collection for all components under m_apb_agent
uvm_config_db #(int) :: set (null, "uvm_test_top.m_env.m_apb_agent.*", "cov_enable", ); // Consider you are in agent's build_phase then you may achieve the same effect by
uvm_config_db #(int) :: set (this, "*", "cov_enable", );
<2> get 方法设置为静态函数,才实现了get变量全局可见。
static function bit get ( uvm_component cntxt,
string inst_name,
string field_name,
inout T value); // Get virtual interface handle under name "apb_vif" into local virtual interface handle at m_env level
uvm_config_db #(virtual apb_if) :: get (this, "*", "apb_vif", apb_if); // Get int variable fails because no int variable found in given scope
uvm_config_db #(int) :: get (null, "uvm_test_top", "cov_enable", cov_var);
<3> exists() 检查 field_name 在inst_name中是否存在,存在返回1,不存在则返回0
static function bit exists ( uvm_component cntxt,
string inst_name,
string field_name,
bit spell_chk);
// Check if interface handle exists at the given scope
if (! uvm_config_db #(virtual apb_if) :: exists (this, "*", "apb_vif"))
`uvm_error ("VIF", "Could not find an interface handle", UVM_MEDIUM)
<4>. wait_modified()
block 直到要get的变量有改动
static task wait_modified ( uvm_component cntxt,
string inst_name,
string field_name); class my_agent extends uvm_agent; virtual task run_phase (uvm_phase phase);
...
// Waits until loopCount variable gets a new value
uvm_config_db #(int) :: wait_modified (this, "", "loopCount");
endtask
endclass class my_env extends uvm_env; my_agent m_apb_agent; virtual task main_phase (uvm_phase phase);
...
// Update loopCount variable in database
for (int i = ; i < N; i++) begin
...
uvm_config_db #(int) :: set (this, "m_apb_agent", "loopCount", i);
end
endtask
endclass
<5>. typedef 定义的一些宏
typedef uvm_config_db #(uvm_bitstream_t) uvm_config_int;
typedef uvm_config_db #(string) uvm_config_string;
typedef uvm_config_db #(uvm_object) uvm_config_object;
typedef uvm_config_db #(uvm_object_wrappet) uvm_config_wrapper;
systemverilog soft constraint的更多相关文章
- SV randomize
randomize中的变量只支持2-state的values,不支持4-states. randc类型的变量不能被约束在solve------before的语句中. constraint可以被定义在c ...
- 【DeepLearning】一些资料
记录下,有空研究. http://nlp.stanford.edu/projects/DeepLearningInNaturalLanguageProcessing.shtml http://nlp. ...
- systemverilog中奇怪的语法
1.->运算符 expression_a->expression_b其实等效于(!expression_a || expression_b),systemverilog中利用 || 运算的 ...
- systemverilog.vim
" Vim syntax file " Language: SystemVerilog " Maintainer: Stephen Hobbs <stephenh@ ...
- systemverilog的高亮显示
1. 在_vimrc文件末尾添加: syntax on "确定vim打开语法高亮 filetype on "打开文件类型检测 filetype plugin on "为特 ...
- systemverilog FAQ(zz)
1. What is clocking block? Ans: Clocking block can be declared using the keywords clocking and endcl ...
- systemverilog(3)之Randomize
what to randomize? (1) primary input data <==one data (2)encapsulated input data <== muti grou ...
- [转载]转一篇Systemverilog的一个牛人总结
原文地址:转一篇Systemverilog的一个牛人总结作者:dreamylife Systemverilog 数据类型 l 合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没 ...
- SystemVerilog基本语法总结(上)
SystemVerilog基本语法总结(上) 在总结SV的语法之前,先分享一些关于SV的笔试题目,这样更显得具有针对性的总结. a. 验证中,代码覆盖率是指(衡量哪些设计代码在激活触发,而哪一些则一直 ...
随机推荐
- Go语言操作MySQL数据库
Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...
- 安卓版的pvr图片查看
public class PVRTDecompress { /* author:FormatFa mail :1758759399@qq.com date :2017-6-14 */ //modify ...
- uniapp仿h5+fire自定义事件触发监听
仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ...
- linux命令及用法
- java9 Local-variable type inference
var ls = Arrays.asList("1","2"); System.out.println(ls);
- AET 本征半导体
本征半导体就是纯净的半导体,不掺杂质的半导体 note:(1)本征半导体中载流子数目极少,其导电性能很差:(2)温度愈高,载流子数目越多,半导体的性能也就越好. 杂质半导体 对于4价半导体,可惨杂3价 ...
- command not found所有执行命令总是报找不到
输入 ll命令 提示: bash: ls: 未找到命令… 相似命令是: 'lz' 原因: 环境变量PATH被修改了 解决办法: 执行: export PATH=/bin:/usr/bin:$PATH ...
- one-hot编码理解
one-hot是比较常用的文本特征特征提取的方法. one-hot编码,又称“独热编码”.其实就是用N位状态寄存器编码N个状态,每个状态都有独立的寄存器位,且这些寄存器位中只有一位有效,说白了就是只能 ...
- [DOM]初识DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...
- C# ADO.NET中设置Like模糊查询的参数
ADO.NET进行参数化时会自动将参数值包含在单引号中,除了特殊需求,最好不要自己手动添加单引号.ADO.NET中识别参数标识是使用符号@,如果在SQL语句中将参数标识放在单引号中,单引号中的参数标识 ...