codeblock快捷键+VS code快捷键+DW_minmax文件+莱文斯坦距离+char* 和 char[]区别+可增删constraint的实现方法+$fatal的传参+巴科斯范式命令行语法+ralgen生成的寄存器模型存在覆盖率的警告(uvm-1.2)

发布时间 2023-12-23 19:19:13作者: 大浪淘沙、

codeblock快捷键

ctrl+G 跳转。
ctlr+J 生成补全。
cygwin用于获得开发环境。注意安装路径要对,特殊字符路径和codeblocks不兼容。
codeblock返回上一处:点击光标即可。

VS code快捷键

Shift Alt F:vs code格式化代码
Ctrl Shift O:打开函数列表
Ctrl P:快速打开文件,或者跳到指定行
Esc:禅模式退出,

DW_minmax文件

这个文件是一个库,在EDA工具安装路径下可以找到,
参见:http://ee.mweda.com/ask/265861.html

~/eda/synopsys/K-2015.06/dw/sim_ver

莱文斯坦距离

莱文斯坦距离在UVM中有用到,主要是提示用户是否是错误输入了,而输入本应该是怎样的。
https://xiaoyuhen.com/blog/2019-03-16-levenshtein-distance/
这个讲解非常好。莱文斯坦距离主要用在用户偶尔输入了错误的字符串,然后根据已有的字符串判定大体上应该输入哪个字符串。

莱文斯坦距离就是比较字符串A如果要变为字符串B,那么需要做增删改操作单个字符的最小次数。在算法实现层面上使用动态规划,以子问题的形式获知最终的问题结果。

char* 和 char[]区别

https://blog.csdn.net/u012611878/article/details/78291036
1.char是变量,值可以改变, char[]是常量,值(指针)不能改变。
2.char[]对应的内存区域总是可写,char
指向的区域只读
3.char * 和char[]的初始化操作有着根本区别:前者指向了常量(字符串常量),后者则指向了变量(字符数组)

可增删constraint的实现方法

约束定义出来的class,本身的成员变量中,包括了item和约束两部分。
为了能够动态的添加和删除对特定item的约束。实现方法代码如下:
以下代码的实现在module中,initial语句也在module中。
重点在于add_instance_constraint方法,当创建了一个constrained_item以后,
对该item的实例增加两个约束,而这两个约束在增加的过程中,先将约束本身指向对应的item,
获得一个带有item实例的约束,然后将该约束放入到队列中。
放入两个约束到队列后,这两个约束同时指向了constrained_item,
从而constrained_item在调用randomize函数后,可以执行多个约束的同时生效。

class item;
  rand int val;
endclass

class constrained_item extends item;
  local rand abstract_constraint #(TYPE) instance_constraints[$];
  function void add_instance_constraint(abstract_constraint #(TYPE) c);
    abstract_constraint #(TYPE) c_copy = new c;
    c_copy.set_object(this);
    instance_constraints.push_back(c_copy);
  endfunction
endclass

virtual class abstract_constraint #(type T = int);
  protected T object;
  function void set_object(T object);
    this.object = object;
  endfunction
endclass

class only_even_values extends abstract_constraint #(item);
  constraint c {
    object.val % 2 == 0;
  }
endclass

class only_even_values2 extends abstract_constraint #(item);
  constraint c {
    object.val> 0;
    object.val< 100;
  }
endclass

initial begin
  	automatic constrained_item i = new();
	automatic only_even_values only_even = new();
  	automatic only_even_values2 only_even2 = new();
	i.add_instance_constraint(only_even);
  	i.add_instance_constraint(only_even2);

    repeat (100) begin
      if (!i.randomize())
        $fatal(0, "Randomization failure");
      $display("%p", i);
    end
end

$fatal的传参

$fatal会隐式调用$finish,因此$fatal和$finish都有一个退出号码,这个退出号码默认是1。

image

巴科斯范式命令行语法

https://www.cnblogs.com/uakora/p/11809501.html

命令 <必选参数1|必选参数2> [-option {必选参数1|必选参数2|必选参数3}]
		[可选参数…] {(默认参数)|参数|参数}
  尖括号< >:必选参数,实际使用时应将其替换为所需要的参数
  大括号{ }:必选参数,内部使用,包含此处允许使用的参数
  方括号[ ]:可选参数,在命令中根据需要加以取舍
  小括号( ):指明参数的默认值,只用于{ }中
  竖线|:用于分隔多个互斥参数,含义为“或”,使用时只能选择一个
  省略号…:任意多个参数

ralgen生成的寄存器模型存在覆盖率的警告(uvm-1.2)

添加如下代码:

uvm_config_db#(int)::set(this, "*", "include_coverage", 0)