我遇到了优先级编码器设计,并找到了一种使用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
作为1111
Y
获取1000
,则优先考虑第一个案例陈述。
为什么会这样?
答案 0 :(得分:11)
我会将此重构为:
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 STANDARD FOR SYSTEMVERILOG)
12.5.2案例陈述中的常量表达
常量表达式可用于case_expression。应将常量表达式的值与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关键字进行限定,以执行某些违规检查。这些统称为优先案例,独特案例或唯一案例。优先权案件应仅对第一场比赛采取行动。 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
我不确定综合工具是否支持优先案例陈述有多好。
答案 1 :(得分:7)
是的,根据订单有优先权。根据Verilog-2001规范,第9.5节:
案例项目表达式应按照给定的确切顺序进行评估和比较。在线性搜索期间,如果其中一个
case
项表达式与括号中给出的case表达式匹配,则应执行与该案例项关联的语句。