c语言
1.volatile的意义。 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
2MSB和LSB:针对bit来讲。
MSB:一串数据的最高位。
LSB:一串数据的最低位。
大端模式和小端模式:针对字节(byte)来讲的。
大端模式:高字节放入低地址
小端模式:高字节放入高地址
3.c语言的常用逻辑运算符:&& II !和位运算符 & II ^(异或运算符)
在C语言中,编程者经常混淆两组运算符:(&&,||,!)和 (&,|,^)。第一组是逻辑运算符,它的操作数是布尔型,而第二组则是位运算符,其操作数是位序列。在布尔型操作数中,只有两个数值,0或1。 C语言规定,在逻辑运算中,所有的非0数值都看做1处理。而位序列则可以是有无符号的字符型,整型,长短整型等。在位运算中,是操作数对应的二进制数相应 的位之间进行逻辑运算。因此,从逻辑上讲,位运算过程包含多个逻辑运算过程。通常,位运算操作数选择无符号型数据。
uvm bench的问题
1.bench 检查正确性的方式有,scoreboard,checker,assertion,property等
2.解释一下搭建过的uvm框架,最好画出结构图,从激励注入到check过程,以及coverage该怎么做。
3.找过的最难的bug
4.soc平台运行之前的初始化过程的配置
5.sequence之间的同步怎么做?用virtual sequence来进行不同sequence之间的调度
sequence之间的互斥?用virtual sequence相关语法里面的grab操作和lock操作来实现
6.uvm中的phase总共有多少个?哪些是top-bottom的,哪些是bottom-up的?一个sequence中常用的phase有哪些?
phase总共有13+8=21个。8个function phase分别是build phase,connect phase, end of elaboration phase, start of simulation phase, extract phase,check phase, report phase,final phase.
13个 task phase一共有run phase,
reset有3个,pre_reset_phase,reset_phase,post_reset_phase,
configure有3个,pre_configure_phase,configure_phase,post_configure_phase.
main有3个,pre_main_phase,main_phase,post_main_phase
shutdown 有3个,pre_shutdown_phase,shutdown_phase,post_shutdown_phase
以上phase中,build phase是自上而下的。为什么?因为只有build了上层才会去例化下层。
所有不耗仿真时间的phase都是自下而上的。如connect phase 先执行driver里面的再执行env里面的。
task phase是自下而上的,如run_phase,用fork join并发执行,自下而上启动,同时在运行。
7. bench中的tests是干什么用的?如何启动它。
每个test制造出一个测试场景,test里面包含了每个测试场景的配置信息,run哪些sequence以及coverage的配置参数等信息。 可以由top里面的run_test来进行制定run哪个test或者由+UVMTESTNAME=test中指定的名字。
8.testplan中要有的东西,clock check,interface check,protocal check,coverage check,reg check。check的方法。scoreboard,assertion,property,checker
9.uvm component和uvm object的区别。
uvm component继承uvm object, uvm component的特性,new的时候,指定parent来形成树形的组织结构。phase自动执行,
只有基于uvm component派生出的类才能称之为树的结点。uvm_object 派生出来的类不能称为树的结点,原因是不知道parent是谁。 所以uvm sequence不是uvm tree的一部分????
10virtual sequence 和sequence的区别
virtual sequence,实现不同sequence的同步,只转发不发送。使用uvm_do_on系列的define来发送transaction
11.virtual interface和interface的区别
class中使用的是virtual interface,在top_tb中连接
module中用的是interface,通过例化接口的方式接到top中进而连接到验证平台与DUT的端口。
12virtual function和function的区别
举一个例子:
class bird;//定义一个基类
virtual function print() display("I am a bird!");endfunction//定义一个virtual函数
endclass:bird
class red_bird extends bird;//定义一个子类
function print() display("I am a red bird!");endfunction
endclass :red_bird
initial begin
bird bird_h = new();//创建基类对象
red_bird red_bird_h = new();//创建子类对象
bird_h.print();//调用基类的print函数,打印结果为 "I am a bird!"
red_bird_h.print();//调用子类的print函数,打印结果为 "I am a red bird!"
bird_h = red_bird_h;//将基类的指针指向子类的对象
bird_h.print();//再次调用print函数,打印结果为"I am a red bird!"
//如果将基类中print函数前的virtual关键字去掉,再次调用bird_h.print(),会得到哪个?答案是"I am a bird"
//结论:对一个virtual函数,通过指针被调用时,是由这个指针指向的对象的决定调用哪个具体的函数,而不是指针的类型决定.反之,如果记类函数声明时没有加virtual关键字,那么该函数被调用时是由指针类型决定应该调用哪个具体函数.
end
疑问:第二个red bird class里,function 带不带virtual会影响 print结果吗?自己觉得不影响。
13virtual task和task的区别
向上类型转换, 父类句柄指向子类对象,最后调用的是子类的task。注意这里dad_1 没有new(), why?
module test;
class dad;
virtual task print;
$display("I am dad");
endtask
endclass
class son extend dad;
virtual task print;
%display("I am son");
endtask
endclass
initial begin
dad dad_1;
son son_1;
son_1=new();
dad_1=son_1;
dad_1.print(); // I am son
end
endmodule
向下类型转换, $cast(参数A:子类句柄,参数B:指向子类对象的父类句柄)。son_1和son_2都是同一个class 的句柄。
module test;
class dad;
task print;
$display("I am dad");
endtask
endclass
class son extend dad;
task print;
%display("I am son");
endtask
endclass
initial begin
dad dad_1;
son son_1;
son son_2;
son_1=new();
dad_1=son_1;
dad_1.print();// I am dad
$cast(son_2,dad_1);//
son_2.print(); // I am son
end
endmodule
Virtual Sequencer和sequencer的区别。
(1)Virtual sequencer 主要用于:对不同的 agent 进行协调时,需要有一定顶层的 sequencer 对内部各个 agent 中的 sequencer 进行协调。
(2)Virtual sequencer 是面向多个 sequencer 的多个 sequence 群,而sequencer 是面向一个 sequencer 的 sequence 群。
(3)Virtual sequencer 桥接着所有底层的 sequencer 的句柄,其本身不需要传递 item,不需要和 driver 连接。只需要将其内部的底层 sequencer句柄和 sequencer 实体对象连接。
使用步骤:
创建virtual sequencer。
创建virtual sequence:
- 声明virtual sequencer句柄
- 声明相关sequence句柄
- 创建sequence对象
- 为对应的sequencer启动sequence,并协调各个sequence的执行。
在env中实例化vitural sequencer,并在connect phase里和agent里的sequencer建立关联关系。
在testcase中启动virtual sequence。
————————————————
版权声明:本文为CSDN博主「Nnnnnnnonsense」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45925102/article/details/129102023
14.sequencer和driver是怎么联系到一起的?sequencer产生的一个一个的transaction通过sequencer转发到driver中
15.FPGA emulation与ASIC simulation的区别
SV语法& verilog 语法
1.function和task的区别
verilog:task消耗仿真时间而function 不能。 function 里面不能带#100延迟语句 @(posedge clk),wait(ready)等阻塞语句,也不能调用task 。 function必须有return, return必须被使用,如用到赋值语句中。
SV:只允许在fork join-none语句生成的线程中用task调function
2.fork join和fork join-none和fork join any的用法
3.四态--x,z,1,0. 二态-1,0
4.参数传递的方式
verilog: 在开头用input和output的值复制给本地变量,在子程序退出时复制output和input的值。除标量外无任何把存储器传递给verilog子程序的办法。
sv:参数的传递方式是引用,不是复制。
ref 参数类型。可以把数组,传递给子程序,还有自定义的type 类型。
如果不想改变传递的参数的值,前面加const ,举例:const ref bit[31:0] a[];
local和protected的区别
(1)local就是本地变量,代码local int DONE,比如在父类中定义DONE,那么在子类中就不能调用DONE;
(2)protected就是保护变量,在父类中定义protected nt DONE,这样定义,子类中就可以调用DONE,但是外部代码仍然不能操作该变量
5. verilog 中reg和wire的区别,logic使用限制。
只有reg类型的信号才可以在always块和initial块中赋值。wire类型可以assign而reg类型不可以。
6.verilog中的基本数据类型。
变量:单bit,多bit的无符号数,32 bit的有符号数(integer),64bit的无符号数(time)或浮点数(real)。
线网(net):
2.阻塞和非阻塞。
3.建立时间和保持时间
setup time
holdon time
4.为什么要做后仿?是为了解决什么问题?
1、 多时钟域的timing确认(跨时钟域信号的同步处理)。
2、由于异步处理部分在SDC约束文件中做的是fath_path处理,所以这部分时序是否满足,PT并不会检查也不会报出violation。
3、异步的处理方式在PD处理后有问题: example:dmux结构,data signal latnecy过大;导致后仿出现ctrl信号先 data stable后的case。
4、一些test pattern需要做后仿,调整合适的timing margin,太紧的话,片子容易fail。
5、时钟切换电路?
6、DFT逻辑的插入是否导致功能出现问题
后仿一般会出现哪些问题。
1、Setup/hold违背(posedge D -> posedge CK , negedge D -> posedge CK)
2、Recovary/Removal违背 (posedge CDN -> posedge CK ,posedge SDN -> posedge CK)??
3、Width违背 (CK,CDN,SDN)
4、IP接口时序不符合datasheet?外设器件是否也需要带延时的model?
![](https://i-blog.csdnimg.cn/blog_migrate/30547f88f3ec61beffcaa8deda427601.png)
5. sv中读一个空的不定长数组会发生什么?pop一个空队列呢?
用数组和队列之前都要先判断是否为空。 读一个空数组的话,会报错,报错内容显示为“没有索引”。pop一个空的队列,如果队列里存的是bit和int,则不报错,返回0. 如果队列里是存class,那么返回null(class=null)。
script
1.写过的脚本以及实现了什么功能
协议相关
AXI
Outstanding:master不比等待数据传输完成,即可开始下次地址操作,针对多个从设备多次访问;
Out-of_Order(乱序):不同ID的指令,可以乱序完成,针对多个从设备;
Interleaving(间插):乱序传输时不同ID之间的数据可以内插,但每个ID的数据要顺序传输,针对多个 从设备。copy from 落雨无风