数字IC设计面经总结 330477cd26be49a18ff1a328c5607b38

数字IC设计面经总结

前言

我将从七个方面总结数字IC设计笔试面试中会遇到的问题。这些问题大多来自于网络上大佬们分享的面经,在学习这些资料的过程中,我发现短时间内去学会所有的问题时不可能的,最关键的还是要学会分析问题的方法,找到问题的根本(听上去像是废话,但事实就是这样)。我的导师对我的评价是,非要别人把饭做好了、嚼碎了喂到嘴里你才会吃。这句话本身没有什么问题,无非是想让我学会做饭的方法。注意,这里是分三个层次的,一是学方法,二是学别人的思路,三是看了别人的思路还不行,还要别人掰开了揉碎了你才能懂。总而言之,第三种是绝对不可取的,希望看我文章的同学,可以先学思路(人无完人,请抱着质疑的态度的看,如有错误,欢迎指正),自己分析之后再总结出方法。

目录

一、RTL verilog语法问题

二、RTL逻辑设计问题

三、时钟分频、门控时钟及复位问题

四、跨时钟域问题

五、低功耗设计

六、数字逻辑问题

七、逻辑思考问题

一、verilog语法问题

  语法问题主要是可综合的语法问题,不可综合的语法不在这里讨论。

Verilog可综合的语法非常少,但是复杂的芯片就是通过这些语法实现的。所以语法问题十分重要。语法问题重点理解可综合的语法与其综合生成的电路的映射关系。

  1. 解释阻塞与非阻塞赋值的区别
  2. 说明Verilog按位操作和条件操作的区别
  3. Verilog中逻辑门:and, or, nand, nor, xor, xnor
  4. 按位操作
  5. 2的整数倍的乘法或除法
  6. 怎么执行符号的扩展
  7. 用Vreilog描述同步和异步的触发电路(Flip Flop)
  8. 用三种不同的方式实现mux
  9. Verilog code 实现latch和Flip Flop 并画出时序图

1.阻塞与非阻塞的区别是什么,什么时候使用?

阻塞赋值在Verilog的操作符是 = ,在组合逻辑电路中使用。只有当前的赋值操作完成,才能执行之后的语句。代码与生成的电路如下:
的的
非阻塞赋值在Verilog的操作符是 <= , 用描述时序逻辑里的触发器。可以理解为使用非阻塞赋值的语句是并行执行的。

上边的解释简洁明了,对于即将参加面试的你肯定是可以理解的。这里重点理解阻塞与非阻塞赋值综合生成的电路的区别,B&A生成了一个与门,如果是阻塞赋值C=B&A,这个与门的输出就是C。如果是非阻塞赋值C<=B&A,这里可以认为 “<=”就是一个触发器,<=的右边连接触发器的D端,<=的左边是触发器的Q。显然按位运算符“&”一定会生成一个与门,非阻塞赋值“<=”则生成触发器(必须是时序逻辑)。

2.解释逻辑运算符和按位运算符的不同。

逻辑运算符包括:&&、 ||、 !

位运算符包括:&、 |、 ~、 ^、 ^~

//位运算符的与
assign C = A & B;//这里的&生成与门,如果A B是多bit信号,必须位宽一致,C是A B对应bit相与的结果。
//但是实际中不会让两个多bit信号相与,因为多bit信号的延时不同。
//逻辑运算符的与
if(A==1'b1 && B==1'b1) //这里生成三个与门
/................................................../
//位运算符的或
assign C = A | B;//这里的|生成或门
//逻辑运算符的与
if(A==1'b1 || B==1'b1) //这里生成两个与门一个或门
/................................................../
assign A = ~B;//这里~生成非门
if(!rst)//条件运算符的非
//位运算符中的异或 同或类似

逻辑运算符只能用在条件判断中。

位运算符一般在赋值操作中使用,但是当判断条件中的变量是单bit时也可使用,例如:

if(A == 1’b1 && B == 1’b1) 可修改为if(A & B)

3 Verilog中逻辑门:and, or, nand, nor, xor, xnor

assign C =   A & B; //与门
assign C =   A | B; //或门
assign C =   A ^ B; //异或门
assign C = ~(A & B);//与非门
assign C = ~(A | B);//或非
assign C = ~(A ^ B);//同或

4 位缩减运算符

&, |, ^ 这三个位运算符作为单目运算符使用时,是按位缩减运算。

wire[15:0]   data;
wire         all_one;
wire         odd;
wire         not_zero;

assign all_one  = &data; //data的16bit按位相与,结果是1说明data全1
assign odd      = ^data; //data的16bit按位异或,常用来做奇偶校验,结果是1说明有奇数个1,反之有偶数个。
assign not_zero = |data; //按位或,可用来检测是否全0

5 怎么做2的整数倍乘除法?

对于数字电路来说直接做乘除法是不可能的。

但是移位运算符可以做到2的整数倍乘除法。

assign C = A<<2;  //左移两位表示乘4
assign C = A>>3;  //右移三位表示除8,其中A必须是2的整数倍

但是使用移位运算做乘除法必然会遇到最高位或最低位丢失的问题,所以要根据具体的情况使用。

6、位扩展

reg[4:0] A;
wire [9:0] C;
assign C = {{5{A[0]}},a}; //

7、三种代码实现4选1mux及其综合的电路区别

方式1:
assign output = (select == 2'b00)?A:
                (select == 2'b01)?B:
                (select == 2'b10)?C:D;
方式2:
always @(*)begin
	if(select == 2'b00)
		output <= A;
	else if(select == 2'b01)
		output <= B;
	else if(select == 2'b10)
		output <= C;
	else
		output <= D;
end

方式3:
always @(*)begin
	case(select)
			2'b00:output <= A;
			2'b01:output <= B;
			2'b10:output <= C;
			2'b11:output <= D;
	endcase
end

方式1和方式2综合的电路相同:
在这里插入图片描述

方式3生成的电路:
在这里插入图片描述
两种电路的区别:方式3对应的电路延时更小,多选1尽量使用case实现。但是当A为关键路径时可能使用第一种方式更好。A如果是关键路径,延时必然更大,使用级联的2选1可以让时序变好。

8、同步复位与异步复位的区别

在这里插入图片描述

9、Verilog code 实现latch和Flip Flop 并画出时序图

//latch代码
always @(*)begin
		if(clk = 1'b1)
			Q_latch <= input;
end
//触发器代码
always @(posedge clk)
	Q_flop <= input;

时序图如下:

在这里插入图片描述

使用always描述的组合逻辑在两种情况下会产生latch,一是if语句没有else,二是case语句没有default。根本原因是条件没有写全,导致出现未知条件时输出会保持,组合逻辑出现“保持”的情况就会产生锁存器。总之,使用always描述的组合逻辑中条件分支一定要写全,不能出现未知的情况。

下期预告:

RTL 逻辑设计问题

  1. 设计一个可以检测到输入信号发生跳变的电路(即边沿检测),并画出时序图。
  2. 设计一个可以检测到一个时钟周期长度的脉冲信号的电路。
  3. 序列检测
  4. 重复序列检测
  5. 片选,循环优先级的设计。
  6. 设计一个可以消除毛刺的电路
  7. 设计一个格雷码计数器
  8. 同步fifo设计
  9. 异步fifo设计
  10. 设计一个可以从一组数中寻找最大值,次大值的电路
  11. 设计一个可以输出秒,分,小时的电路,输入是每隔1ms拉高一个周期的脉冲。
  12. 给出时钟和输入及输出的时序图,使用verilog实现。
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值