HDL Compiler:full_case综合指令的使用
发布时间:2026/10/26 1:18:04 锦皓数字建站

相关阅读HDL Compilerhttps://blog.csdn.net/weixin_45791458/category_12893238.html?spm1001.2014.3001.5482综合指令(Synthesis Directives)是一些特殊注释用于影响综合工具如何处理RTL代码这些注释会被综合工具识别但会被其他工具如仿真器忽略。关于综合指令相关概念的更多介绍可以参考下面的博客。HDL Compiler综合指令https://chenzhang.blog.csdn.net/article/details/148695750在阅读本文之前建议先学习case语句的使用如下面这篇博客所示。Verilog基础case类语句(case、casex和casez)https://chenzhang.blog.csdn.net/article/details/130125464在学习full_case综合指令前首先来看一下什么是完整(full)和不完整的case语句。完整的case语句完整的case语句指的是每个可能的case expression的取值都有case item与之匹配或者存在default项。一般来说如果case语句完整则不会综合出锁存器。例1展示了一个完整的case语句case item的四种取值覆盖了sel信号的四种取值图1是例1的综合结果。// 例1 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1b0; endcase endmodule图1 例1的综合结果例2展示了一个完整的case语句case item的四种取值覆盖了sel信号的四种取值但信号没有在所有case分支进行赋值因此会综合出锁存器图2是例2的综合结果。// 例2 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: ; endcase endmodule图2 例2的综合结果不完整的case语句不完整的case语句指的是不是每个可能的case expression的取值都有case item与之匹配且不存在default项。一般来说如果case语句不完整可能综合出锁存器。例3展示了一个不完整的case语句case item的三种取值没有覆盖sel信号的四种取值例3的综合结果与例2相同。// 例3 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase endmodule例4展示了一个不完整的case语句但由于在always结构的开头对所有信号赋了初值不会综合出锁存器如图3所示。// 例4 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) begin y 1b0; case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase end endmodule图3 例4的综合结果实际上例4的综合结果相当于一个如例5所示的完整的case语句。// 例5 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1b0; endcase endmodulefull_case综合指令full_case综合指令的语法如下所示。case(***) //synopsys full_case ***:*** ***:*** endcase每个full_case指令会导致其指定的case语句被认为是完整的如果case语句本不完整那些未覆盖的分支中信号将被视为不关心此时该分支的综合结果由综合工具决定对于例6综合工具选择将输出连接到输入c图4是例6的综合结果。// 例6 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) //synopsys full_case case (sel) 2b00: y a; 2b01: y b; 2b10: y c; endcase endmodule图4 例6的综合结果实际上例6的综合结果相当于一个如例7所示的完整的case语句。// 例7 module mux(y, a, b, c, sel); output reg y; input [1:0] sel; input a, b, c; always(*) case (sel) 2b00: y a; 2b01: y b; 2b10: y c; 2b11: y 1bx; endcase endmodule如果读者熟悉显式赋x带来的问题就一定知道为什么建议谨慎使用full_case综合指令它们都会造成前后仿真的不一致对于显式赋x而言仿真时结果为x但综合后结果取决于综合工具但绝不会是x对于使用full_case综合指令仿真时表现为锁存器但综合后结果不会出现锁存器。例8展示在一个反向case语句中使用full_case指令图5是例8的综合结果如果不使用full_case综合指令当current_state为4b0000时不会进入任何case分支这会导致综合结果出现锁存器。// 例8 module one_hot_fsm (current_state, next_state); input [3:0] current_state; output [3:0] next_state; reg [3:0] next_state; parameter STATE1 4b0001; parameter STATE2 4b0010; parameter STATE3 4b0100; parameter STATE4 4b1000; always (*) case (1) // synopsys full_case current_state[0]: next_state STATE1; current_state[1]: next_state STATE2; current_state[2]: next_state STATE3; current_state[3]: next_state STATE4; endcase endmodule图5 例8的综合结果写在最后full_case综合指令不仅针对case语句起作用对于casex和casez语句也是如此不过此时语句是否完整需要考虑x值和z值的影响。如果读者非常明白full_case指令的工作机制且明确自己的意图那么可以使用它。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。