乐鑫科技数字IC2017

 

1.   setup timehold time 含义,并说明setup time和hold time会出现负值的原因

setup time是指在触发器的时钟信号触发之前,数据需要稳定不变的时间

hold time 是指在触发器的时钟信号触发之后,数据需要稳定不变的时间

考虑时钟skew的情况下,setup time和holdtime需要满足:


 
 
  1. T + Tskew >Tsetup + Tco + Tdelay
  2. Thold +Tskew< Tco + Tdelay

根据上述公式,

setup time违例可能是因为工作频率过大,工艺库标准单元速度慢,触发器之间组合逻辑太长

hold time违例可能是因为时钟skew过大,触发器之间组合逻辑太短

2. verilog 中的阻塞赋值、非阻塞赋值有什么区别?

阻塞赋值:”=”,同一个语句块中,在阻塞赋值执行完之前,后面的语句是不执行的。

非阻塞赋值:”<=”,同一个语句块中,非阻塞赋值并发执行,前面的语句是否执行完毕不会影响后面的语句

3 .解释什么是STAformal形式验证DFT 

STA(StaticTiming Analysis, STA)静态时序分析,根据设计的约束和电路结构将设计划分为一条条时序路径,计算各路径的时序是否满足要求。它主要考虑通过每个逻辑门的最差延迟,而不是电路的逻辑功能。与动态仿真相比,静态时序分析不需要测试向量,能更快地检查所有路径下的时序

formal形式验证:使用数学方式进行设计的形式验证,主要用来对设计过程中不同阶段的设计进行逻辑功能一致性的对比,判断工具是否对电路工作造成了影响

 DFT(design for test,DFT)可测性设计:在设计规模变得复杂时,需要考虑设计的可测试性,在设计中插入设计功能之外的测试逻辑

4请画出数字ASIC设计从代码编写到tapeout的流程,并写明每步会使用到的工具

ASIC设计流程是一个需要很多EDA工具协同工作的设计流程:

具体工具主要是三家EDA巨头Synopsys/Mentor/Cadence

5请画出一种安全的门控时钟结构

6. 请描述跨时钟域设计时会出现的问题及解决办法

在同步设计中,可以使用工具方便地分析电路的时序以优化设计满足建立时间和保持时间,而对于异步设计则无法使用静态时序分析进行时序分析。这可能会造成时序违例,进而导致电路的亚稳态发生。

通常可以使用两级同步器握手信号异步FIFO解决跨时钟域问题

7. 数字电路的静态功耗和动态功耗有哪几部分构成?与哪些因素有什么关系。

 

动态功耗是电路逻辑转换期间消耗的功耗,由两个部分组成,开关功耗和短路功耗。 开关功耗来自对电路负载电容充放电的功耗。短路功耗来自在电路逻辑转换期间,流过PMOS-NMOS的短路电流。所以,动态功耗取决于电源电压和电容负载以及时钟频率和开关活动。

 

然而,随着晶体管尺寸和阈值电压降低,静态(泄漏)功耗正在变得越来越大,通过减慢或停止时钟不能减少泄漏功耗。但是,可以通过降低或关闭电源电压来减少或消除泄漏功耗。

8. 阈值电压Vt对静态功耗有什么影响?对电路速度有什么影响?

HVt可以有效地降低静态功耗。但电路的速度会降低。

LVt可以提高电路的速度,但是静态功耗会增大

9. 请画出下面Verilog代码对应的电路图


 
 
  1. wire [ 1 :0] a;
  2. reg b;
  3. always @ (*)begin
  4. case(a[1:0])
  5. 2 ’b00: b = 1 ’b0;
  6. 2 ’b01: b = 1 ’b1;
  7. 2 ’b10: b = 1 ’b1;
  8. 2 ’b11: b = 1 ’b0;
  9. endcase
  10. end

化简后:

