case:在case语句中,敏感表达式与各项值之间的比较,是一种全等比较。每一位都必须相同才认为匹配。
casez:这种也可用于优先级电路。
举个栗子:
- module no13(out,a,b,c,d,select
- );
-
- input wire a,b,c,d;
- input wire [3:0]select;
- output reg out;
-
- always@(a or b or c or d or select)
- begin
- casez(select)
- 4'b???1: out = a;
- 4'b??1?: out = b;
- 4'b?1??: out = c;
- 4'b1???: out = d;
- default: out = 1'b0;
- endcase
- end
-
- endmodule
仿真代码:
- module tb;
-
- // Inputs
- reg a;
- reg b;
- reg c;
- reg d;
- reg [3:0] select;
-
- // Outputs
- wire out;
-
- // Instantiate the Unit Under Test (UUT)
- no13 uut (
- .out(out),
- .a(a),
- .b(b),
- .c(c),
- .d(d),
- .select(select)
- );
-
- initial begin
- // Initialize Inputs
- a = 1;
- b = 0;
- c = 1;
- d = 0;
- select = 0;
-
- // Wait 100 ns for global reset to finish
- #100;
- select = 1;
-
- #100;
- select = 4'bzz10;
- #100;
- select = 4'bxx10;
- #100;
- select = 4'b1zzz;
- // Add stimulus here
-
- end
-
- endmodule
仿真结果:我们可以发现只要是select[0]=1,不管别的位怎么样,它就是第一种情况。这个casez是顺序判断的。
casez和casex:casez与casex语句是case语句的两种变体, 在写testbench时用到,属于不可综合的语句。
1在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。
2 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。
比如:
- casez (sel)
-
- 3’b001: y=a+b;
-
- 3’b010: y=a-b;
-
- 3’b011: y=a&b;
-
- 3’b100: y=a^b;
-
- default: y=3’b000;
当sel=01z的时候,由于最低位出现z,那么在比较判别时不考虑最低位,只与源比较前两位,那么出现与010,011均匹配的情况,此时由于case语句是按顺序检查的,所以先认为与010匹配,输出y=a-b。
还有我有见过使用casez来实现优先级电路的实现:
- module priority_casez(input wire [3:0]a,
-
- output reg [3:0]y);
-
- always@(*) begin
-
- 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;
-
- end
-
- endmodule
问题:
(1)处当select=4'bzzzz时,是满足4'b???1吗?
(2)处当select=4'bxx11时,应该同时可以满足两项,可是都只赋值了第一项,是只要有一个条件满足就不再判断吗?它是顺序执行的吗?从第一个条件开始逐个判断的吗?
(3)如果改casez为casex,是不是在(1)上一句out=00?
答案:
(1) 在casez语句, 当表达式的值为z时, 满足任何条件, 因此, select=4'bzzzz时, 满足4'b???1
(2) 在case, casez, casex语句中, 不同条件表达式可以彼此覆盖, 此时只有最上面一条语句被执行. 当select=4'bxx11时, 满足第一个条件, 4'b???1, 因此输出, 此时相当于优先编码器
(3) 在casex语句中, 当表达式的值为z,x时, 满足任何条件, 因此, select=4'bxxxx时, 满足4'b???1, 在20处输出out=00
不推荐使用casex语句, 因为x状态为仿真的初值, 容易引起误会. 另外, 建议无关项用?表示, 而不是x或者z.
参考资料:
http://www.xuebuyuan.com/1053057.html
http://www.360doc.com/content/11/0527/09/5735822_119706829.shtml
http://wenku.baidu.com/link?url=EvKxvV5kuchxnHTYPKAJx-8rjvXae91iR3BYWJ0l-WOK7yg3ZVmExJgb0dFIaQn3vOqpJS9Jkc0kfVjTPae-7gU23KpDjAnB4bgh0pnvG_O
来源:51CTO
作者:Oh_my_God_L_C
链接:https://blog.csdn.net/Oh_my_God_L_C/article/details/100106290