【数字IC秋招】2024芯动科技笔试

十道题

题量有点大,但是确实偏基础,值得好好复盘学习(手撕太多啦,芯动真的爱状态机)

一、同步复位和异步复位(5分)

1.二者的区别?

同步复位:指只有在时钟沿到来的时候复位信号才起作用。复位信号时间应该持续一个时钟周期才能保证系统稳定。
异步复位:与时钟沿无关,只要有复位信号到来就执行复位。

2. 为什么用异步复位同步释放?

同步复位的优点:

  • 有利于仿真器的仿真。
  • 所设计的系统为100%的同步时序电路,大大有利于时序分析,综合出来的fmax一般较高。
  • 因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。

缺点:

  • 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。
  • 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑(rst和输入与操作),这样就会耗费较多的逻辑资源。

异步复位的优点:

  • 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
  • 设计相对简单。
  • 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。

缺点:

  • 在复位信号释放的时候容若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
  • 复位信号容易受到毛刺的影响。

所以说,一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。

3. recovery time和removal time

在这里插入图片描述

4. 写出两种电路结构?

a、对异步复位信号打拍处理
b、对一个带异步复位端口的dff输入接高电平“1”(复位低电平有效时),这样复位信号同样保持了异步复位,但是复位释放时需要时钟触发才能拉高,实现同步释放

二、跨时钟域同步的方法()

1.单bit数据同步

2.单bit脉冲同步

3.多bit信号同步

参考外站文章跨时钟域(简要)& 异步FIFO(重点)

三、低功耗设计()

1.功耗分类

静态功耗:主要来源是漏电流

动态功耗:主要来源是翻转
图源知乎@lawlietSoC低功耗设计
在这里插入图片描述

2.各写出三种降低功耗的方法

静态功耗和动态功耗

针对静态功耗:可以采用多阈值电压、可变阈值电压、门控电源技术、SOI
针对动态功耗:参考上述公式,可以采用门控时钟、降低电源电压、动态电压调整、降频、新工艺等

四、组合逻辑门电路设计()

题目:四位输入信号d[3]d[2]d[1]d[0],要求按照给定的四个组合逻辑门(或非、或门、与非、与门)实现当输入d为质数或4’hf时输出fout为1。给出推导过程和门电路图,要求尽量少的使用逻辑门。

分析: 首先确认四位二进制输入d能组成的自然数中的质数为2、3、5、7、11、13。1不是质数不是质数!!! 加上题目要求的4’hf共计有7个自然数,画卡诺图化简。得到最简式,然后用题目给定的逻辑门画电路图即可,根据德摩根定律对非与换为或非
我的答案:该答案仅供参考,如计算错误请指出~ f o u t = d [ 2 ] d [ 0 ] + d [ 1 ] d [ 0 ] + d [ 3 ] ‾ d [ 2 ] ‾ d [ 0 ] fout=d[2]d[0]+d[1]d[0]+\overline{d[3]}\overline{d[2]}d[0] fout=d[2]d[0]+d[1]d[0]+d[3]d[2]d[0]

五、亚稳态()

1.亚稳态的概念

亚稳态:是指触发器无法在某个规定时间段内达到一个确定的状态。

2.为什么出现亚稳态,怎么消除?

原因:由于触发器的Tsu和Th不满足,当触发器进入亚稳态,使得无法预测该单元的输出,这种不稳定是会沿信号通道的各个触发器级联传播。
消除:两级或多级寄存器同步。理论上亚稳态不能完全消除,只能降低,一般采用两级触发器同步就可
以大大降低亚稳态发生的概率,再加多级触发器改善不大。

3.是不是还有一问?我忘了

六、静态时序分析(10分)

5.1.设计了如下图电路。触发器的最小延迟Tcq_min和最大延迟Tcq_max分别是30ps和80ps,触发器的setup time Tsu和hold time
Thd分别为50ps和60ps。每个组合逻辑门的最大延迟Tcom_max和最小延迟Tcom_min分别为40ps和25ps;时钟CLK周期Tck。(每个答案都需要有推导公式)
(1)分析下面电路可以工作的最高频率,并确定是否满足保持时间约束?
(2)如果需要通过加入缓冲器(延时与组合逻辑—致)解决保持时间问题,请问在如图哪些线上加入最少的缓冲器可以保证不出现保持时间问题,另外分析此时电路所能工作的最高频率?
(3)在(2)的电路基础上假定系统时钟偏移Tskew为50ps,分析此时工作的最高频率和保持时间是否满足?

