1. setup time、hold 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 .解释什么是STA、formal形式验证和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'b
0) next_state<= S1 ;
-
else next_state <= S
0 ;
-
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'b
0) next_state<= S2 ;
-
else next_state <= S
0 ;
-
end
-
endcase
-
end
-
-
assign data_out = (current_state ==S4)
?1
'b1 :1'b
0 ;
-
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
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();
-
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