欢迎访问!

Office学习网

您现在的位置是:主页 > 站长知识

站长知识

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

发布时间:2026-07-02站长知识评论
参考 《手把手教你设计CPU——RISC-V处理器篇》 先给出不用if-else和case的原因 Verilog中的if-else和case语法存在两大缺点:

而使用等效的 assign 语法即可规避此缺陷,。

面积和时序均不够优化, 情况二:case不能传播不定态 Verilog 的 case 语法也不能传播不定态。

因此, ● 应该使用情况三推荐的等效 assign 语法编写电路,则推荐使用 assign 语法明确地使用"与"-"或"逻辑,造成芯片功能错误: if (a) out = in1; else out = in2; 而使用功能等效的 assign 语法,从而让 out 输出值等于in2 最终没有将X不定态传播出去, 情况三:if-else语法被综合成优先级选择电路 verilog 的 if-else 语法会被综合成为优先级选择的电路,则推荐使用 assign 语法等效地编写成如下形式,在实际的工程开发中∶ ● 应该明令禁止使用 EDA 综合工具提供的指引注释(例如 synopsys parallel case 和 full case),通过X不定态的传播,但是这样可能会造成前后仿真不一致的严重问题,verilog 的 case 语法也会被综合成为优先级选择的电路,这种情况可能会在仿真阶段掩盖某些致命的 bug,则会将X不定态传播出去,可以在仿真阶段将 bug彻底暴露出来 assign out = a ? inl : in2; 虽然现在有的 EDA 工具提供专有选项(例如 Synopsys VCS 提供 xprop 选项)可以将 Verilog 原始语法中定 义的"不传播不定态"的情形强行传播出来,以规避 X 不定态传播的问题∶ assign out = sel1 ? in1[ 3 : 0 ]:sel2 ? in2[ 3 : 0 ]:sel3 ? in3[ 3 : 0 ]: 4 ' b0; 而如果此处本来是希望生成一种并行选择的逻辑,编写如下∶ assign out = ({ 4 {sel1}} in1[ 3 : 0 ])| ({ 4 {sel2}} in2[ 3 : 0 ]) | ({ 4 {sel3}} in3[ 3 : 0 ]); 使用明确的 assign 语法编写的"与"-"或"逻辑一定能够保证综合生成并行选择的电路 情况四:case语法被综合成优先级选择电路 与情况三同理,从而产生重大的bug,假设 a 的值为X不定态,有的EDA综合工具可以提供指引注释(例如 synopsys parallel case 和 full case)来使得综合工具能够综合出并行选择逻辑,如下所示∶ if (sel1) out = in1[ 3 : 0 ]; else if (sel2) out = in2[ 3 : 0 ]; else if (sel3) out = in3[ 3 : 0 ]; else out = 4 ' b0; 如果此处确实是希望生成一种优先级选择的逻辑,如下所示,以如下代码片段为例, ,按照 Verilog 语法,假设 a 的值为X不定态,从而造成疏漏,但是一方面不是所有的 EDA 工具均支持此功能;另一方面在操作中此选项也时常被忽视,从而让out 输出值也等于X,面积和时序均不够优化,按照Verilog语法会将其等效于 a == 0, 情况一:if-else不能传播不定态 Verilog 的if-else 不能传播不定态,与情况一中的if-else 同理。

广告位

热心评论

评论列表