☰
HDL Compiler:full_case综合指令的使用
2026/10/26 1:17:51 网站建设 项目流程

相关阅读

HDL Compilerhttps://blog.csdn.net/weixin_45791458/category_12893238.html?spm=1001.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) 2'b00: y = a; 2'b01: y = b; 2'b10: y = c; 2'b11: y = 1'b0; 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) 2'b00: y = a; 2'b01: y = b; 2'b10: y = c; 2'b11: ; 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) 2'b00: y = a; 2'b01: y = b; 2'b10: 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 = 1'b0; case (sel) 2'b00: y = a; 2'b01: y = b; 2'b10: 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) 2'b00: y = a; 2'b01: y = b; 2'b10: y = c; 2'b11: y = 1'b0; endcase endmodule

full_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) 2'b00: y = a; 2'b01: y = b; 2'b10: 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) 2'b00: y = a; 2'b01: y = b; 2'b10: y = c; 2'b11: y = 1'bx; endcase endmodule

如果读者熟悉显式赋x带来的问题,就一定知道为什么建议谨慎使用full_case综合指令,它们都会造成前后仿真的不一致:对于显式赋x而言,仿真时结果为x,但综合后结果取决于综合工具,但绝不会是x;对于使用full_case综合指令,仿真时表现为锁存器,但综合后结果不会出现锁存器。

例8展示在一个反向case语句中使用full_case指令,图5是例8的综合结果,如果不使用full_case综合指令,当current_state为4'b0000时不会进入任何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 = 4'b0001; parameter STATE2 = 4'b0010; parameter STATE3 = 4'b0100; parameter STATE4 = 4'b1000; 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指令的工作机制,且明确自己的意图,那么可以使用它。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询