在这里插入图片描述

分析:首先要明确建立时间和保持时间的公式;

建立时间: 建立时间裕量(slack)要满足一个cycle时间Tcycle+时钟偏移的时间Tskew-前一个触发器的q端到下一个触发器d端间的延时Tdelay>Tsu,此时建立时间裕量大于0,时序不违例。
而这其中的Tdelay又包含了时钟源端到触发器clk的延时Tck1(一般题目认为是0,如果有的话也不影响加上即可,但是算上Tck1的话,一般Tskew会被Tck2代替,我认为本质是一样的,因为skew本身是两个触发clk端时钟沿的差值),c到q的延时Tcq和组合逻辑延时Tcomb。
T c y c l e + T s k e w − ( T c q + T c o m b ) > T s u Tcycle+Tskew-(Tcq+Tcomb)>Tsu Tcycle+Tskew(Tcq+Tcomb)>Tsu T c y c l e + T c k 2 − ( T c k 1 + T c q + T c o m b ) > T s u Tcycle+Tck2-(Tck1+Tcq+Tcomb)>Tsu Tcycle+Tck2(Tck1+Tcq+Tcomb)>Tsu

在这里插入图片描述

保持时间: 建立时间裕量(slack)要满足前一个触发器的q端到下一个触发器d端间的延时Tdelay时钟偏移的时间-时钟偏移的时间Tskew>Thd,此时保持时间时间裕量大于0,时序不违例。
而这其中的Tdelay同上。

在这里插入图片描述

最大时钟频率: 由上述已知保持时间和频率无关,而要想频率最大,只需要保证刚好满足建立时间即可也就是建立时间裕量=0

解题: (1)寻找最大组合路径路径,计算路径延时从而计算fmax f m a x = 1 T m i n = 1 T c q _ m a x + T c o m b _ m a x ∗ 3 + T s u = 1 200 p s = 5 G H z fmax=\frac{1}{Tmin}=\frac{1}{Tcq\_max+Tcomb\_max*3+Tsu}=\frac{1}{200ps}=5GHz fmax=Tmin1=Tcq_max+Tcomb_max3+Tsu1=200ps1=5GHz

而在计算保持时间是否为例时,则需要寻找最小组合逻辑路径,也就是只有一个组合逻辑门的路径,此时的Thd_slack小于0,不满足时序约束。
T h d _ s l a c k = T c q _ m i n + T c o m b _ m i n − T h d = − 5 p s < 0 Thd\_slack=Tcq\_min+Tcomb\_min-Thd=-5ps<0 Thd_slack=Tcq_min+Tcomb_minThd=5ps<0
(2)在n3和n4两条最短组合逻辑路径各插入一个buffer增加组合逻辑延时,即可使得保持时间满足时序约束,但是我认为此时电路的最大组合逻辑路径虽然有两条经过三个组合逻辑,但是总的Tcomb没有变化,所以fmax不变
(3)引入了Tskew,按照前文所述的公式重新计算 f m a x = 1 T m i n = 1 T c q _ m a x + T c o m b _ m a x ∗ 3 + T s u − T s k e w = 1 150 p s fmax=\frac{1}{Tmin}=\frac{1}{Tcq\_max+Tcomb\_max*3+Tsu-Tskew}=\frac{1}{150ps} fmax=Tmin1=Tcq_max+Tcomb_max3+TsuTskew1=150ps1 T h d _ s l a c k = T c q _ m i n + 2 ∗ T c o m b _ m i n − T s k e w − T h d = − 30 p s < 0 Thd\_slack=Tcq\_min+2*Tcomb\_min-Tskew-Thd=-30ps<0 Thd_slack=Tcq_min+2Tcomb_minTskewThd=30ps<0

七、串并转换跨时钟域

