(1)、异步FIFO中,指针编码应该使用什么编码方式
A、One-hot
B、One-cold
C、Binary
D、Gray
分析:异步FIFO最重要的是指针的跨时钟域传输,而指针计数是循环且每次最多递增1,因此符合格雷码编码跨时钟域处理,即使发生亚稳态,跨时钟域后的结果要么准确要么保守,保证了空满标志的正确或保守(而不是错误)
(2)、摩尔定律中写道,IC上可容纳晶体管数量约每多少个月增加一倍?
A、10个月
B、12个月
C、18个月
D、24个月
摩尔定律是英特尔创始人之一戈登·摩尔的经验之谈,其核心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍。
摩尔定律是内行人摩尔的经验之谈,汉译名为“定律”,但并非自然科学定律,它一定程度揭示了信息技术进步的速度。
(3)、在工作过程中,如果芯片过热,需要动态降低功耗开销,下面哪个方法不能实现这个功能
A、降低芯片工作电压
B、降低芯片工作频率
C、增加低功耗cell比率
D、能芯片时钟门控
(4)、对于32K个MAC,工作在1GHz时钟,满载情况下的峰值性能为多少OPS
A、8 Tops
B、16Tops
C、32Tops
D、64 Tops
没查到概念
(5)、组合逻辑电路的逻辑冒险现象是由于( )引起的
A、电路有多个输出
B、逻辑门类型不同
C、电路末达到最简
D、电路中存在延时
(6)、若要将异或门当作反相器(非门)使用,则输入端A B的连接方式是( )
A、A或B中有一个接“0”
B、A和B并联使用
C、A或B中有一个接“1”
D、不能实现
(7)、下面那个功能不是在综合过程中实现的( )
A、translate
B、DFX insert
C、retiming
D、mapping
(8)、下面哪个FP32数据格式是对的(符号位指数位小数位)( )
A、1.8.23
B、1.5.26
C、2.8.22
D、2.5.25
(9)、下列不属于验证方法学的是( )
A、UVM
B、OVM
C、DVM
D、VMM
(10)、半导体工艺制程中的7nm,5nm对应的是( )
A、晶体管宽度
B、栅极宽度
C、源极宽度
D、金属线宽度
(1)根据自己的理解列出经典处理器CPU执行大致阶段,以及各阶段的大致行为。
取指令:从主存中取指令到指令寄存器
指令译码:将指令按照指令结构,进行拆分解释,识别区分不同指令类别和各种获取操作数的方法
执行指令:实现指令的功能
访存取数:根据指令访问主存,读取操作数
结果写回:将运算结果写回到某存储器
(2)、请使用verilog设计一个round-robin仲裁器,该模块位单时钟单复位,2个输入bus,1个输出bus,每个bus都是ready-valid接口,模块接口如下:
Parameter:
#(
DW = 128 // DW为数据位宽
)
Interface:
(Input clk,
Input reset_n,//低有效
//input bus A
Input valid_a,
Input [DW-1:0] data_a,
Output ready_a,
//input bus B
Input valid_b,
Input (DW-1:0] data_b,
Output ready_b,
//output bus C
Output valid_c,
Output [DW-1:0] data _c,
Input ready_c
)
module round_robin_arbiter#(
parameter DW = 128
)
(Input clk,
Input rts_n,//低有效
//input bus A
Input valid_a,
Input [DW-1:0] data_a,
Output ready_a,
//input bus B
Input valid_b,
Input (DW-1:0] data_b,
Output ready_b,
//output bus C
Output valid_c,
Output [DW-1:0] data _c,
Input ready_c
);
//=====================defination
wire [2 : 0] req;
reg [1 : 0] grant;
//=====================combinal logic
assign req = {ready_c, valid_b, valid_a};
//=====================sequential logic
always@(posedge clk or negedge rst_n)begin
if(!rst_n) grant <= 2'b11;
else begin
case(grant)
2'b00 :
case(req)
3'b000 : grant <= 2'b00;
3'b001 : grant <= 2'b00;
3'b010 : grant <= 2'b01;
3'b011 : grant <= 2'b01;
3'b100 : grant <= 2'b10;
3'b101 : grant <= 2'b10;
3'b110 : grant <= 2'b01;
3'b111 : grant <= 2'b01;
default : grant <= 2'b00;
endcase
2'b01 :
case(req)
3'b000 : grant <= 2'b00;
3'b001 : grant <= 2'b00;
3'b010 : grant <= 2'b01;
3'b011 : grant <= 2'b00;
3'b100 : grant <= 2'b10;
3'b101 : grant <= 2'b10;
3'b110 : grant <= 2'b10;
3'b111 : grant <= 2'b10;
default : grant <= 2'b01;
endcase
2'b10 :
case(req)
3'b000 : grant <= 2'b00;
3'b001 : grant <= 2'b00;
3'b010 : grant <= 2'b01;
3'b011 : grant <= 2'b00;
3'b100 : grant <= 2'b10;
3'b101 : grant <= 2'b00;
3'b110 : grant <= 2'b01;
3'b111 : grant <= 2'b00;
default : grant <= 2'b10;
endcase
2'b11 : grant <= 2'b00;
endcase
end
end
always@(*)begin
case (grant)
2'b00 : {valid_c, ready_b, ready_a} <= 3'b001;
2'b01 : {valid_c, ready_b, ready_a} <= 3'b010;
2'b10 : {valid_c, ready_b, ready_a} <= 3'b100;
2'b11 : {valid_c, ready_b, ready_a} <= 3'b000;
endcase
end
endmodule
(3)请使用verilog设计一个位宽转换器,该模块位单时钟单复位,1个输入bus,1个输出bus,每个bus都是ready-valid接口,模块接口如下:
Parameter.
#(
IDW = 30,//输入数据位宽
ODW = 25 //输出数据位宽
Interface:
(Input clk,
input reset_n //低有效
//input bus
Input valid_a,
Input (IDW-1:0] data_a,
Output ready_a,
//output bus b
Output valid_b,
Output lODW-1:0] data_b,
Input ready_b
Parameter:
#(
IDW=30,//输入数据位宽
ODW =25 //输出数据位宽
)
Interface:
(Input clk,
Input reset_n,//低有效
//input bus
Input valid_a,
Input IDW-1:0)data_a,
Output ready_a,
//output bus b
Output valid_b,
Output(ODW 1:01 data_b,
Input ready_b
)
注1:输入输出数据位宽任意比例可配,本题中应考虑area尽可能小。
注2:时间有限,可以直接写思路
用位宽不一样的同步FIFO实现,其中ram数据位应为读写位宽的最大公因数。另一篇博客实现了读写不同位宽的FIFO。
(4)、芯片设计三个核心指标为PPA,请解释这三个字母分别代表什么,并阐述你对PPA的理解。
性能功耗面积;
面积换功耗:门控时钟(动态),电源门控、多阈值电压、动态电压(静态)
面积换性能:大容量cache提高cpu的hit几率
功耗换性能:关键路径采用低阈值电压cmos,但静态功耗很大
(5)、芯片设计中有些情况下会考虑将不同模块分时启动、分时停止,请闸述你对该场景的理解。
模块复用,为了减小面积,例如一个计数器一段时间内计数a,另一段时间内计数b
(6)、一个异步FIFO,入口和出口的频率比是10:8。入口不停的发送包,一个包100笔数据,一拍一笔,包间和数据间都没有间隔 每个包有80个有效数据,有效数据会被送进FIFO,其他的被丢弃。80笔有效数据随机分布在100笔数据里,问:FIFO深度至少多少不会让有 效数据丢失?(题目存疑
160 - 160 / fw * fr = 32
(7)、退出仿真的函数是哪个
$finish
(8)、What is The Difference Between Mailbox And Queue?
queue 存放有序的同类元素,同时结合了链表的优点可以任意位置操作或访问
mailbox是跨线程的通信,一个线程中写入数据,可以在另一个线程中将数据读出
(9)、What Is The Use Of $cast?
$cast为了强制类型转换,可以把基类句柄赋值给扩展类句柄,前提是基类句柄指向了这个扩展类对象或者这个扩展类的扩展类对象,强制类型转换后,这个扩展类句柄就会指向这个扩展类的对象或者这个扩展类的扩展类的对象。
(10)、How To Call The Task Which is Defined In Parent Object Into Derived Class ?
super.
(11)、Without Using Randomize Method Or Rand, generate An Array Of Unique Values?
先定义一个数组,再用arr.unique()方法返回一个队列(不懂)
What is The Difference Between Byte And Bit [7:0]?
Byte有符号8位二值变量
bit[7 : 0] 无符号8位二值变量
(13)、UVM中哪个phase是自下而上执行顺序?
connect_phase end_of_elaboration_phase start_of_simulation_phase run_phase (reset configure main shutdown) extract_phase check_phase report_phase
只有build final是从上而下
(14)、UVM类中,如果想要某个成员使用UVM compare和print机制,需要如何操作该变量?
域的自动化
class trans;
rand bit [47 : 0] dmac;
rand bit [31 : 0] dq [];
`uvm_object_utils_begin(trans)
`uvm_filed_int(dmac, UVM_ALL_ON)
`uvm_filed_array_int(dq, UVM_ALL_ON)
`uvm_object_utils_end
endclass
(15)、sequence如何启动,说出任意种方法
调用start任务:
my_sequence my_seq;
my_seq = my_sequence::type_id::creat("my_seq");
my_seq.start();
default sequence
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.i_agt.sqr.main_phase",
"default_sequence",
my_sequence::type_id::get());
(16)、请写段Python代码,打开一个文件,扫描每行,如果该匹配到“biren01”,“biren02”,……“biren99”则以行号Key,将匹配到的“birenxx”保存下来
import re
d = {}
file = open('nowcoder.txt')
f = file.readlines();
print(f)
for i in range(len(f)) :
result = re.findall('biren[0-9][0-9]',f[i])
d[i] = (result)
for key in d :
if d[key]:
print(key, d[key])