Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法

2022年01月16日 阅读数:0
这篇文章主要向大家介绍Verilog RTL优化策略(一):推荐使用assign语法替代if-else和case语法,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

参考

  《手把手教你设计CPU——RISC-V处理器篇》工具

先给出不用if-else和case的缘由

  Verilog中的if-else和case语法存在两大缺点:
  • 不能传播不定态X;
  • 会产生优先级的选择电路而非并行选择电路,从而不利于时序和面积;

状况一:if-else不能传播不定态

  Verilog 的if-else 不能传播不定态,以以下代码片断为例。假设 a 的值为X不定态,按照Verilog语法会将其等效于 a == 0,从而让 out 输出值等于in2 最终没有将X不定态传播出去。这种状况可能会在仿真阶段掩盖某些致命的 bug,形成芯片功能错误:优化

if(a)
  out = in1; 
else
  out = in2;

  而使用功能等效的 assign 语法,以下所示,假设 a 的值为X不定态,按照 Verilog 语法,则会将X不定态传播出去,从而让out 输出值也等于X。经过X不定态的传播,能够在仿真阶段将 bug完全暴露出来spa

assign out = a ? inl : in2;

  虽然如今有的 EDA 工具提供专有选项(例如 Synopsys VCS 提供 xprop 选项)能够将 Verilog 原始语法中定 义的"不传播不定态"的情形强行传播出来,可是一方面不是全部的 EDA 工具均支持此功能;另外一方面在操做中此选项也时常被忽视,从而形成疏漏。设计

状况二:case不能传播不定态

  Verilog 的 case 语法也不能传播不定态,与状况一中的if-else 同理。而使用等效的 assign 语法便可规避此缺陷。code

状况三:if-else语法被综合成优先级选择电路

  verilog 的 if-else 语法会被综合成为优先级选择的电路,面积和时序均不够优化,以下所示∶blog

if (sel1)
  out = in1[3:0]; 
else if (sel2)
  out = in2[3:0];
else if (sel3)
  out = in3[3:0]; 
else
  out = 4'b0;

  若是此处确实是但愿生成一种优先级选择的逻辑,则推荐使用 assign 语法等效地编写成以下形式,以规避 X 不定态传播的问题∶开发

assign out = sel1 ? in1[3:0]:
            sel2 ? in2[3:0]: 
            sel3 ? in3[3:0]:
            4' b0;

  而若是此处原本是但愿生成一种并行选择的逻辑,则推荐使用 assign 语法明确地使用"与"-"或"逻辑,编写以下∶class

assign out = ({4{sel1}} & in1[3:0]) 
                 | ({4{sel2}} & in2[3:0])
                 | ({4{sel3}} & in3[3:0]);        

  使用明确的 assign 语法编写的"与"-"或"逻辑必定可以保证综合生成并行选择的电路语法

状况四:case语法被综合成优先级选择电路

  与状况三同理,verilog 的 case 语法也会被综合成为优先级选择的电路,面积和时序均不够优化。有的EDA综合工具能够提供指引注释(例如 synopsys parallel case 和 full case)来使得综合工具可以综合出并行选择逻辑,可是这样可能会形成先后仿真不一致的严重问题,从而产生重大的bug。所以,在实际的工程开发中∶
● 应该明令禁止使用 EDA 综合工具提供的指引注释(例如 synopsys parallel case 和 full case)。
● 应该使用状况三推荐的等效 assign 语法编写电路。bug