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

匿名 (未验证) 提交于 2019-12-02 23:55:01

case:在case语句中,敏感表达式与各项值之间的比较,是一种全等比较。每一位都必须相同才认为匹配。

casez:这种也可用于优先级电路。

         举个栗子:

  1. module no13(out,a,b,c,d,select
  2. );
  3. input wire a,b,c,d;
  4. input wire [3:0]select;
  5. output reg out;
  6. always@(a or b or c or d or select)
  7. begin
  8. casez(select)
  9. 4'b???1: out = a;
  10. 4'b??1?: out = b;
  11. 4'b?1??: out = c;
  12. 4'b1???: out = d;
  13. default: out = 1'b0;
  14. endcase
  15. end
  16. endmodule

仿真代码:

  1. module tb;
  2. // Inputs
  3. reg a;
  4. reg b;
  5. reg c;
  6. reg d;
  7. reg [3:0] select;
  8. // Outputs
  9. wire out;
  10. // Instantiate the Unit Under Test (UUT)
  11. no13 uut (
  12. .out(out),
  13. .a(a),
  14. .b(b),
  15. .c(c),
  16. .d(d),
  17. .select(select)
  18. );
  19. initial begin
  20. // Initialize Inputs
  21. a = 1;
  22. b = 0;
  23. c = 1;
  24. d = 0;
  25. select = 0;
  26. // Wait 100 ns for global reset to finish
  27. #100;
  28. select = 1;
  29. #100;
  30. select = 4'bzz10;
  31. #100;
  32. select = 4'bxx10;
  33. #100;
  34. select = 4'b1zzz;
  35. // Add stimulus here
  36. end
  37. endmodule
仿真结果:


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


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

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

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

比如:  

  1. casez (sel)
  2. 3b001: y=a+b;
  3. 3b010: y=a-b;
  4. 3b011: y=a&b;
  5. 3b100: y=a^b;
  6. default: y=3b000;

sel=01z的时候,由于最低位出现z,那么在比较判别时不考虑最低位,只与源比较前两位,那么出现与010,011均匹配的情况,此时由于case语句是按顺序检查的,所以先认为与010匹配,输出y=a-b

还有我有见过使用casez来实现优先级电路的实现:

  1. module priority_casez(input wire [3:0]a,
  2. output reg [3:0]y);
  3. always@(*) begin
  4. casez(a)
  5. 4'b1???: y = 4'b1000;
  6. 4'b01??: y = 4'b0100;
  7. 4'b001?: y = 4'b0010;
  8. 4'b0001: y = 4'b0001;
  9. default: y = 4'b0000;
  10. end
  11. 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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!