首页 > 代码库 > 转载 关于case语句的优先级
转载 关于case语句的优先级
对于这样的组合逻辑电路 always@(X) case(X) X1: X2: …… endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令。 (一)“//synthesis parallel_case” 有一些书在介绍case语句时(例如《verilog HDL综合实用教程》)说“case语句的verilog HDL语义表明了选取case分支的优先顺序。case表达式首先与第一个分支项进行比较,依次类推……”但在Quartus中的实验表明, 当分支项包含变量X的所有取值情况,并且互相不重复时,case语句的各个分支选项的优先级是一样的,并且这时对case使用综合指令“//synthesis parallel_case”也不会起作用。 若某两个分支选项相互重叠,这时,case所暗含的优先级顺序就起作用了,在前面的分支项优先级高,并用在编译时Quartus会出现这样的警告: Warning (10935): Verilog HDL Casex/Casez warning at ddd.v(380): casex/casez item expression overlaps with a previous casex/casez item expression 提醒你说分支项重叠了。 在这种情况下,若不使用“//synthesis parallel_case”指令,则重叠的分支项,将会按照“前面的分支项优先级高”的原则被综合。 若使用“//synthesis parallel_case”指令,则我们可以划分几个子集:A1(属于X1,但不属于其它),A2(属于X2,但不属于其它),依此类推,对子集A1,严格按照X1:下的语句执行,对子集A2,严格按照X2:下的语句执行,依此类推。对于其它不能划到任何子集的情况,即重叠部分,则被视为不可能出现的情况,或者说的不关心的情况,对于这种情况,怎么综合有利于简化电路就怎么综合。 所以“//synthesis parallel_case”在这里对于简化电路就很有用了,只要设计者确定重叠的情况不会出现,就可以利用这条指令来简化电路。 这时Quartus会给出警告: Warning (10935): Verilog HDL Casex/Casez warning at Verilog1.v(15): casex/casez item expression overlaps with a previous casex/casez item expression Warning (10935): Verilog HDL Casex/Casez warning at Verilog1.v(16): casex/casez item expression overlaps with a previous casex/casez item expression Warning (10209): Verilog HDL Case Statement warning at Verilog1.v(13): honored parallel_case synthesis attribute - differences between design synthesis and simulation may occur (二)“//synthesis full_case” 在以上的组合逻辑电路中,如果分支项没有包含所有的情况,则会综合成触发器,那么你可以用default来避免这种情况,对于不关心的情况,随便赋一个值就好了,但是这种随意的赋值付出的代价就是逻辑资源。若用 “//synthesis full_case”则,综合器会自动对没列出的情况赋值,并且它赋的值有利于减少逻辑资源的消耗。至于原因嘛,我觉得可以用化简卡诺图的例子来说明,对于我们不关心的情况,就给它一个X好了,在化简的时候它既可以作为0,又可以作为1.显然比你给它一个0或者1要好点。这就是我们为什么要用“//synthesis full_case”的原因。
转载 关于case语句的优先级