前言
面试问题:
0. 数据类型 默写下
uvm_do()
的源代码讲一下,- seq 发送到driver,seq_item是如何转换成transaction,为什么要由sequencer?
- scoreboard 谁驱动的。信息比较 :monitor拿到的信息 和 写seq中的数据比较这样做对么 ,是靠addr去比较的么
- AHB协议, 信号默写下,以及信号的master控制还是slave控制?transfer图默写下
- rgm 加深,默写下
- 字对齐,理解,默写下
- 对于sram只测试读写对么,每一测试代表的含义
以下内容大多是自己的理解,如有错误还请指正,谢谢。
开始是黑盒验证,ram就是mem,按照一定地址写进去,再按一定地址读出来。
在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)
在32位的系统中(比如win32) 1字(word)= 4字节(byte)= 32(bit)
在64位的系统中(比如win64)1字(word)= 8字节(byte)= 64(bit)
1字节(byte)= 8(bit)
面试答案
1. uvm_do()
的源代码
uvm_transaction ->
uvm_sequence_item ->
uvm_sequence_base ->
uvm_sequence #( uvm_sequence_item) -> rkv_watchdog_base_virtual_sequence -> rkv_watchdog_countdown_virt_seq
零、计算机体系结构中的memory
1. memory中的大小端存储
BE8 : Byte-invariant big-endian (字节不变大端,8bits)
BE32: Word-invariant big-endian (字不变大端,32bits)
Little endian ()
计算机系统中,每个地址单元对应一个字节(8bit),一种数据类型的数据 可能占用若干字节。
大端模式:低位(字节/比特)放在高地址中,高位(字节/比特)放在低地址中。
小端模式:低位(字节/比特)放在低地址中,高位(字节/比特)放在高地址中。
一般操作系统都是小端模式;而通讯协议是大端模式; java和平台无关,默认是大端模式
常见的cpu的大小端:
大端:PowerPC、IBM、Sun
小端:x86
ARM既可以工作在大端模式,也可以工作在小端模式
2. 内存对齐的理解
2.1 什么是内存对齐
内存对齐,就是将数据存放到一个是字的整数倍的地址指向的内存之中。
不论什么数据都有一定的大小,当一个数据所在的地址 和 它的大小对齐的时候, 就说这个数据自然对齐了(naturally aligned),否则就是没对齐。
怎么理解数据的地址和它的大小对齐这句话呢?例如有一个地址a,它是n的整数倍,并且这个n是2的幂,这时候我们就可以说a和n个字节对齐了。举个栗子:当 a = 0x00000008,n = 4,2^2 = 4 的时候,就说地址a和4字节对齐了2。
套用到数据的地址和它的大小对齐这句话,例如一个long变量,它占用4个字节,也就是他的大小是4字节,如果这个变量的地址为 0x00000004、0x00000008 等,那么这个变量就和4字节对齐了,而如果它的地址是0x00000006 之类的,那么它就没对齐。
当存取一个地址对齐了它数数据大小的数据结构的时候,就说这是一次对齐存取。上面的例子说的是基本数据类型,当一个复杂的数据结构中的所有成员都自然对齐了,我们就说这个数据结构对齐了,为了能让复杂数据结构对齐,编译器一般会对数据结构做一些填充,使得它的成员都能对齐。
2.2 为什么要内存对齐
总结:提升效率和避免出错。
- 有不少平台的CPU,比如Alpha、IA-64、MIPS还有SuperH架构,若读取的数据是未对齐的(比如一个4字节的int在一个奇数内存地址上),将拒绝访问,或抛出硬件异常。
- CPU处理内存的方式(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),使用字节对齐将会提高系统的性能(也就是CPU读取内存数据的效率。比如你一个int放在奇数内存位置上,想把这4个字节读出来,32位CPU就需要两次。但对齐之后一次就可以了)。
2.3 怎么进行内存对齐
很多时候,我们是不需要关注内存对齐的问题的,因为处编译器已经自动为数据进行对齐:对于基本数据类型,编译器会给他们分配一个是他们大小n被的地址;对于组合类型数据结构,编译器会在成员函数中填充一些字节使得每个成员都自然对齐。
struct MyStruct
{
char a; // 1 byte
int b; // 4 bytes
short c; // 2 bytes
char e;