题目:clka时钟域din串行输入,wra_n低有效表示传输数据有效,且两次传输间距很大,8个数据一组转换,输出到clkb时钟域中wrb高有效为单周期脉冲(可理解为输出flag),输出数据为8bit并行信号db_out和wrb对齐输出

分析:我的做法是常规的串并转换,在wra_n有效时将输入数据8bit移位寄存器存储,为避免多bit数据信号跨时钟域传输,我在这里对控制信号wra_n进行跨时钟域传输,然后在目标域取了一个上升沿,通过上升沿触发生成输出单bit脉冲信号wrb和8bit
输出数据db_out。

注: 这里我考虑过在clka时钟域取边沿产生脉冲再同步到clkb,但是我记得题目中有说到clkb周期是clka周期的一倍且相位不定,所以这样将是一个典型的快到慢单脉冲同步,还是要展宽或者握手,不如直接同步电平信号,在目标域取边沿。

RTL代码

module ser_pal(
input           clka    ,
input           clkb    ,
input           rst_n   ,
input           din     ,
input           wra_n   ,
output          wrb     ,
output  [7:0]   db_out
);

reg [7:0]din_pal;
reg [7:0]db_buf;
reg [2:0]wra_b;//wra_n clka --> clkb
reg wrb_r;

always@(posedge clka or negedge rst_n)
if(!rst_n)
    din_pal <= 8'd0;
else if(!wra_n)
    din_pal <= {din_pal[6:0],din};//lsb

always@(posedge clkb or negedge rst_n)
if(!rst_n)
    wra_b <= 3'd0;
else
    wra_b <= {wra_b[1:0],wra_n};

always@(posedge clkb or negedge rst_n)begin
if(!rst_n)
    db_buf <= 8'd0;
else if(!wra_b[2]&wra_b[1])begin
    db_buf <= din_pal;
    wrb_r  <= 1'b1;
end
else begin
    db_buf <= 8'd0;//题目的波形输出时只有一个周期,但是一般我数据寄存器不做清零操作
    wrb_r  <= 1'b0;
end
end

assign wrb = wrb_r;
assign db_out  = db_buf;

endmodule

Testbench

module tb;
reg clka  ; 
reg clkb  ; 
reg rst_n ; 
reg din   ; 
reg wra_n ; 
reg wrb   ; 
reg [7:0]db_out;

reg [3:0]cnt;
always@(posedge clka)begin
din <= #1 {$random}%2;
cnt <= #1 cnt+1;
end

always #5 clka = !clka;
always #10 clkb = !clkb;

always@(*)begin
if(cnt==0)
    wra_n=0;
else if(cnt==8)
    wra_n=1;
end

initial begin
clka  = 0;
clkb  = 0;
rst_n = 1;
cnt   = 1;

#10
rst_n = 0;

#20
rst_n = 1;

#2000
$finish;
end

ser_pal ser_pal_u(
    .clka(clka),
    .clkb(clkb),
    .rst_n(rst_n),
    .din(din),
    .wra_n(wra_n),
    .wrb(wrb),
    .db_out(db_out)

);

initial	begin
	    $fsdbDumpfile("tb.fsdb");	    
        $fsdbDumpvars;
end

endmodule

仿真结果

下图为vcs仿真结果,G1是改设计的port,G2是wra_n信号同步到clkb
domain的两级触发结果,第三拍是用来边沿检测的,G3是在clkb domain取上升沿的flag,用来触发产生输出。

在这里插入图片描述

八、序列检测状态机

题目:101001序列检测,要求画图并写出三段状态机代码,同时状态尽量少,序列重叠检测

图略,上代码

RTL代码

module seq_chk(
input   clk     ,
input   rst_n   ,
input   din     ,
output  flag    
);

parameter s0 = 3'd0;
parameter s1 = 3'd1;
parameter s2 = 3'd2;
parameter s3 = 3'd3;
parameter s4 = 3'd4;
parameter s5 = 3'd5;
parameter s6 = 3'd6;

reg [2:0] cst,nst;
reg flag_dly;
reg flag_r;

always @(posedge clk or negedge rst_n )begin
if(!rst_n)
	cst <= 3'd0;
else
	cst <= nst;
end

