摘要1_SV for Verification

摘要 (SystemVerilog for verification)

第一章

Testcase的种类和覆盖范围(为什么要做direct case和random case)。TB的层次和结构

第二章

数组:packed的数组总是比unpacked的更节省空间(unpacked每个总占用32bit)。
二维数组的遍历:foreach ( array[i, j] )。
在display中使用条件判断 : $display(“src %s dst”, (src == dst ? “==” : “!=”));
packed array可以直接赋值:e.g. bit[3:0][7:0] bytes = 32’hbeef_beef。
如果需要输入很多东西,可以用 fopen,feof,fscan,fclose。
array.unique:获得数组中不同数的合集。
通过指针队列比数组更容易到达,但所占内存也大一点。
后缀:_t(typedef), _s(struct), _u(union),或者用class,_e(enum)
parameter也可以使用const
注意expression width

第三章

array.sum :
do
sum += array[ j ];
while( j–);
task的两种argument模式:verilog 和 c (都用c)
const ref 如果有什么不想改的,用上这个
可以给argument设default值,如果需要的话
用上ref就不用做copy了
如果有error,可以用上return,提早回来

第四章

OOP: Class, Object, Handle(a pointer to an object), Property, Method, Prototype
new: this.addr = addr (remove ambiguity)
b1 = new ; b2 = b1 ; b1 = new; (此时b2得到了b1的handle,b1重新取得一个新的handle)
static:通常id可以带上这个
e.g static int count = 0
new : count ++ ;
copy: count ++

class 套 class: 划分变量
一个class该有多大?如果小到之用了一次,merge之
编译顺序:如果在后,先typdef即可
handle得每次new一下,不能一次new出一个handle array

src = new;
dst = new src; //copy
dst.stats.startT = 84; // src和dst的都会变
因为实际上只copy了handle,共用一个pointer
不要用零散变量,既然是OOP,封装到类里面去(e.g. transaction)

第五章

有误(p107): interface里可以包含interface!
race conditions: #0 or #1 (But multiple threads using #0 delays cause indeterministic behaviour)
exit 和 finish 的区别
The clocking block inserts a synchronizer between the design and testbench !!!
驱动interface里的信号一律用 <= (因为design signal不会在赋值后立即变化)
program里不能用always
把clock generator拆开
TB的验证不是timing的,如果要做timing的,最好使用static timing analysis tool。
assert比if 更compact。因为assertion是declarative language,不同于procedural language。

第六章

怎样randomize,要randomize哪些值
最好用个assert,看看有没成
也是declarative,用 { } 而不是begin end。
尽量把variable列出来
randc比用queue生成不同值更快
:= 和 /=
-> 和 if-else
乘除取余是灰常expansive的,和加减位移相比
譬如addr%4096可以用addr[11:0]取代
用if-else和分开写constraint,分开可以用constraint_mode开关(还有一种rand_mode)。
如何产生指数分布,正态分布,泊松分布?dist_…
display function尽量和class放一起,方便调用
尽量只在一处使用in_line_randomzie。
可以使用空constraint,方便在其他地方修改,但也可能会太分散
如何避免negative variable。
只用要用的大小
可以把randc放在helper class里,方便随时使用(放post randomize里)
randsequence尽量别用
randcase:只用在decision tree中
Sytemverilog怎样产生随机数?不同PRNG; Verilog共用一个PRNG
environment configuration

第七章

第八章

第九章

第十章


版权声明:本文为weixin_44269816原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。