转行上岸年薪40W+学长吐血整理:面试之verilog(下)
19、说一下pre_randomize, post_randomize, randomize
①randomize()函数对代码中的rand和randc属性的变量做随机初始化,randomize()函数执行成功,返回值为1,执行失败,返回值为0。
②pre_randomize()和post_randmize()函数可以被用户重写,用户使用pre_randomize()函数,在随机前修改代码中非随机变量的值,如上下限、权重等,post_randmize()函数可以在随机后修改随机值或做一些其它的计算。
③执行顺序是 pre_randomize- randomize- post_randomize;
④randomize()函数执行失败,意味着代码中的约束constrain不可用,代码中的随机变量将保持之前的值;randomize()执行失败后,不会执行后面的post_randomize()函数;randomize()函数不能被重写(override);randomize()函数的随机种子可以被srandom()函数修改;randomize()是system verilong的内置函数,不是VMM和UVM的函数,可以随时调用,其只会修改代码中rand和randc修饰的变量的值。
①属性的区别:
(1)this访问本类中的属性,如果本类没有这个属性则访问父类中的属性。
(2)super访问父类中的属性。
②方法的区别:
(1)this访问本类中的方法,如果本类没有这个方法则访问父类中的方法。
(2)super访问父类中的方法。
③构造的区别:
(1)this调用本类构造构造,必须放在构造方法的首行。
(2)super调用父类构造,必须放在子类构造方法首行。
(3)其他区别:this表示当前对象。super不能表示当前对象
(1)this.变量:调用的当前对象的变量;
(2)super.变量:直接调用的是父类中的变量。
⑤this(参数)和super(参数)方法
(1)this(参数):调用(转发)的是当前类中的构造器;
(2)super(参数):用于确认要使用父类中的哪一个构造器。
21、实现一个5分屏的电路,占空比50%
22、手撕同步FIFO、异步FIFO;及最小深度计算
①同步FIFO代码:
②异步FIFO框图及代码
框图:
③最小深度计算(背靠背)
23、fork join、fork join_any、fork join_none(必问)
①fork…join内的所有语句都是并发执行, 其内所有线程完成了,父线程才会运行
②fork join_any:一旦fork…join_any内任何一个线程完成,父线程就会继续运行
③fork join_none:不管其内的线程是否完成,子线程和父线程都会同时执行
24、SV常用的通信手段Mailbox是怎么通信的?
①mailbox是一中允许不同进程相互交换数据的方法,mailbox是一个内置类,本质上类似于队列,但和queue队列的数据类型有很大不同,使用semaphore来控制存储队列中的push和pull。无法访问邮箱队列中的给定索引,只能按照fifo的顺序检索项目。
②mailbox前一个端口put进数据,后面连接的端口get数据,从而完成通信。
25、static function/task和automatic function/task的区别
①静态方法/任务的特点:(program/module默认为static)
如果方法被static修饰,那么其内部所有的声明的变量都是static的;
静态方法可以在类没有被实例化时被调用,通过::操作符获取,具有全局的静态生命周期;
如果方法被声明为static,那么在仿真开始时即会被创建,且可以被多个进程和方法共享;
②动态方法/任务的特点(class默认为automatic):
如果方法被修饰为 automatic,那么其内部所有的声明的变量默认都是automatic的;
如果被修饰为 automatic,那么在进入该方法后,automatic变量会被创建,而离开该进程/方法后就被销毁;
26、function和task区别;
①函数能调用另一个函数,但是不能调用任务 任务可以调用另一个任务,也可以调用函数
②函数总是在仿真时刻0开始 任务可以在非零时刻开始执行
③函数一定不能包含任何延迟,事件或者时序控制声明语句 任务可以包含延迟,事件或者时序控制声明语句
④函数至少要有一个输入变量,也可以有多个输入变量 任务可以没有或者有多个输入,输出,输入输出变量
⑤函数只能返回一个值,函数不能有输出或者双向变量 任务不返回任何值,或者返回多个输出或双向变量值
27、阻塞和非阻塞区别,在什么场景下使用;
阻塞和非阻塞赋值都是过程赋值。
28、异步复位同步释放的电路
Verilog:
电路:
29、虚方法
①通过在父类里定义虚方法(task or function),可以在当父类句柄调用一个方法时候,前提是若是这个句柄指向了子类对象,则调用的方法为子类的方法而不是父类的方法。
②将父类对象赋值给子类句柄,ERROR不会执行
③父类的句柄指向子类的对象,但是不能访问子类成员,使用虚方法可以访问子类的函数或者任务
④使用系统函数$cast()进行类型转换,转换之后的新句柄可以访问函数与变量
30、深复制和浅复制
浅复制只复制了对象的属性,也就是只为属性开辟内存空间,而方法仍然使用的是被复制对象的方法。
深复制就是将被复制对象的属性和方法都复制过去;其实现比较麻烦,需要自己定义copy函数。
31、ref类型
①ref 在外部传递的参数改变时,其调用的task或function能够实时更新数值;
②ref 操作不需要消耗仿真时间,而inout则需要消耗仿真时间。
32、#0
a=b;
#0 c=a;
#0的作用是指定后面的语句后执行。
#芯片IC验证工程师##数字IC设计工程师##数字ic#