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

您所在的位置:网站首页 verilog中always和assign Verilog RTL优化策略(一):推荐使用assign语法替代if

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

2023-11-09 08:46| 来源: 网络整理| 查看: 265

情况一: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彻底暴露出来

assign out = a ? inl : in2;

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

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

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

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

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

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 语法明确地使用"与"-"或"逻辑,编写如下∶

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 语法编写电路。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3