always@(*)begin
case(cst)
    s0: nst = din ? s1:s0;
    s1: nst = din ? s1:s2;
    s2: nst = din ? s3:s0;
    s3: nst = din ? s1:s4;
    s4: nst = din ? s3:s5;
    s5: nst = din ? s6:s0;
    s6: nst = din ? s1:s2;
    default:nst = s0;
endcase
end

/*基于当前状态cst的时序逻辑输出,比预期输出delay一拍*/
always @(posedge clk or negedge rst_n )begin
if(!rst_n)
    flag_dly <= 1'b0;
else if(cst==s6)
    flag_dly <= 1'b1;
else
    flag_dly <= 1'b0;
end


//基于下一状态nst的时序逻辑输出
always @(posedge clk or negedge rst_n )begin
if(!rst_n)
    flag_r <= 1'b0;
else if(nst==s6)
    flag_r <= 1'b1;
else
    flag_r <= 1'b0;
end

assign flag = flag_r;


/****组合逻辑输出,复杂状态机可能有毛刺,一般选择寄存器输出****/
assign flag_comb = cst==s6 ? 1'b1:1'b0;

endmodule

Testbench

module tb;
reg clk   ;
reg rst_n ;
reg din   ;
reg flag  ;
reg [15:0] DIN;

always #5 clk = ~clk;

initial
begin
	clk=0;
    rst_n=0;
    din=0;
    DIN=16'b0;
	#10 
    rst_n=1;
    DIN=16'b1010_0101_0011_1001;
	#500 
    $finish;
end
	always @(posedge clk)
begin
	din <= #1 DIN[15];
	DIN <= #1 {DIN[14:0],DIN[15]};
end

seq_chk seq_chk_u(
.clk   (clk   ),
.rst_n (rst_n ),
.din   (din   ),
.flag  (flag  )
);

initial	begin
	    $fsdbDumpfile("tb.fsdb");	    
        $fsdbDumpvars;
end

endmodule

仿真结果

在这里插入图片描述

九、优先仲裁状态机(15分)

题目 :使用状态机实现一个仲裁器电路,该电路控制三个请求设备对某种类型资源的共享。每个设备通过设置信号r[i]=1(i=0,1,2)来请求资源,每个i代表一个设备。只要没有请求信号,FSM保持在IDLE,当发生一个或者多个请求时,FSM按照优先级对三个设备的g[i]信号置1。
优先级顺序是0>1>2,当多设备同时请求时,优先级高的获得许可,一旦某一设备已经获得许可,则只要该设备的请求为高,那么将持续得到授权许可,直到该设备请求拉低重新仲裁。 题目还要求画出状态转移图,使用三段状态机,同时考虑仲裁器的最高效率
固定优先级仲裁

分析

RTL代码

