情绪型男人:Verilog语法有关casez和casex的分析

来源:百度文库 编辑:偶看新闻 时间:2024/05/07 04:56:13
  2009-04-21 22:05:21 | Verilog语法有关casez和casex的分析  

casez赋值问题

在casez的赋值中,如果是都满足,是只进行第一个赋值吗?是每回只判断一个符合就结束吗?
以下是一个例子:
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
   begin
     casez(select)
       4'b???1: out = a;
       4'b??1?: out = b;
       4'b?1??: out = c;
       4'b1???: out = d;
     endcase
   end
endmodule

//测试文件-----------------------------------------------------------------------------------------
module mux_casez(out,a,b,c,d,select);
output [1:0] out;
input [1:0] a,b,c,d;
input [3:0] select;
reg [1:0] out;
always @(select or a or b or c or d)
   begin
     casez(select)
       4'b???1: out = a;
       4'b??1?: out = b;
       4'b?1??: out = c;
       4'b1???: out = d;
     endcase
   end
endmodule

//以下是输出结果---------------------------------------------------------------------------------------------
#                    0 a=xx b=xx c=xx d=xx select=xxxx out=xx
#                   20 a=00 b=01 c=10 d=11 select=xxxx out=xx
#                   40 a=00 b=01 c=10 d=11 select=zzzz out=00            //(1)------------------
#                   60 a=00 b=01 c=10 d=11 select=xxx1 out=00
#                   80 a=00 b=01 c=10 d=11 select=xx1x out=01
#                  100 a=00 b=01 c=10 d=11 select=x1xx out=10
#                  120 a=00 b=01 c=10 d=11 select=1xxx out=11
# mach at least two of then
#                  140 a=00 b=01 c=10 d=11 select=xx11 out=00        //(2)----------------------------
#                  160 a=00 b=01 c=10 d=11 select=x1x1 out=00
#                  180 a=00 b=01 c=10 d=11 select=x111 out=00
#                  200 a=00 b=01 c=10 d=11 select=1111 out=00
# ** Note: $finish    : F:/IC/mux_casez/mux_casez_tb.v(35)

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