Verilog中if-else和case对比

    

做ASIC或FPGA设计的人每天用得最多的verilog语法应该就是这2个了,在面试的时候它们有何区别亦是高频考点,回顾之前的笔记,对其整理如下。

  1. if-else和case都是有优先级的,其中case可以通过synthesis parallel_case综合约束命令取消优先级;eg:case(sel)// synthesis parallel_case
  2. 在组合逻辑中若分支没写全则都会综合出锁存器,其中case可以通过synthesis  full_case综合约束命令或default来避免,而if-else必须补全在可以避免。这里有一点要注意,case中对于不关心的情况可以随便赋什么具体值都可以,代价是会增加资源,所以在面积敏感的设计中一般在default中对不关心的情况赋值为x,若用 synthesis full_case则综合器会自动对没列出的情况赋值,并且它赋的值有利于减少逻辑资源的消耗。之所以赋具体值会导致资源增加,我们可以通过卡诺图化简来理解,对于并不关心的情况给x态在卡诺图化简时即可是0也可是1,这样肯定比我们给出固定值要得到更简单的表达式,所以资源会更少。
  3. case是可综合的四态对比(0、1、x、z),if-else要么是二态对比,要么是不可综合的四态对比;此外casez是忽略高阻态z进行比较,casex同时忽略x、z进行比较;
  4. 在FPGA开发时,在RTL view中看到if-else具有明显优先级而case却是并行的,所以很多人便认为case是并行的,if-else才是具有优先级的,其实这个结论是错的。这是因为RTLview显示的是编译后的结果,显示的图形都是调用标准单元,跟工艺库、FPGA 类型都没有关系。更准确的应该看 TechnologyMap view,此时显示的是已经编译并映射到对应的 FPGA 器件中,是 布局布线后的结果。由于现在的综合工具比之前的强大很多,所以会自动进行优化,即使你用if-else写出带有优先级的电路,综合工具在分析后认为并行更合理也会综合成并行的电路,因此这两种语法在强大的综合工具面前只是2种不同的表达方式,综合结果很可能是一样的,就看你更喜欢使用哪种描述方式;
  5. case的比较
    //综合后是并行的   //综合后是带优先级的  //综合后是并行的
    case(sel[2:0])     case(1)               case(1)//synthesis parallel_case
    3'd1:addr = 3'd0;  sel[0]:addr = 3'd0;   sel[0]:addr = 3'd0;
    3'd2:addr = 3'd1;  sel[1]:addr = 3'd1;   sel[1]:addr = 3'd1;
    3'd4:addr = 3'd2;  sel[2]:addr = 3'd2;   sel[2]:addr = 3'd2;
    default:addr=x;    default:addr=x;       default:addr=x;
    endcase            endcase               endcase

你可能感兴趣的:(FPGA语法,FPGA学习,html5,面试)