数字电路设计之casez,case,casex的用法

来源:互联网 发布:逻辑数据独立性是指 编辑:程序博客网 时间:2024/06/05 06:25

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)begincasez(select)4'b???1: out = a;4'b??1?: out = b;         4'b?1??: out = c;         4'b1???: out = d;         default: out = 1'b0;endcaseendendmodule

仿真代码:

module tb;// Inputsreg a;reg b;reg c;reg d;reg [3:0] select;// Outputswire out;// Instantiate the Unit Under Test (UUT)no13 uut (.out(out), .a(a), .b(b), .c(c), .d(d), .select(select));initial begin// Initialize Inputsa = 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 hereend      endmodule
仿真结果:


我们可以发现只要是select[0]=1,不管别的位怎么样,它就是第一种情况。这个casez是顺序判断的。


casez和casex:casezcasex语句是case语句的两种变体在写testbench时用到,属于不可综合的语句。

1在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。

2 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是zx,那么这些位的比较就不予考虑。

比如:  

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;endendmodule


问题:
(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

 

0 0
原创粉丝点击