HDL Compiler:parallel_case综合指令的使用
相关阅读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在学习parallel_case综合指令前首先来看一下什么是平行(parallel)和不平行的case语句。平行的case语句平行的case语句指的是每个可能的case expression的取值只有一个case item与之匹配。一般来说如果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展示了一个平行的casez语句并在case item中使用了?表示对该位不关心效果就象是通配符case item之间是互斥的图2是例2的综合结果。// 例2 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) casez (sel) 3b1??: y a; 3b01?: y b; 3b001: y c; default: y 1b0; endcase endmodule图2 例2的综合结果实际上例2中的casez语句的综合结果相当于一个如例3所示的case语句。// 例3 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) case (sel) 3b100, 3b101, 3b110, 3b111: y a; 3b010, 3b011: y b; 3b001: y c; default: y 1b0; endcase endmodule不平行的case语句不平行的case语句指的是每个可能的case expression的取值存在多个case item与之匹配。一般来说如果case语句不平行则会综合出优先级结构优先级结构是确保最先匹配的分支优先执行。例4展示了一个不平行的case语句case item之间出现了重合sel信号可能满足多个分支的要求图3是例4的综合结果。// 例4 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) casez (sel) 3b1??: y a; 3b?1?: y b; 3b??1: y c; default: y 1b0; endcase endmodule图3 例4的综合结果实际上例4中的casez语句的综合结果相当于一个如例5所示的case语句。// 例5 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) case (sel) 3b100, 3b101, 3b110, 3b111: y a; 3b010, 3b011, 3b110, 3b111: y b; 3b001, 3b011, 3b101, 3b111: y c; default: y 1b0; endcase endmoduleparallel_case综合指令parallel_case综合指令的语法如下所示。case(***) //synopsys parallel_case ***:*** ***:*** endcase每个parallel_case指令会导致其指定的case语句被认为是平行的如果case语句本不平行那些重合的分支中信号将被视为不关心此时重合部分的综合结果即sel为101、110、111、011时由综合工具决定图4是例6的综合结果。// 例6 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) casez (sel) //synopsys parallel_case 3b1??: y a; 3b?1?: y b; 3b??1: y c; default: y 1b0; endcase endmodule图4 例6的综合结果实际上例6中的casez语句的综合结果相当于一个如例7所示的case语句。// 例7 module mux(y, a, b, c, sel); output reg y; input [2:0] sel; input a, b, c; always(*) case (sel) 3b100: y a; 3b010: y b; 3b001: y c; 3b101, 3b110, 3b111, 3b011: y 1bx; default: y 1b0; endcase endmodule如果读者熟悉显式赋x带来的问题就一定知道为什么建议谨慎使用parallel_case综合指令它们都会造成前后仿真的不一致对于显式赋x而言仿真时结果为x但综合后结果取决于综合工具但绝不会是x对于使用parallel_case综合指令仿真时表现为优先级结构但综合后结果不会出现优先级结构。例8展示在一个反向case语句中使用parallel_case指令图5是例8的综合结果如果不使用parallel_case综合指令当current_state为4b1001时优先考虑第一个分支这会导致综合结果出现优先级结构。// 例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 parallel_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; default: next_state 4b0000; endcase endmodule图5 例8的综合结果写在最后如果读者非常明白parallel_case指令的工作机制且明确自己的意图那么可以使用它。