碎碎思 · 11月22日

很能体现 FPGA 硬件思维的一道面试题

image.png

在面试的时候,要在短时间检查一个人的水平,需要面试官有针对性的问些问题,这里举例说一个很能体现 FPGA 硬件思维的一道面试题。

  • if-else 及 case 语句条件判断的优先级

这里先列出几个例子,大家可以先自行判断以下:

example 1

module test_ex1(  
    input a,b,c,d,sel0,sel1,sel2,sel3,  
    output reg z  
    );  
  
always @(a or b or c or d or sel0 or sel1 or sel2 or sel3)  
begin  
  z=0;  
  if (sel0) z=a;  
  if (sel1) z=b;  
  if (sel2) z=c;  
  if (sel3) z=d;  
end  
  
endmodule  

image.png
图 1:example 1

example 2

module test_ex2(  
    input a,b,c,d,sel0,sel1,sel2,sel3,  
    output reg z  
    );  
      
always@(a or b or c or d or sel0 or sel1 or sel2 or sel3)  
begin  
 if(sel0)  
  z = d;  
 else if(sel1)  
  z = c;  
 else if(sel2)  
  z = b;  
 else if(sel3)  
  z = a;  
 else  
  z = 0;  
end  
  
endmodule  

image.png
图 2:example 2

example 3

module test_ex3(  
    input a,b,c,d,sel0,sel1,sel2,sel3,  
    output reg z  
    );  
      
always@(a or b or c or d or sel0 or sel1 or sel2 or sel3)  
begin  
 if(sel0)  
  z = d;  
 else if(sel1)  
  z = c;  
 else if(sel2)  
  z = b;  
 else if(sel3)  
  z = a;  
end  
  
endmodule  

image.png
图 3:example 3

example 4

module test_ex4(  
    input a,b,c,d,sel0,sel1,sel2,sel3,  
    output reg [3:0] z  
    );  
  
always @(a or b or c or d or sel0 or sel1 or sel2 or sel3)  
begin  
  z=0;  
  if (sel0) z[0]=a;  
  if (sel1) z[1]=b;  
  if (sel2) z[2]=c;  
  if (sel3) z[3]=d;  
end  
  
endmodule  

image.png
图 4:example 4

example 5

module test_ex5   
#(parameter N=8)  
(  
 input  logic [N-1:0] a, b, c, d,  
 input  logic [  1:0] select,  
 output logic [N-1:0] y  
);  
  
 always_comb begin   
   case (select)  
     2'b00: y = a;  
     2'b01: y = b;  
     2'b10: y = c;  
     2'b11: y = d;  
   endcase   
 end   
endmodule: test_ex5  

image.png
图 5:example 5

example 6

module test_ex6 (  
input  logic [3:0] d_in,  
output logic [1:0] d_out,  
output logic       error  
);  
timeunit 1ns; timeprecision 1ns;   
  
always_comb begin   
  error = '0;  
  case (d_in) inside   
    4'b1???: d_out = 2'h3; // bit 3 is set  
    4'b01??: d_out = 2'h2; // bit 2 is set  
    4'b001?: d_out = 2'h1; // bit 1 is set  
    4'b0001: d_out = 2'h0; // bit 0 is set  
    4'b0000: begin         // no bits set  
               d_out = 2'b0;  
               error = '1;  
             end  
  endcase   
end   
endmodule: test_ex6  

image.png

以上几个示例,大家可以先思考一下每个例子的判断条件优先级,然后再结合电路图对照一下自己的想法对不对。

总结

"if-else 的逻辑判别是有优先级的,而 case 的逻辑判断条件是并列的。"

上面是某些工具书上常见的判断逻辑,也是误导很多新手的结论。

从结果来看判断的优先级不一定是第一个,和后续的书写语句有很大关系(if 有没有 else、else 条件是否完备、case 条件是否完备等)。

其中,case 语句可以使用 unique、unigue0 和 priority 修饰符进行综合条件限制,但是一般不建议使用,要按照自己的思路去书写“电路”。

最后就是常说的串行或者并行应该指语法判断过程,并非指我们说的电路,实际的判断过程还是用硬件思维去思考。

END

作者:碎碎思
来源:OpenFPGA

相关文章推荐

更多 FPGA 干货请关注 FPGA 的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10615
内容数
578
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息