module fixed_pro_arb(
input        clk    ,
input        rst_n  ,
input  [2:0] r      ,
output [2:0] g
);
//这里参考上面固定优先级仲裁的链接
wire [2:0]grant;
assign grant = ~(r - 1'b1) & r;
parameter IDLE = 2'd0;
parameter GRANT0 = 2'd1;
parameter GRANT1 = 2'd2;
parameter GRANT2 = 2'd3;
reg [1:0] cst,nst;
reg [2:0] g_r;

always @(posedge clk or negedge rst_n)
if(!rst_n)
    cst <= 2'd0;
else
    cst <= nst;

always @(*)begin
case(cst)
    IDLE: nst = r[0] ? GRANT0 : (r[1] ? GRANT1 : (r[2] ? GRANT2 : IDLE));
    GRANT0: nst = r[0] ? GRANT0 : (r[1] ? GRANT1 : (r[2] ? GRANT2 : IDLE));
    GRANT1: nst = r[1] ? GRANT1 : (r[0] ? GRANT0 : (r[2] ? GRANT2 : IDLE));
    GRANT2: nst = r[2] ? GRANT2 : (r[0] ? GRANT0 : (r[1] ? GRANT1 : IDLE));
    default:nst = IDLE;
endcase
end

always@(posedge clk or negedge rst_n)begin
if(!rst_n)
    g_r <= 3'b000;
else if(nst==IDLE)
    g_r <= 3'b000;
else if(nst==GRANT0)
    g_r <= 3'b001;
else if(nst==GRANT1)
    g_r <= 3'b010;
else if(nst==GRANT2)
    g_r <= 3'b100;
end

assign g = g_r;

endmodule

Testbench

module tb;
reg clk;
reg rst_n;
reg [2:0]r;
reg [2:0]g;

always #5 clk = ~clk;

always@(posedge clk)
r <= #1 {$random}%8;

initial begin
clk = 0;
rst_n = 1;
r = 0;
#10
rst_n = 0;
#20
rst_n = 1;

#500
$finish;
end

fixed_pro_arb fixed_pro_arb_u(
.clk    (clk),
.rst_n  (rst_n),
.r      (r),
.g      (g)
);

initial	begin
	    $fsdbDumpfile("tb.fsdb");	    
        $fsdbDumpvars;
end

endmodule

仿真结果

图中g为输出port,而grant为参考本题开头博客的反码源码相与操作,可以发现在Marker右侧的数据开始,有明显的的不同,g的输出逻辑符合题目要求的当某一设备获得授权时,无论是否有优先级高的设备参与请求,只要该授权设备有操作请求则会一直授权,而grant则是完全遵循优先级授权操作

在这里插入图片描述

但是我感觉这么写不太合理,状态转移条件感觉冗余了,这个状态设置想改成IDLE,,但是我不会写;下面这段时序输出会丢请求,用nst组合逻辑输出才可以看到请求,但是时间太短了。。。

always@(*)
case(cst)
    IDLE: nst = r[0] ? GRANT0 : (r[1] ? GRANT1 : (r[2] ? GRANT2 : IDLE));
    GRANT0: nst = r[0] ? GRANT0 : IDLE;
    GRANT1: nst = r[1] ? GRANT1 : IDLE;
    GRANT2: nst = r[2] ? GRANT2 : IDLE;
    default:nst = IDLE;
endcase
end

在这里插入图片描述

十、去抖电路状态机(15分)

题目 :使用三段式状态机设计一个去抖电路,输入信号sig_in[1:0]为片外的两个拨码开关,去抖的宽度为1ms,电路的输入时钟clk为1GHz,复位信号是rst_n,低有效。去抖输出信号为双bit的db_out[1:0],其行为是:
(1)db_out[1:0]初始状态为0;
(2)若db_out当前状态是Sx,当且仅当sig_in输入了连续1ms的Sy (Sy!=Sx), db_out跳变到Sy;否则db_out维持原状态。
先写出设计分析、状态和思路,然后写出设计代码,要求此设计在55nm工艺节点实现,保证后端实现时序冗余足够大,用三段式状态机实现,逻辑尽量精简

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
芯动科技数字IC笔试题是一个技术性较强的考试,主要测试考生在数字IC设计和开发方面的知识和能力。 首先,在数字IC设计方面,考生需要熟悉数字电路的基础知识,包括逻辑门、寄存器、计数器、时钟等。同时,还需要掌握数字IC的设计流程,了解电路设计软件的使用方法,能够根据需求绘制电路原理图,并完成数字电路的仿真与验证。 其次,在数字IC开发方面,考生需要了解硬件描述语言(HDL)的相关知识,如Verilog或VHDL,能够使用HDL语言描述数字电路的行为与结构。此外,还需要具备FPGA(可编程逻辑阵列)开发能力,熟悉开发板的使用方法,能够将HDL描述的电路编译、下载到开发板上,并进行功能测试与调试。 另外,考生还需要了解数字IC的测试与验证方法。数字IC的测试主要包括功能测试、时序测试和功耗测试等,考生需要掌握测试方法和测试工具的使用,并能够分析测试结果进行故障分析与修复。 在参加芯动科技数字IC笔试题时,考生需要结合自身的实际经验和知识储备,全面回答问题,体现自己在数字IC设计和开发方面的能力。在答题过程中,要注意清晰、简洁地表达思路,避免冗长的语句和重复的表述。此外,还要注意一些细节,如正确使用专业术语、标注单位、使用图表等,以展示自己的专业水平和思考能力。 通过芯动科技数字IC笔试题的考验,考生可以提升自己的技术能力,拓宽自己的专业知识领域,为未来的工作和研究打下坚实的基础。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值