b = a[1] ^ a[0]
 
 

 

 

 10. 画出检测10010序列的状态转换图,并用verilog实现

 


 
 
  1. module check(
  2. input clk ,
  3. input rst_n ,
  4. input data_in ,
  5. output data_out
  6. );
  7. parameter IDLE = 3 'b000 ;
  8. parameter S0 = 3'b001 ;
  9. parameter S1 = 3 'b010 ;
  10. parameter S2 = 3'b011 ;
  11. parameter S3 = 3 'b100 ;
  12. parameter S4 = 3'b101 ;
  13. reg [ 2 : 0] current_state,next_state ;
  14. always@(posedge clk or negedge rst_n) begin
  15. if(!rst_n) begin
  16. current_state <= IDLE ;
  17. end
  18. else begin
  19. current_state <= next_state ;
  20. end
  21. end
  22. always@(*) begin
  23. case(current_state)
  24. IDLE : begin
  25. if(data_in == 1 'b1) next_state<= S0 ;
  26. else next_state <= IDLE ;
  27. end
  28. S0: begin
  29. if(data_in == 1'b 0) next_state<= S1 ;
  30. else next_state <= S 0 ;
  31. end
  32. S1: begin
  33. if(data_in == 1 'b0) next_state<= S2 ;
  34. else next_state <= S0 ;
  35. end
  36. S2: begin
  37. if(data_in == 1'b1) next_state= S3 ;
  38. else next_state = IDLE ;
  39. end
  40. S3: begin
  41. if(data_in == 1 'b0) next_state<= S4 ;
  42. else next_state <= S0 ;
  43. end
  44. S4: begin
  45. if(data_in == 1'b 0) next_state<= S2 ;
  46. else next_state <= S 0 ;
  47. end
  48. endcase
  49. end
  50. assign data_out = (current_state ==S4) ?1 'b1 :1'b 0 ;
  51. endmodule

11. 根据如下总线的读写时序用systemverilog语言写出总线的driver,并通过interface的方式在testcase中调用读写函数


 
 
  1. `timescale 1ns/100ps
  2. interface lexin_io(input bit clk);
  3. logic en ,write ;
  4. logic [7:0] addr , wdata ,rdata ;
  5. clocking cb @(posedge clk);
  6. default input #1ns output #1ns;
  7. output en;
  8. output write;
  9. output addr;
  10. output wdata;
  11. input rdata;
  12. endclocking: cb
  13. modport TB(clocking cb);
  14. endinterface: lexin_io

 

12. 根据表一和表二数据包的约束,在class中产生约束的数据,在程序中每次调用这个函数都产生一个新的包,并且产生后的包数据可以从class外部直接更改 


 
 
  1. programlexin_random_test ;
  2. class lexin_packet;
  3. rand bit [ 3: 0] pack_type ;
  4. rand bit [ 3: 0] head_type ;
  5. rand bit ack ;
  6. rand bit [ 31: 0] pack_data ;
  7. constraint lexin_c {pack_typeinside{[ 4 'b0001: 4 'b0011], [ 4 'b1100: 4 'b1111]};}
  8. function void post_randomize();
  9. case(pack_type)
  10. 4 'b0001: ack = 0;
  11. 4 'b0010: begin head_type = 4 'b1100;ack = 1; end
  12. 4 'b0011: begin head_type =$urandom_range( 4 'b1100, 4 'b1111); ack = 1; end
  13. 4 'b1000: begin head_type = $urandom_range( 4 'b0000, 4 'b1110);ack = 0; end
  14. 4 'b1100: ack = 0;
  15. 4 'b1101: begin head_type = 4 'b1111;ack = 0; end
  16. 4 'b1110: begin head_type =$urandom_range( 4 'b0000, 4 'b0001); ack = 0;end
  17. 4 'b1111: begin head_type =$urandom_range( 4 'b0001, 4 'b1111); ack = 1;end
  18. default: begin head_type = 4 'b0;ack = 0; end
  19. endcase
  20. endfunction
  21. endclass
  22. initialbegin
  23. lexin_packet p ;
  24. p = new();
  25. repeat( 16) begin
  26. p.randomize ();
  27. $display( "p.pack_type=%4b---p.head_type =%4b---p.ack =%1b ---p.pack_data =%32b\n",p.pack_type,p.head_type,p.ack,p.pack_data);
  28. end
  29. end
  30. endprogram

13. 请写出Linux操作系统下复制文件,删除文件,修改文件名称,打压缩包的命令

cp,rm,mv,tar zcvf

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乐鑫科技是一家专注于物联网芯片和解决方案的公司,它在C语言方面开展了一场笔试。C语言是一种广泛使用的、通用的高级编程语言,它为开发者提供了底层控制硬件的能力。 在乐鑫科技的C语言笔试中,可能会包含以下内容:基本语法、数据类型、运算符、控制结构、函数、数组、指针、结构体等。基本语法是最基础的部分,包括如何定义变量、如何使用注释、如何编写函数等。数据类型是C语言中的基本类型,包括整型、浮点型、字符型等,掌握不同数据类型的使用规则至关重要。运算符包括赋值运算符、算术运算符、关系运算符等,它们用于对数据进行操作和比较。控制结构包括条件语句(如if语句)和循环语句(如for循环),它们可以根据条件控制程序的执行流程。函数是C语言中的一个重要概念,它用于封装独立的功能模块,提高代码的可读性和重用性。数组是一组具有相同数据类型的元素的集合,指针则提供了直接访问内存地址的能力,结构体则用于组合多个不同类型的数据。 通过乐鑫科技的C语言笔试,考察者将能够了解到考生对C语言的掌握程度和编程能力。C语言是一门重要的编程语言,在物联网行业尤为重要,因此掌握C语言的基本知识和技能对于乐鑫科技的求职者来说是非常有帮助的。希望通过这场笔试,考生们能够展示出自己的才华和能力,为进一步的面试和招聘机会铺平道路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值