我遇到了优先级编码器设计,并找到了一种使用 case 语句来实现它的新方法。
唯一令人困惑的是,case语句是否优先考虑case?
例子:
case(1'b1)
A[3]: Y<=4'b1000;
A[2]: Y<=4'b0100;
A[1]: Y<=4'b0010;
A[0]: Y<=4'b0001;
default:Y<=4'b0000;
endcase
在这里,如果我给A
as 1111
Y
gets 1000
即它优先考虑第一个 case 语句。
为什么会这样呢?
我会将其重构为:
casez(A)
4'b1???: Y<=4'b1000;
4'b01??: Y<=4'b0100;
4'b001?: Y<=4'b0010;
4'b0001: Y<=4'b0001;
default: Y<=4'b0000;
endcase
那么就不用担心优先级了,每场比赛都是独一无二的。
来自 IEEE Std 1800-2009(IEEE SYSTEMVERILOG 标准)
12.5.2 case语句中的常量表达式
case_表达式可以使用常量表达式。常量表达式的值应与 case_item_expressions 进行比较。
以下示例通过建模 3 位优先级编码器演示了用法:
logic [2:0] encode ;
case (1)
encode[2] : $display("Select Line 2") ;
encode[1] : $display("Select Line 1") ;
encode[0] : $display("Select Line 0") ;
default $display("Error: One of the bits expected ON");
endcase
12.5.3 unique-case、unique0-case和priority-case
case、casez 和 casex 关键字可以通过priority、unique 或unique0 关键字进行限定,以执行某些违规检查。这些统称为优先级案例、独特案例或独特0案例。优先级案例仅对第一个匹配起作用。 unique-case 和 unique0-case 断言不存在重叠的 case_items,因此并行评估 case_items 是安全的。
...
priority casez(a) // values 4,5,6,7 cause a violation report
3’b00?: $display("0 or 1");
3’b0??: $display("2 or 3");
endcase
不过,我不确定综合工具对优先级案例语句的支持程度如何。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)