平头哥芯片设计面试题收录

平头哥芯片设计面试题收录

#平头哥芯片设计
##一面(视频面试)


1、SV基础
2、桶形移位法(项目相关)

       桶型移位器是一个多输入、单输出电路。对于输入a[31:0],移位器首先会根据b[4:0]的值来确定移多少位,最后将结果c[31:0]输出。

3、跨时钟域的问题,包括单bit、多bit、详细说明握手协议等,为什么gray码不会产生毛刺?

       单bit信号打拍的时候需要考虑时钟频率,当时钟周期大于亚稳态的恢复时间,就可以减小亚稳态继续传播,因此一位同步器需要考虑时钟频率。

       异步FIFO使用格雷码的唯一目的就是“即使在亚稳态进行读写指针抽样也能进行正确的空满状态判断”。在异步FIFO中,采用格雷码进行技术,相邻的数据仅仅只有1bit变化,这样在两个时钟域同步的时候仅仅只有1bit产生亚稳态,通过同步后,亚稳态会消除,最坏的情况就是这1bit采错,但是即使是采错地址也只是相差1个,这对判断空满标志不会产生影响。如果是采用10进制进行编码,则相邻的数据可能有多位同时变化,那么如果多位同时产生亚稳态而且同时采错数据,会对寄存器的空满标志做出严重错误的判断,会丢失数据或者读出无用的数据,使系统出错。
       时钟快慢有差别的时候,同步化的格雷码变化两次但是采样一次,根据同步化的值可以发现有两个bit,这会不会导致多位同步化问题? 答案是不会的,虽然格雷码呈现出的结果是变化了两个bit,但是它是在顺序变化的,第一次变化稳定后,第二次变化在第一次的基础上根据同步化后的时钟上升沿进行变化,这就不涉及多位变化问题。比如低时钟域从4变化到6格雷码那就是从0110----0111----0101。假设高时钟周期为低时钟的两倍,那么高时钟采集0110之后,下次再采集0101之时,0111(5)的状态必然是稳定的,所以你采集的数据要么是5要么是6,而不会出现4或者其他的中间数据。

4、加法器的具体实现Verilog

  • 平常在代码中直接用+符号实现的是行为及的描述;
//半加器:另个一位输入实现的,与全加器的区别就是不带进位加
module half_adder(
  input a,
  input b,

  output sum,
  output cout
);

  assign sum  = a ^ b;
  assign cout = a & b;

endmodule
//全加器
//进位输出:Ci+1=AiBi+AiCi+BiCi=AiBi+(Ai+Bi)Ci
//和输出:SI=Ai^Bi^Ci
module full_adder(
  input a,
  input b,
  input c,

  output sum,
  output cout
);

  wire sum1;
  wire cout1,cout2;

half_adder half_adder1(
  .a(a),
  .b(b),
  .sum(sum1),
  .cout(cout1)
);

half_adder half_adder2(
  .a(co),
  .b(sum1),
  .sum(sum),
  .cout(cout2)
);

assign cout = cout1 | cout2;

endmodule

5、FPGA上怎么实现浮点的加法乘法运算?
       有些FPGA中是不能直接对浮点数进行操作的,只能采用定点数进行数值运算。对于FPGA而言,参与数学运算的数就是16位的整型数,但如果数学运算中出现小数怎么办呢?要知道,FPGA对小数是无能为力的,一种解决办法就是采用定标。数的定标就是将要运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算得到的结果再缩小相应的倍数就可以了。在设计中,一定不要忘记小数点。在FPGA 中是体现不出来小数点的,小数点的位置只有程序员知道。Q表示小数点的位置,Q15就表示小数点在第15位。

浮点数(x)转换为定点数(xq): xq=(int)x2^Q
定点数(xq)转换浮点数(x): x= (float)xq
2^(-Q)
比如,16进制数2000H,用Q0表示就是8192;若用Q15表示,则为0.25。
下面介绍Q格式运算中Q值的确定:
(1)定点加减法:需要转换成相同Q格式才能加减
(2)定点乘法:不同Q格式的数据相乘,相当于Q值相加
(3)定点除法:不同Q格式的数据相除,相当于Q值相减
(4)定点左移:相当于Q值增加
(5)定点右移:相当于Q值减少

比如,Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,乘完之后Q值变为15+15=30,即结果为0.01B,即为浮点数0.25。

6、Verilog的四值逻辑?那么在一个选择器的使用过程中,若选择信号是X的时候,输出是什么,即if else中的if的条件为X的时候?(0、1、X、Z)
(1)

assign c = sel ? a : b;


  (2)

always @(sel or a or b) begin
  if(sel)
    c = a;
  else
    c = b;
end
  • 第一种好。

if else的逻辑是:只要条件不符合,就走else路。
试想如果上级电路出错,出现sel = 1’bx的时候,那么代码(2)的c就会走else支路,即c=b。


而双目运算(? :)的运行结果跟实际电路更接近:连控制端sel都是不定值了,那c毫无疑问地应该是x,除非a=b。
总之,代码(1)在综合结果、资源利用等方面和(2)是完全一致的,但(1)的前仿结果跟后仿、跟实际电路更接近。

7、什么时候会产生latch,case语句一定会产生latch吗,if else呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值