平头哥面试

#平头哥芯片设计
##一面(视频面试)
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
  module full_add_8_gate(
                    A,
                    B,
                    cin,
                    S,
                    co);

  input [7:0] A,B;
  input cin;
  output [7:0] S;
 output co;
 wire [7:0] C; 

 full_add_1_gate uut0(
            .A(A[0]),
            .B(B[0]),
            .cin(cin),
            .S(S[0]),
            .co(C[0])
            );
   full_add_1_gate uut1(
            .A(A[1]),
            .B(B[1]),
            .cin(C[0]),
            .S(S[1]),
            .co(C[1])
            );
    full_add_1_gate uut2(
            .A(A[2]),
            .B(B[2]),
            .cin(C[1]),
            .S(S[2]),
            .co(C[2])
            );
    full_add_1_gate uut3(
            .A(A[3]),
            .B(B[3]),
            .cin(C[2]),
            .S(S[3]),
            .co(C[3])
            );
    full_add_1_gate uut4(
            .A(A[4]),
            .B(B[4]),
            .cin(C[3]),
            .S(S[4]),
            .co(C[4])
            );
     full_add_1_gate uut5(
            .A(A[5]),
            .B(B[5]),
            .cin(C[4]),
            .S(S[5]),
            .co(C[5])
            );
    full_add_1_gate uut6(
            .A(A[6]),
            .B(B[6]),
            .cin(C[5]),
            .S(S[6]),
            .co(C[6])
            );
          full_add_1_gate uut7(
            .A(A[7]),
            .B(B[7]),
            .cin(C[6]),
            .S(S[7]),
            .co(C[7])
            );                                                                                                              

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

7、什么时候会产生latch,case语句一定会产生latch吗,if else呢?
链接: https://blog.csdn.net/Leo_Luo1/article/details/72848764?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight.
链接: https://www.cnblogs.com/lianjiehere/p/3788334.html.

猜你喜欢

转载自blog.csdn.net/gemengxia/article/details/108102014