我遇到了优先级编码器设计,并找到了一种使用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
Run Code Online (Sandbox Code Playgroud)
在这里,如果我给A为1111 Y获得1000即它优先考虑的第一个case语句.为什么会这样?
Mor*_*gan 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
Run Code Online (Sandbox Code Playgroud)
然后就不必担心优先级,每个匹配都是唯一的.
来自IEEE Std 1800-2009(IEEE STANDARD FOR SYSTEMVERILOG)
12.5.2 case语句中
的常量表达式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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我不确定综合工具是否支持优先级案例语句.
是的,根据订单有优先权.根据Verilog-2001规范,第9.5节:
的情况下,项目的表达应进行评估,并在其给出的确切顺序进行比较.在线性搜索期间,如果其中一个
case项表达式与括号中给出的case表达式匹配,则应执行与该case项相关联的语句.