乐鑫科技数字芯片2017

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

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

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

 

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

T + Tskew >Tsetup + Tco + Tdelay
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代码对应的电路图

wire [1:0] a;
reg b;
always @ (*)begin
case(a[1:0])
2’b00: b = 1’b0;
2’b01: b = 1’b1;
2’b10: b = 1’b1;
2’b11: b = 1’b0;
endcase
end

化简后:

b = a[1] ^ a[0]

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

 

module check(
    input clk ,
    input rst_n ,
    input data_in ,
    output data_out 
);
    parameter IDLE = 3'b000 ;
    parameter S0   = 3'b001 ; 
    parameter S1   = 3'b010 ; 
    parameter S2   = 3'b011 ; 
    parameter S3   = 3'b100 ; 
    parameter S4   = 3'b101 ; 
 
    reg [2:0] current_state,next_state ; 
    always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
            current_state <= IDLE ;
end
else begin
            current_state <= next_state ;
end
end
 
    always@(*) begin
case(current_state)
            IDLE : begin
if(data_in == 1'b1) next_state<= S0 ;
                else   next_state <= IDLE ;
            end
            S0: begin
                if(data_in == 1'b0) next_state<= S1 ;
else   next_state <= S0 ;
end
S1: begin
if(data_in == 1'b0) next_state<= S2 ;
                else   next_state <= S0 ;
            end
S2: begin
                if(data_in == 1'b1) next_state= S3 ;
else   next_state = IDLE ;
end
S3: begin
if(data_in == 1'b0) next_state<= S4 ;
                else   next_state <= S0 ;
            end
S4: begin
                if(data_in == 1'b0) next_state<= S2 ;
else   next_state <= S0 ;
end
        endcase
end
 
    assign data_out = (current_state ==S4)?1'b1 :1'b0 ; 
endmodule

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

`timescale 1ns/100ps
interface lexin_io(input bit clk);
logic en ,write ;
logic [7:0] addr , wdata ,rdata ;
 
clocking cb @(posedge clk);
default input #1ns output #1ns;
output en;
output write;
output addr;
output wdata;
input  rdata;
 
endclocking: cb
 
  
modport TB(clocking cb);
 
endinterface: lexin_io

program automaticlexin_test(lexin_io.TB lexin_io);
 
 
initial begin
 
lexin_write(8'h00,8'h00);
 
         
repeat(3) @(lexin_io.cb);
lexin_read(8'h00);
 
 
end
 
 
task lexin_write(logic[7:0] addr , logic [7:0] data);
@(lexin_io.cb);
lexin_io.cb.en <= 1'b1;
lexin_io.cb.write <= 1'b1;
lexin_io.cb.addr <= addr ;
@(lexin_io.cb);
lexin_io.cb.wdata <= data ; 
lexin_io.cb.addr <= addr+1 ;
@(lexin_io.cb);
lexin_io.cb.wdata <= data+1  ; 
lexin_io.cb.addr <= addr+2  ;   
@(lexin_io.cb);
lexin_io.cb.wdata <= data+2  ; 
@(lexin_io.cb);
lexin_io.cb.en <= 1'b0;
lexin_io.cb.write <= 1'b0;
 
endtask: lexin_write
 
task lexin_read(logic[7:0] addr);
@(lexin_io.cb);
lexin_io.cb.en <= 1'b1;
lexin_io.cb.write <= 1'b0;
lexin_io.cb.addr <= addr ;
@(lexin_io.cb);
lexin_io.cb.addr <= addr+1 ;
@(lexin_io.cb);
lexin_io.cb.addr <= addr+2 ;
@(lexin_io.cb);
lexin_io.cb.addr <= addr+3 ;
@(lexin_io.cb);
lexin_io.cb.en <= 1'b0;
endtask: lexin_read
 
endprogram: lexin_test

`timescale 1ns/100ps
 
module lexin_test_top;
 parameter simulation_cycle = 10;
 
  bit SystemClock;
 
lexin_io lexin_io(SystemClock);
 
 
lexin_test lexin_test(lexin_io);
 
 
 initial begin
 
 
        $timeformat(-9,1, "ns", 10);
   SystemClock = 0;
   forever begin
#(simulation_cycle/2)
       SystemClock = ~SystemClock;
   end
  end
 
endmodule

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

programlexin_random_test ;
 
class lexin_packet;
        rand bit [3:0] pack_type ;
        rand bit [3:0] head_type ;
        rand bit  ack ;
        rand bit [31:0] pack_data ;
 
        constraint lexin_c {pack_typeinside{[4'b0001:4'b0011], [4'b1100:4'b1111]};}
 
        function void post_randomize();//不能再加virtual修饰
case(pack_type)
            4'b0001: ack = 0;
            4'b0010: begin head_type = 4'b1100;ack = 1; end
            4'b0011: begin head_type =$urandom_range(4'b1100,4'b1111); ack =1; end
            4'b1000: begin head_type = $urandom_range(4'b0000,4'b1110);ack =0; end
            4'b1100: ack =0;
            4'b1101: begin head_type =4'b1111;ack = 0; end
            4'b1110: begin head_type =$urandom_range(4'b0000, 4'b0001); ack = 0;end
            4'b1111: begin head_type =$urandom_range(4'b0001, 4'b1111); ack = 1;end
            default: begin head_type = 4'b0;ack =0; end
        endcase
        endfunction
 
    endclass
initialbegin
    lexin_packet p ;
    p = new();
    repeat(16) begin
    p.randomize ();
    $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);
end
end
 
endprogram

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

cp,rm,mv,tar zcvf

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值